09|Intel 内存管理两板斧:分段与分页
闪客
你好,我是闪客。
这一讲,我们看一个特别重要的东西,即 CPU 是如何管理内存的?当然,我们聊的是最最基础和底层的管理手段——分段和分页。
分页机制如何开启
上一讲咱们说到,head.s 代码在重新设置了 gdt 与 idt。之后,我们就会看到这样一段代码:
也就是开启分页机制,并且跳转到 main 函数。如何跳转到之后用 c 语言写的 main.c 里的 main 函数,是个有趣的事,也包含在这段代码里。
不过,我们先瞧瞧这分页机制是如何开启的,也就是 setup_paging 这个标签处的代码。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入浅出地介绍了CPU内存管理的基础知识,主要围绕分段和分页两大内存管理手段展开讨论。首先介绍了分页机制的开启过程,包括设置页目录表和页表,以及改变CR0寄存器的值来开启分页机制。接着详细解释了分页机制的变换过程,包括线性地址的拆分和通过页目录表和页表进行转换的过程。文章还提到了MMU的作用,即将虚拟地址转换为物理地址。最后,通过代码示例展示了如何设置页表,并将线性地址空间与物理地址空间一一对应起来。整体来说,本文通过深入浅出的方式,让读者快速了解了CPU内存管理的基础知识,特别是分段和分页的技术特点。文章还介绍了逻辑地址、线性地址、物理地址和虚拟地址之间的关系,为读者提供了全面的内存管理知识。
该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
请先通过赠一得一解锁课程
赠一得一
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- 果果文中说:分段机制在之前几回已经讨论过多次了,其目的是为每个程序或任务提供单独的代码段(cs)、数据段(ds)、栈段(ss),使其不会相互干扰。 可是每个程序所访问内存的时候不都是访问的同一个数据段ds寄存器吗,gdt表项各个进程都是访问的同一个表项,那这样怎么能做到不相互干扰呢?除非每个进程有他自己的GDT表项,然后基地址不同。
作者回复: 进程在内核态使用的是 GDT,在用户态使用的是 LDT,LDT 里的数据段和代码段每个进程都是相互隔离的,互不干扰。 另外,在高版本 Linux 中,使用的是平台模型,即描述符表项的基地址都是零,相当于不再分段了,是通过虚拟内存也就是页表来达到进程隔离。 这里讨论的是,CPU 本身设置分段基址,其中之一的目的是使得不同代码片内存相互隔离,至于操作系统怎么用,那就很灵活了,一般都是使用平坦模型。
2022-11-04归属地:北京7 - Geek_c0b245你好,我想请问一下这句话:“根据页目录项的格式,表示页表地址为 0x1000,页属性为 0x07。”代码里mov操作把0x00001007直接复制到PDE里面,根据PDE格式,第12位为1,其余高位应该为0,那么不是应该表示的是对应的page table的物理地址为0x00001吗?为什么是0x1000呢?
作者回复: 物理页单位是 4K
2022-11-25归属地:北京32 - 姚雷作者你好, 15M=0000000011_0100000000_000000000000 这个是不是不对啊? 应该是15M=0000000011_1100000000_000000000000?2022-12-30归属地:陕西22
- 龍蝦根据页目录项的格式,表示页表地址为 0x1000,页属性为 0x07。 应该是 根据页目录项的格式,表示页表地址为 0x1,页属性为 0x07。2023-08-17归属地:江苏
- tanatang每个页表有1024个页表项,页表1到页表3的存放地址是 0x1000,0x2000,0x3000,0x4000. 为什么一个页表的存储空间是 0x1000呢?相当于一个页表项的存储空间是 4bit? 是怎么存储的?2023-03-14归属地:四川
- 一塌糊涂cr3 寄存器存储的是 物理地址吧 , GDTR 寄存器里面保存的是线性地址吗? 还有ldtR2023-02-27归属地:北京
收起评论