- 1、本文档共83页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chap9存储
* * * Linux系统地址映射示例 Linux最常见的可执行文件格式为elf(Executable and Linkable Format)。 程序执行时在物理内存中的实际地址,则由内核为其建立内存映射时临时分配,具体地址取决于当时所分配的物理内存页面。 0如何转化为物理地址? * 常规分页举例 假设内核给一个正在运行的进程p1分配的线性地址空间是00x2003ffff(256KB) 该段空间大小为0x40000,即0x40个页(64页) 有效的线性地址范围为 00010 0000 0000 0000 0000 0000 0000 0000b 页目录索引(0x80=128) 页表索引 (0x0=0) 0x20003ffff:0010 0000 0000 0011 1111 1111 1111 1111b 页目录索引 (0x80=128) 页表索引 (0x3f=63) * 常规分页举例 p1的页表和虚拟空间 0 1023 128 0 63 … 1023 p1的页目录 p1的页表 p1的页 p1的页 数据/代码 数据/代码 * 分页举例 假设进程需要读取0的字节 分页单元将该地址划分为3个部分 00010 0000 0000 0010 0001 0100 0000 0110b 当进程无论何时试图访问00x2003ffff范围之外的线性地址时,都将产生一个保护错误 页目录索引(0x80=128) 页表索引 (0x21) 页内偏移 (0x406) CR3 + p1的页目录 p1的页表 + Present=0 缺页异常 Xxx xxx Xx xxx Xx xx xxxx 3. Linux的分段模型 段描述符结构包括:段基址,段界限,段属性。 将一个逻辑地址映射到线性地址空间时,就是针对一个段中的地址,完成将所有地址进行从基址到基址+段界限中地址的转换,在转换中要不断地查询段描述符表。 * x86的平面地址 相对于“段寄存器/偏移量”的“层次”结构,符合以下条件的地址称为“平面(flat)地址” 每个段描述符的基地址设为0 每个段的长度设置为最大(4GB) Linux的内存管理采用平面地址,这是由gcc编译器决定的 平面地址并没有绕过段描述符、段寄存器这样的段式内存管理机制,而只是这一机制的一个应用特例 * X86的线性地址空间 线性地址 每个进程独自拥有的虚拟存储空间的地址 X86的线性由段选择符寄存器所指向的段描述符中规定的基地址(32bit)和段内偏移地址相加确定(32bit) 线性地址空间(又称进程空间) 线性地址所确定的空间为每个进程能够自己独立使用的存储空间,称为线性地址空间,或进程空间 X86的线性地址空间的大小为4G 线性地址空间依然是虚拟存储空间 操作系统的数据和代码被映射到所有进程的进程空间 Linux进程存储空间 分别用_USER_CS、_USER_DS、_KERNEL_CS、_KERNEL_DS 表示4个段选择宏,完成各个段的控制。每个段的线性地址空间都从0开始,这样将线性址和逻辑址对应,便于管理。每个进程都可获得4GB的线性空间: 进程在线性空间的布局 X86线性地址空间的划分 每个进程的线性地址空间被分成 系统区(0级) 用户区(3级) 系统区,用于存放操作系统的代码、数据和各种全局数据结构。 用户区,用于存放进程的代码、数据、堆栈以及进程的各种数据结构 Linux系统地址映射总结 IA32的MMU对程序中的虚拟地址先进行段式映射(虚拟地址转换为线性地址),然后才能进行页式映射(线性地址转换为物理地址) Linux采用分页存储管理。虚拟地址空间划分成固定大小的“页”,由MMU在运行时将虚拟地址映射(变换)成某个物理页面中的地址 Linux巧妙地使段式映射实际上不起什么作用 * Linux进程的分页机制 Linux的分段机制 所有进程使用相同的段寄存器值及线性地址空间(0~4G) Linux对进程的处理很大程度上依赖于分页 实际上,由硬件提供的MMU将线性地址自动转换为物理地址使得一下设计目标变得可行 给每个进程分配不同的物理地址空间,该机制可确保对寻址错误提供有效保护 区别页(即一组数据)和页框(实际的物理空间)之间的不同。这是虚拟存储器机制的基本因素 每个进程都有它自己的页全局目录和自己的页表集合 当进程切换发生时,Linux把CR3寄存器的值保存在跟进程相关的一个数据结构中,然后用另外一个进程相应的值填充CR3寄存器 当新进程恢复在CPU上执行时,分页单元将使用一组与新进程对应的页表 * Linux的分页模型 采用同时适用32位和64位系统的普通分
文档评论(0)