"Linux 内存页表创建详解" Linux 内存页表创建是 Linux 操作系统中一个非常重要的过程,涉及到物理内存、硬件IO、中断等多个方面。下面是对 Linux 内存页表创建的详细讲解。 内存页表的创建是在 Linux 内核代码执行到 start_kernel 函数后执行 paging_init 函数建立的。这两个函数的执行都是在系统启动的早期阶段,用于初始化物理内存和建立内存页表。 paging_init 函数的执行需要满足两个条件:一是 meminfo 已初始化,即初始化物理内存各个 node 的各个 bank;二是全局变量 init_mm 的代码段首尾、数据段首尾四个成员已初始化。这些初始化操作都是在 paging_init 函数前面的对 uboot 所传参数的解析中完成的。 paging_init 函数首先调用的是 build_mem_type_table 函数,这个函数的作用是给静态全局变量 mem_types 赋值,这个变量就在本文件(arch/arm/mm/mmu.c)定义。build_mem_type_table 函数里面是完全与本 arm 芯片自身体系结构相关的配置。 接下来,paging_init 函数调用的是 sanity_check_meminfo 函数,这个函数主要做两件事情:一是确定本设备物理内存的各个 node 各个 bank 中到底有没有高端内存,根据是否存在高端内存决定每个 bank 的 highmem 成员值;二是对于每个 bank 的正确性进行检测。 在 sanity_check_meminfo 函数中,对每个物理内存 bank 是否属于高端内存的判断是通过以下代码实现的:if (__va(bank->start) > VMALLOC_MIN || __va(bank->start) < (void *)PAGE_OFFSET)highmem = 1;即:该 bank 的物理内存起始虚拟地址大于 VMALLOC_MIN,或者小于 PAGE_OFFSET。 VMALLOC_MIN 是一个macro,它定义在 arch/arm/mm/mmu.c 文件中,表示 vmalloc 区域的起始虚拟地址。PAGE_OFFSET 是内核用户空间的交界,在这里定义为 0xc0000000,也就是 arm-linux 普遍适用值 3G/1G。 因此,一个 bank 的物理内存属于高端内存的条件是:1、起始地址不大于 vmalloc 区域的起始虚拟地址;2、起始地址不小于内核用户交界的虚拟地址;当属于高端内存时,该 bank 的 highmem 成员将置 1。 除了界定物理内存 bank 是否属于高端内存,sanity_check_meminfo 函数还对每个物理内存 bank 的正确性进行检测。这部分个人认为不是重点,主要注意下在存在高端内存情况下(代码中定义宏 CONFIG_HIGHMEM 情况下),若低端内存太大(起始位置在 VMALLOC_MIN之前,结尾位置超过 VMALLOC_MIN),则超过 VMALLOC_MIN 的部分将被算进另一个 bank并且判定为高端内存。 Linux 内存页表创建是一个复杂的过程,涉及到物理内存、硬件IO、中断等多个方面。只有正确地理解了这些概念,才能正确地使用 Linux 操作系统。
剩余21页未读,继续阅读
- aaaa13572015-09-02很难得还有这方面的资料
- 粉丝: 238
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python对文件名后缀名批量改名
- 基于Swin-Transformer和Unet 项目、自适应多尺度训练、多类别分割:眼镜分割实战
- 基于STM32-ESP826603的远程机房控制系统.zip
- Python爬虫对Boss直聘网站爬取数据
- 分布式驱动电动汽车复合制动控制策略,建立七自由度整车模型、魔术轮胎模型、电机模型、电池模型,研究上下层机电复合控制策略
- 基于SpringBoot及thymeleaf搭建的疫情信息管理系统高分项目+源码.zip
- 认识VLAN(虚拟局域网,Virtual Local Area Network)
- IMG_20241011_215804.jpg
- 基于Simulink的ABS仿真模型,采用PID控制策略的防抱死制动系统进行仿真分析
- 基于SpringBoot和Vue的餐馆点餐系统+高分项目+源码.zip