分段式内存管理

实验2中,我们默认操作系统有一个内核进程,一个用户进程。

  • 内核在链接时通过 -Ttext 0x100000 指定程序的起始地址,同时 bootloader 在加载时将内核进程加载到内存的 0x100000 处,设置GDT中内核代码段和数据段的基址为 0x0 ,值得一提的是内核 ss 也指向数据段,设置 esp0x200000

  • 用户程序则不同,链接时指定程序起始地址为 0x0 ,却加载到内存的 0x200000 ,这时虚拟地址到物理地址就只能通过段选择子和 GDT进行转换,所以设置代码段和数据段的段基址为 0x200000 。这样在我们执行用户程序代码的时候,就是按照 0x200000+eip 作为指令地址来访问。

后续实验用户多进程寻址应该采用实验2用户进程的方式,也就是说不管有多少用户进程,我们默认链接 时指定程序起始地址都是 0x0 (注意,这里是指链接!),但是加载到不同的内存地址,这样,对于用户程序就不必去考虑自身要加载到哪里!!!

在实验3中默认用户进程起始地址为 0x200000 (注意,这里是指加载!),每个进程占用 0x100000 大小的内存。通过设置不同的段基址来隔离用户进程在内存中的位置,这样理论上可以通过切换段选择子的值进行用户进程的切换。

exercise2:请简单说说,如果我们想做虚拟内存管理,可以如何进行设计(比如哪些数据结构,如何管理内存)?

Last updated