前言:
新版本的内核对于保存在IDTR寄存器中的IDT表地址使用的是内核固定映射线性地址,所以在这里再把内核中固定映射的寻址机制描述一下。
一、固定映射概念
内核线性地址第四个GB的初始部分映射系统的物理内存。但是至少128M的线性地址总是留作他用,因为内核使用这些线性地址实现非连续内存分配和固定映射的线性地址。
固定映射地址类似于常量线性地址,其对应的物理地址不必等于线性地址减去0xc0000000,而是可以以任意方式建立。因此每个固定映射的线性地址都映射一个物理内存的页框。
每个固定映射的线性地址都存放在线性地址第四个GB的末端。
二、固定映射线性地址
每个固定映射线性地址都有fixed_addresses结构中的索引来指定(只列出部分32位模式)。
enum fixed_addresses {
#ifdef CONFIG_X86_32
FIX_HOLE,
FIX_VDSO,
#else
VSYSCALL_LAST_PAGE,
VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE
+ ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
VVAR_PAGE,
VSYSCALL_HPET,
#ifdef CONFIG_PARAVIRT_CLOCK
PVCLOCK_FIXMAP_BEGIN,
PVCLOCK_FIXMAP_END = PVCLOCK_FIXMAP_BEGIN+PVCLOCK_VSYSCALL_NR_PAGES-1,
#endif
#endif
FIX_DBGP_BASE,
FIX_EARLYCON_MEM_BASE,
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
FIX_OHCI1394_BASE,
#endif
#ifdef CONFIG_X86_LOCAL_APIC
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
#endif
#ifdef CONFIG_X86_IO_APIC
FIX_IO_APIC_BASE_0,
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
#endif
#ifdef CONFIG_X86_VISWS_APIC
FIX_CO_CPU, /* Cobalt timer */
FIX_CO_APIC, /* Cobalt APIC Redirection Table */
FIX_LI_PCIA, /* Lithium PCI Bridge A */
FIX_LI_PCIB, /* Lithium PCI Bridge B */
#endif
FIX_RO_IDT, /* Virtual mapping for read-only IDT */
#ifdef CONFIG_X86_32
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
#ifdef CONFIG_PCI_MMCONFIG
FIX_PCIE_MCFG,
#endif
#endif
#ifdef CONFIG_PARAVIRT
FIX_PARAVIRT_BOOTMAP,
#endif
FIX_TEXT_POKE1, /* reserve 2 pages for text_poke() */
FIX_TEXT_POKE0, /* first page is last, because allocation is backward */
#ifdef CONFIG_X86_INTEL_MID
FIX_LNW_VRTC,
#endif
__end_of_permanent_fixed_addresses,
#define NR_FIX_BTMAPS 64
#define FIX_BTMAPS_SLOTS 4
#define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
FIX_BTMAP_END =
(__end_of_permanent_fixed_addresses ^
(__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
-PTRS_PER_PTE
? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
(__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
: __end_of_permanent_fixed_addresses,
FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
#ifdef CONFIG_X86_32
FIX_WP_TEST,
#endif
#ifdef CONFIG_INTEL_TXT
FIX_TBOOT_BASE,
#endif
__end_of_fixed_addresses
};
三、固定映射线性地址的映射
内核使用set_fixmap(idx,phys)和set_fixmap_nocache(idx, phys)来建立固定线性地址与物理地址的映射。通过clear_fixmap(idx)解除固定线性地址的映射。
//idx是fixed_addresses结构中的索引值,即指定固定线性地址,phys是物理地址
#define set_fixmap(idx, phys) __set_fixmap(idx, phys, PAGE_KERNEL)
//禁用硬件高速缓存
#define set_fixmap_nocache(idx, phys) \
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
#define clear_fixmap(idx) _set_fixmap(idx, 0, __pgprot(0))
//这两个函数都调用__set_fixmap函数,只是第二个禁用硬件高速缓存,这样线性地址到物理地址的转换不会保存在硬件高速缓存中(即TLB)。
static inline void __set_fixmap(enum fixed_addresses idx,phys_addr_t phys, pgprot_t flags)
{
native_set_fixmap(idx, phys, flags);
}
void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys,pgprot_t flags)
{
//phys >> PAGE_SHIFT:获得该物理地址所在物理内存中的页面序号,即页框号。
//pfn_pte函数根据flags标志设置该页表项的内容(列入设置为只读属性),然后返回该物理地址的回应的页表项。
__native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags));
}
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte)
{
//根据索引号获得该固定映射的线性地址
unsigned long address = __fix_to_virt(idx);
//是否超出固定映射线性地址的尾部索引号
if (idx >= __end_of_fixed_addresses) {
BUG();
return;
}
//用idt_table所在物理页框对应的页表项内容与固定映射的线性地址联系起来,即完成了映射
set_pte_vaddr(address, pte);
fixmaps_set++;//设置固定线性地址映射计数
}
//从固定映射线性地址的最大地址0xfffff000往下减就可得到该索引号对应的固定线性地址(间隔是一页的大小),其实也可以看出对于前边结构中连续的idx索引值,它能映射的空间都是一页的大小,即4K。
unsigned long __FIXADDR_TOP = 0xfffff000;
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
分享到:
相关推荐
处理器 115 10.1 X86 115 10.2 ARM 115 10.3 Alpha AXP处理器 115 第11章 Linux内核源代码 117 11.1 怎样得到Linux内核源码 117 11.2 内核源码的编排 117 11.3 从何处看起 118 第12章 Linux...
Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 什么是操作...
"Professional Linux Kernel Architecture"提供了对Linux内核的详细解析,包括以下内容: 内核基础知识:介绍Linux内核的基本概念、组成部分和体系结构,包括进程管理、内存管理、设备驱动、文件系统等。 内核源...
介绍ARM9的linux内核的地址映射过程,以及建立虚拟内存的过程和基本思想
第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 ...
linux内核编程 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 ...
这只是一个从Linux内核解析信息的前端工具。 用法 cat / sys / kernel / debug / extfrag / bitmap_show或cat / d / extfrag / bitmap_show 运行此命令以分析从步骤1获得的信息。 在一张位图图片中显示免费页面。
1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................
第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 ...
目录:页表管理 内核页表 物理内存 高端内存 地址映射 虚拟内存 地址空间 高速缓存 页框回收 交换机制 缺页异常 共享内存 文件映射 程序执行
第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 ...
我们实现了一个开放源代码冲突解决框架,该框架包括一个自动解决防火墙规则异常的用户空间C应用程序,以及b)作为Linux内核模块实现的通用树(称为策略树),该模块维护已解析的防火墙规则并启用必要的钩子到...
第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 ...
第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 1.1.5 地址空间 9 1.1.6 时钟 9 1.2 软件基础 9 1.2.1 计算机语言 9 1.2.2 ...
2.3.2 内核参数选项 8 2.3.3 安装程序 9 2.3.4 选择一种安装方法 9 2.3.5 光盘安装 10 2.4 硬件配置 14 2.4.1 选择鼠标 14 2.4.2 配置X Window系统 14 2.4.3 配置网络 14 2.4.4 设置时区 15 2.4.5 选择服务自动启动 ...