分段式内存管理
实验2中,我们默认操作系统有一个内核进程,一个用户进程。
内核在链接时通过
-Ttext 0x100000
指定程序的起始地址,同时bootloader
在加载时将内核进程加载到内存的0x100000
处,设置GDT中内核代码段和数据段的基址为0x0
,值得一提的是内核ss
也指向数据段,设置esp
为0x200000
。用户程序则不同,链接时指定程序起始地址为
0x0
,却加载到内存的0x200000
,这时虚拟地址到物理地址就只能通过段选择子和GDT
进行转换,所以设置代码段和数据段的段基址为0x200000
。这样在我们执行用户程序代码的时候,就是按照0x200000+eip
作为指令地址来访问。
后续实验用户多进程寻址应该采用实验2用户进程的方式,也就是说不管有多少用户进程,我们默认链接 时指定程序起始地址都是 0x0 (注意,这里是指链接!),但是加载到不同的内存地址,这样,对于用户程序就不必去考虑自身要加载到哪里!!!
在实验3中默认用户进程起始地址为 0x200000 (注意,这里是指加载!),每个进程占用 0x100000 大小的内存。通过设置不同的段基址来隔离用户进程在内存中的位置,这样理论上可以通过切换段选择子的值进行用户进程的切换。
challenge1:请发挥你的编码能力,在实验框架代码上设计一款虚拟内存管理机制。并说明你的设计(可以和上面的exercise结合,此题是bonus,不写不扣分~)。
Last updated