图解CPU的内存管理——彻底讲透分段与分页
先总结,后看图:
本文引用地址:http://www.amcfsurvey.com/article/202007/415841.htm1、作为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)。
点击查看大图
评论