Linux内核中提供了一段虚拟地址用于固定映射,也就是fixed map。

固定映射的线性地址(fix-mapped linear address)是一个固定的线性地地址,它所对应的物理地址 不是通过简单的线性转换得到的,而是人为强制指定的。每个固定的线性地址都映射到一块物理内存 页。固定映射线性地址能够映射到任何一页物理内存。

固定映射线性地址是从整个线性地址空间的最后4KB即线性地址0xfffff000向低地址进行分配的。在最 后4KB空间与固定映射线性地址空间的顶端空留一页(未知原因),固定映射线性地址空间前面的地址 空间叫做vmalloc分配的区域。在vmalloc分配区域和固定线性地址映射空间之间同样保留一空页。所以 固定映射线性地址空间的顶端地址是0xffffe000, 即#define FIXADDR_TOP (0xffffe000UL) __end_of_fixed_addresses 是固定映射线性地址区域的页数。那么固定映射线性地址空间的大小就是 #define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT), 它的起始地址就是 #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE), 内核使用一个小整数代替指针来访问固定线性地址空间的内存,这个小整数可看着索引页的索引,索引越 小越靠近顶端。定义了两个宏用来进行索引和线性地址的相互转换。 #define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) #define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) __fix_to_virt用于将索引转换成线性地址。__virt_to_fix用于将线性地址转换成索引。 可以通过set_fixmap(idx,phys)和set_fixmap_nocache(idx,phys)宏关连一个索引和页物理内存。 clear_fixmap(idx)清除索引和物理地址的关连。

对于 FIXADDR_TOP 的值随CPU的不同而不同。要根据具体的CPU进行相应的设置。

Logo

更多推荐