我正在学习专业Linux内核架构,我在第三章内存管理中。在研究内核地址空间的同时,将其划分为直接映射区域、vmalloc区域、kmap区域和固定映射区域。

我想知道的是如下所示。
32位函数paging_init
void __init pageit_init(void){
pagetable_init();
__flush_tlb_all();
kmap_init();
olpc_dt_build_devicetree();
sparse_memory_present_with_active_regions(MAX_NUMNODES);
sparse_init();
zone_sizes_init();
}但是在64位中,我无法在寻呼_初始化函数中找到与内核页表相关的函数.
void __init paging_init(void)
{
sparse_memory_present_with_active_regions(MAX_NUMNODES);
sparse_init();
node_clear_state(0, N_MEMORY);
if (N_MEMORY != N_NORMAL_MEMORY)
node_clear_state(0, N_NORMAL_MEMORY);
zone_sizes_init();
}64位内核没有主内核页表吗?如果是真的,那么它仅仅是通过直接映射访问内核内存吗?
发布于 2017-12-20 20:22:47
问题1和问题2的答案:不,一旦启用分页,CPU指令只使用虚拟地址,在读取或写入RAM之前使用MMU将虚拟地址转换为物理地址。__va和__pa宏不访问内存,它们只是在地址空间之间转换地址。在32位计算机上,__va只是将0xc0000000添加到作为参数的物理地址中,因为映射已经设置,因此物理地址N位于虚拟地址N+0xc0000000。
您想要用CPU访问的地址必须有一个映射;您不能绕过MMU。因此,仅管理128 MB的映射是不够的。
https://unix.stackexchange.com/questions/412100
复制相似问题