上一节创建了全局描述符表,进入了保护模式,接下来继续拓展loader的功能——实现内存分页,实现虚拟地址
目录
Q&A
1、什么是内存分段?为什么要实现内存分段?
分段就是cpu通过基地址+偏移来访问内存,想象有两个程序,编译链接后确定的起始地址是一样的,如果这就是运行时的物理地址,那么它们自然是无法在计算机中同时跑的,内存多大都不行,分段机制就是为了解决这个问题。
CPU采用段基址+偏移的方式访问内存,这样程序就可以通过改变段基址,实现程序的“平移”,这样两个在编译后起始地址相同的程序,通过段基址的不同,访问也不会发生冲突。
2、为什么要实现内存分页?分页和分段的关系?
内存分页是针对另一种情况,如下图:
此时计算机内存有空余共20+15=35MB,但却不能装载进程D,
因为内存空间被割裂了,35MB不是连续的,不能将进程D整块连续的装进内存。但是如果能实现进程的分块,就可以将进程D分成几块,装载进不连续的内存空间中,这就是进程的分页。
分页机制是在分段机制基础上实现的,x86体系结构访问内存段基址+偏移的形式是无法撼动的,只不过实现分页了以后段部件计算出的不再是物理地址,而是看成虚拟地址了。
3、分页机制的实现?什么是页表?“单位块”为什么是4KB?
分页机制的本质就是将进程拆分成单位大小的块,来进行加载。页表就是存储每个块映射关系的数据结构,存放在内存当中。那么单位大小究竟多大合适?
这取决于对内存块数量和内存块尺寸的权衡。内存块数量 * 内存块大小等于4GB(32位系统)。假设将内存块尺寸定为1字节,每一块的地址都需要用32位4字节来表示,那么一个进程的页表大小就是16GB,计算机不可能只有一个进程,因此需要将进程的块大小调大,最后决定是4MB,那么一个进程的页表的大小就是4MB(一级页表)。
4、为什么要有多级页表?
计算机不可能只有一个