1、逻辑地址
创新互联建站专注于企业成都全网营销、网站重做改版、五家渠网站定制设计、自适应品牌网站建设、H5建站、商城网站制作、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为五家渠等各大城市提供网站开发制作服务。包含在机器语言指令中用来指定一个操作数或一条指令的地址
2、线性地址(虚拟地址)
32位无符号整数,可以用来表示高达4GB的地址,常用十六进制表示0x00000000——0xffffffff
3、物理地址
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示
内存控制单元(MMU)通过分段单元的硬件电路把一个逻辑地址转换为线性地址;分页单元的硬件电路把线性地址转换为物理地址
硬件中的分段
逻辑地址->段选择符+偏移量
段选择符 大小、字段
段描述符 大小、字段、类型、格式
快速访问段描述符
当一个段选择符被装入段寄存器时,相应的段描述符就装入到对应的非编程cpu寄存器。根据段选择符查找段描述内容时,就可以直接在上述非编程寄存器中找到对应段描述符,并不需要查找内存中的GDT或LDT,仅当段寄存器的内容有更改时,才有必要直接访问GDT或LDT。
GDT的大可包含2`13-1即8191个段描述符,因为GDT的第一项总设为0,为了确保空的段选择符即值为0的段选择符是无效的,所以少了一项。
分段单元
分段单元将一个逻辑地址转换为线性地址。
1、检查段选择符中的TI字段,确定段描述符是在GDT还是LDT中,并从相应寄存器中获取其线性基地址
2、从段选择符中的index字段计算段描述符的地址,基地址+index*8,即为段描述符的地址
3、找到对应的段描述符后,取出该描述符首字节的线性地址即base字段对应值与逻辑地址偏移量(低16位)相加,结果就是最终的线性地址。
ps:有了存放段描述符的非编程cpu寄存器,则可以省略1、2步骤,直接根据逻辑地址在上述寄存器中找到对应的段描述符进行第三步即可获得线性地址。
linux中的分段
分段和分页都可以划分进程的物理地址空间:分段可以给每一个进程分配不同的线性地址空间;分页可以把同一线性地址空间映射到不同的物理空间。linux更喜欢使用分页方式因为:
1、当所有进程使用相同的段寄存器值时,内存管理变得更简单,也就是说他们能共享同样的一组线性地址。
2、Linux设计目标之一是可以把它移植到大多数流行的处理器平台上。然而,RISC体系结构对分段的支持有限。
2.6版的Linux只有在80x86结构下才需要使用分段。
用户代码段、用户数据段、内核代码段、内核数据段
用户态或内核态下的所有进程可以使用相同的逻辑地址。linux下逻辑地址与线性地址是一致的,即逻辑地址的偏移量字段值与相应的线性地址的值总是一致。
CPU的当前特权级别(CPL)反应了进程是在用户态还是在内核态,并由存放在cs寄存器中的段选择符的RPL字段指定。只要当前特权级别被改变,一些段寄存器必须相应的更新。
当对指向指令或者数据结构的指针进行保存时,内核根本不需要为其设置逻辑地址的段选择符,因为cs寄存器就含有当前的段选择符。
Linux GDT
多处理器中每个cpu对应一个GDT。
每个GDT包含18个段描述符和14个空的、未使用的或保留的项。插入未使用的项的目的是为了使疆场一起访问的描述符能够处于同一个32字节的硬件告诉缓存行中。
除少数几种情况外,所有GDT副本都存放相同的表项:每个处理器都由自己的TSS段;GDT有少数项可能依赖于CPU正在执行的进程;处理器可能临时修改GDT副本里的某个项。
Linux LDT
大多数用户态下的Linux程序不使用局部描述符表,这样内核就定义了一个缺省的LDT供大多数进程共享。
用户态下的程序同样也利用modify_ldt()来分配新的段,但内核却从不使用这些段,也不需要了解相应的段描述符,因为这些段描述符被包含在进程自定义的局部描述符中了。