8.1.6.2 临时映射(temporary kernel mappings)
临时映射比永久映射更易实现;而且,它能用在中断处理和延时函数里,因为请求一个临时映射永远不会阻塞当前进程。
高端内存的每一个页帧(page frame)都可以通过内核地址空间的一个窗口映射进来,所谓窗口,即专为临时映射而保留的页表项(Page Table entry)。用于临时映射的窗口数量很少。
每个cpu拥有13个窗口,由数据结构enum km_type所描述。结构体内的每个符号都标识出一个窗口的线性地址,例如KM_BOUNCE_READ,KM_USE0,或KM_PTE0。
内核必须保证两条内核控制路径(kernel control path)不会同时使用一个窗口。这样,km_type结构体内的每个符号都被一项内核功能(kernel component)所专用,这些符号也正是以所对应的功能而命名的。最后一个符号是KM_TYPE_NR,它本身并不表示一个线性地址,而是产生每个cpu所使用的窗口数1。
enum fixed_addresses结构体内含有符号FIX_KMAP_BEGIN和FIX_KMAP_END,后者被赋以初值FIX_KMAP_BEGIN + (KM_TYPE_NR + NR_CPUS) - 1。这样,系统内的每个cpu就各自拥有了KM_TYPE_NR个固定映射型(fixed-mapped)线性地址。而且,内核算出线性地址fix_to_virt(FIX_KMAP_BEGIN)所对应的页表项2的地址值,并用它初始化kmap_pte这个变量。
注释:
1,原句是"but yields the number of different windows usable by CPU",陈(陈莉君)版译作:但由每个cpu用来产生不同的可用窗口数,我怀疑译错了:前面说过“每个cpu拥有13个窗口”。原句的different是形容windows的,我没有译它。
2,前面说过内核页表上有一连串窗口,这句话所说的”页表项“指的就是这一连串窗口中的第一个窗口。
阅读(984) | 评论(0) | 转发(0) |