集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1124|回复: 3

图解CPU的内存管理——彻底讲透分段与分页

[复制链接]
zxopenljx 发表于 2020-7-26 11:41:16 | 显示全部楼层 |阅读模式
本帖最后由 zxopenljx 于 2020-7-26 11:45 编辑

先总结,后看图:
1、作为OS的基础,CPU能支持什么内存访问模型,OS就必须跟随;
2、Intel CPU支持分段与分页两种模型;
3、Intel CPU的访存模型是先分段再分页的模式,所以涉及到从逻辑地址->线性地址->物理地址的转换;这部分在CPU的MMU模块中由电路实现;
4、逻辑地址为程序二进制的地址,是偏移量的形式存在,是个相对地址;这部分跟分段模型紧密相关;分段模型负责将CPU拿到的逻辑地址(主要是几个寄存器的值,GDTR,CD,DS,SS)转成一个线性地址(线性地址由OS生成);
5、分页模型就继续接着分段模型生成的线性地址得到相应的物理地址;
5.1、分段靠GDT(LDT),分页靠(页目录与页表),这些表都是在内存中,OS在启动过程中会分配;那么你可能会问,OS在启动的时候没有段表与页表之前怎么访问内存?CPU还支持更古老的实模式访问内存(程序中写死物理地址的程序),8080就是这样的东西,所以OS启动的时候也会用古老的方式启动,然后逐步进化成现代的方式;
5.2、Linux为了兼容不同的CPU,抛弃了Intel的分段模型,但是如果运行在X86平台又必须要有GDT,怎么办?Linux干脆写死,所有进程的分段地址都是00000000,所有程序ELF格式的偏移量都是被定制化的;
6、分页与分段模型不是设计出来的,是历史原因造就。早期的CPU能力不强如(8086,80X86)等等,但是实现了保护模式(就是可以跑多进程),但是支持的进程数不多,所以分段模型足够了;所以GDT这个表被设计成一个数组;后来intel设计出越来越强大的CPU,一直到多核CPU,那么,支持的进程数可以说几十上百倍的增长,所以数组不行了;引入链表形式的——页表来管理内存映射,但是CPU是向下兼容的,所以哪怕是intel最先进的CPU也是有分段模型的;所以分页到分段是历史造就,不是设计出来的,不要太过探究它的原因;
7、分页与分段的优劣,可以看做是链表与数组的特点之争;分段模型自然就是速度快,但是不灵活(只能支持少量的进程);分页模型就是效率低,但是足够灵活(支持大量的进程);所以CPU引入了缓存——TLB;
8、TLB与CacheLine其实一个东西(电路层),支持缓存行数据结构中的标记与组号的位数不同而已(在图中有详解)。
9、总结下,CPU在执行一个指令的时候,需要从内存获得数据,那么就需要通过地址线访问内存,为了得到指令所在内存的物理地址,需要走分段模型——将逻辑地址转为线性地址(虚拟地址),然后通过分页单元将线性地址转为物理地址;
10、CPU中的两个Cache,因为访问内存成本逐级增高,所以在逻辑地址转为线性地址过程中为了少访问内存,使用了TLB组关联高速缓存;而得到物理地址后,为了不访问内存,CPU内部还有L1-L3级缓存(Cacheline)。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
zhangyukun 发表于 2020-7-26 21:20:30 | 显示全部楼层
图解CPU的内存管理——彻底讲透分段与分页
 楼主| zxopenljx 发表于 2023-11-16 17:20:39 | 显示全部楼层
图解CPU的内存管理——彻底讲透分段与分页
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-8 02:15 , Processed in 0.070158 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表