Linux0.11 源码趣读
闪客
低并发编程公号作者
18650 人已学习
赠一得一
课程目录
已完结/共 22 讲
Linux0.11 源码趣读
15
15
1.0x
00:00/00:00
登录|注册

09|Intel 内存管理两板斧:分段与分页

你好,我是闪客。
这一讲,我们看一个特别重要的东西,即 CPU 是如何管理内存的?当然,我们聊的是最最基础和底层的管理手段——分段和分页。

分页机制如何开启

上一讲咱们说到,head.s 代码在重新设置了 gdt 与 idt。之后,我们就会看到这样一段代码:
jmp after_page_tables
...
after_page_tables:
push 0
push 0
push 0
push L6
push _main
jmp setup_paging
L6:
jmp L6
也就是开启分页机制,并且跳转到 main 函数。如何跳转到之后用 c 语言写的 main.c 里的 main 函数,是个有趣的事,也包含在这段代码里。
不过,我们先瞧瞧这分页机制是如何开启的,也就是 setup_paging 这个标签处的代码。
setup_paging:
mov ecx,1024*5
xor eax,eax
xor edi,edi
pushf
cld
rep stosd
mov eax,_pg_dir
mov [eax],pg0+7
mov [eax+4],pg1+7
mov [eax+8],pg2+7
mov [eax+12],pg3+7
mov edi,pg3+4092
mov eax,00fff007h
std
L3: stosd
sub eax,00001000h
jge L3
popf
xor eax,eax
mov cr3,eax
mov eax,cr0
or eax,80000000h
mov cr0,eax
ret
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
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归属地:北京
    3
    2
  • 姚雷
    作者你好, 15M=0000000011_0100000000_000000000000 这个是不是不对啊? 应该是15M=0000000011_1100000000_000000000000?
    2022-12-30归属地:陕西
    2
    2
  • 龍蝦
    根据页目录项的格式,表示页表地址为 0x1000,页属性为 0x07。 应该是 根据页目录项的格式,表示页表地址为 0x1,页属性为 0x07。
    2023-08-17归属地:江苏
  • tanatang
    每个页表有1024个页表项,页表1到页表3的存放地址是 0x1000,0x2000,0x3000,0x4000. 为什么一个页表的存储空间是 0x1000呢?相当于一个页表项的存储空间是 4bit? 是怎么存储的?
    2023-03-14归属地:四川
  • 一塌糊涂
    cr3 寄存器存储的是 物理地址吧 , GDTR 寄存器里面保存的是线性地址吗? 还有ldtR
    2023-02-27归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部