首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核地址空间和内核页表

内核地址空间和内核页表
EN

Unix & Linux用户
提问于 2017-12-20 19:01:44
回答 1查看 3.3K关注 0票数 2

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

我想知道的是如下所示。

  1. 32位机内核地址空间的直接映射区(896 be )可以通过__va、__pa等函数访问吗?
  2. 如果1为真,那么主内核页表(Swapper_pg_dir)只管理128 is?
  3. 在研究内核代码时,我发现32位和64位之间的paging_init函数不同。在32位中,我在pagetable_init函数中找到了初始化内核页表和主内核页表的寻呼_初始化函数.

32位函数paging_init

代码语言:javascript
复制
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位中,我无法在寻呼_初始化函数中找到与内核页表相关的函数.

代码语言:javascript
复制
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位内核没有主内核页表吗?如果是真的,那么它仅仅是通过直接映射访问内核内存吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2017-12-20 20:22:47

问题1和问题2的答案:不,一旦启用分页,CPU指令只使用虚拟地址,在读取或写入RAM之前使用MMU将虚拟地址转换为物理地址。__va__pa宏不访问内存,它们只是在地址空间之间转换地址。在32位计算机上,__va只是将0xc0000000添加到作为参数的物理地址中,因为映射已经设置,因此物理地址N位于虚拟地址N+0xc0000000

您想要用CPU访问的地址必须有一个映射;您不能绕过MMU。因此,仅管理128 MB的映射是不够的。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/412100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档