linux 更倾向于使用分页方式,不怎么喜欢使用分段,
分段可以给美国进程分配不同的线性地址空间,分页可以把同一个线性地址隐射到不同的物理地址(这跟linlux的分页机制有关)
因为这样更容易跨平台,但是由于分段是硬件就支持的,linux还是使用了分段;
用户代码段
用户数据段
内核代码段
内核数据段
关注的Base字段都是0x00000000,G位为1,用户态的DPL为3(最小优先级),内核态的DPL为0(最高优先级)
G为粒度标志,1代表以4K为单位
这样不管是用户态以及内核态就能寻址2的32次方-1的地址,4G。
不管是用户态以及内核态的所有进程的逻辑地址是一样的。
这样linux的逻辑地址跟线性地址是一致的,即逻辑地址中的32偏移量的值与最后转换出来的线性地址的值是一样的。
当发生内核态跟用户态的切换时,其实CPU的当前特权级CPL也会相应的改变,CPL=3为用户态,CPL=0为内核态,其CPU的cs,ds,ss都会相应的装入段选择符。
由于linux的逻辑地址跟线性地址是一致的,这样就方便很多,例如执行某个指令时,仅制定逻辑地址的偏移地址即可,不用指定段选择符,因为当前的cpu对应的寄存器就默认是对应的段描述符,
分段可以给美国进程分配不同的线性地址空间,分页可以把同一个线性地址隐射到不同的物理地址(这跟linlux的分页机制有关)
因为这样更容易跨平台,但是由于分段是硬件就支持的,linux还是使用了分段;
用户代码段
用户数据段
内核代码段
内核数据段
关注的Base字段都是0x00000000,G位为1,用户态的DPL为3(最小优先级),内核态的DPL为0(最高优先级)
G为粒度标志,1代表以4K为单位
这样不管是用户态以及内核态就能寻址2的32次方-1的地址,4G。
不管是用户态以及内核态的所有进程的逻辑地址是一样的。
这样linux的逻辑地址跟线性地址是一致的,即逻辑地址中的32偏移量的值与最后转换出来的线性地址的值是一样的。
当发生内核态跟用户态的切换时,其实CPU的当前特权级CPL也会相应的改变,CPL=3为用户态,CPL=0为内核态,其CPU的cs,ds,ss都会相应的装入段选择符。
由于linux的逻辑地址跟线性地址是一致的,这样就方便很多,例如执行某个指令时,仅制定逻辑地址的偏移地址即可,不用指定段选择符,因为当前的cpu对应的寄存器就默认是对应的段描述符,