对分页,分段的一些理解

分段 是处理器固有 机制,即使是平坦模型也需要 段地址+偏移量 形成线性地址。
分段好处:
1.8086 16位地址只能访问64k,但是为了访问1mb内存,出现了分段,段地址*16+偏移地址 = 20位地址【这是为什么要分段】
2. 重定位。 在程序头存放至程序的大小,入口点,程序各个段的位置。系统重定位后更换这里的段描述符。
3.段保护 。 rpl,cpl,dpl就是为了保护段间转移,防止程序访问高特权级的段。 【对于3个pl我说说我的理解,rpl是段选择子的最后2位,可以表示0-3,表示的就是计算机的特权级。cpl表示的是当前的程序的特权级,是cs寄存器中选择子的最后两位。实际上大多数rpl=cpl。一会说为什么。dpl是段描述符的中间某两位,表示的同样是特权级。访问的规则是rpl和cpl的值需要同时小于dpl才能访问该描述符。关于为什么需要rpl,因为调用门的存在,3特权级为了实现一些高特权0的代码需要使用调用门,可以理解为系统调用。这时候程序的cpl就是0,这时就能访问dpl为 0的段描述符,这是不对的。但是这个程序的rpl还是3,记录着使用调用门之前程序的特权。所以,rpl和cpl同时使用】

【对于其中的段选择子,段描述符这些知识需要好好看看计算机体系结构,我这里一两句话说不清,简单告诉你。段描述符8字节里面存放着段的基本信息,计算机需要使用段描述符访问段,而选择子就是段描述符在LDT/GDT中的位置或者说偏移。cs,ds等寄存器需要使用选择子来访问,而不是16位模式下的地址】

分页之后不再采用分段的 程序组织形式。程序被分为节,为的是相同部位有相同的访问权限。(.text 只有执行权限)【可以看看《程序员的自我修养》里面对各个节的介绍很详细】
32位中所有段的起始地址都是0 ,实际使用的段界限是0xFFFFFFFF 不能再享受段保护。
分页模式后,将不会享受段带来的重定位,因为段地址都是0x00000000,段地址+偏移量计算不出线性地址。需要用户程序提供重定位表。     

这些基础知识需要阅读一些东西才能了解,但是不要以为这些不重要。在内核和虚拟化学习中这些知识对你非常重要,这里的一点东西是我近1年阅读东西的一点积累,写出来虽然不多,但是总算融会贯通了。

推荐几本书 《x86汇编语言 从是模式到保护模式-李忠》【理解计算机体系结构】
《程序员的自我修养》【程序的链接、装载 库】 这些都是学习os内部和虚拟化的基础。

你可能感兴趣的:(分页,分段,cpl,DPL,RPL)