zoukankan      html  css  js  c++  java
  • 【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)

    2.1 内存地址

    • 逻辑地址:段+偏移
    • 线性地址(虚拟地址)
    • 物理地址

    2.2硬件中的分段

    2.2.1 段选择符和段寄存器

    15                                                3  2  1   0
    ------------------------------------------------
    |                                                    |TI |RPL  |
    |         索引号                                  |    |       |
    ------------------------------------------------
    TI = 表指示器

    RPL = 请求者特权级

    段寄存器的唯一目的是存放段选择符。这些段寄存器称为CS,SS,DS,ES,FS和GS。

     2.2.2段描述符

    每个段由一个8字节的段描述符表示,它描述了段的特征。段描述符放在全局描述符表(GDT)或局部描述符表(LDT)中。

    通常只定义一个GDT,而每个进程除了存放在GDT中的段之外如果还需要创建附加的段,就可以有自己的LDT。GDT在主存中的地址和大小存放在gdtr控制寄存器中,当前正在被使用的LDT地址和大小放在ldtr控制寄存器中。

    Linux中广泛采用的类型有:

    • 代码段描述符
    • 数据段描述符
    • 任务状态段描述符:表示这个段描述符代表一个任务状态段(Task State Segment,TSS),也就是说这个段用于保存处理器寄存器的内容。
    • 局部描述符表描述符:这个段描述符代表一个包含LDT的段,它只出现在GDT中。

    2.2.3 快速访问段描述符

    为了加速逻辑地址到线性地址的转换,80x86处理器提供一种附加的非编程的寄存器(一个不能被程序员所设置的寄存器),供6个可编程的段寄存器使用。每一个非编程的寄存器含有8个字节的段描述符,由相应的段寄存器中的段选择符来指定。每一个段选择符被装入段寄存器时,相应的段描述符就有内存装入到对应的非编程CPU寄存器。

    2.2.4 分段单元

    2.3 Linux中的分段

    运行在用户态的所有Linux进程都使用一对相同的段来对指令和数据寻址,用户代码段和用户数据段。类似,运行在内核态的所有Linux进程都是用一对相同的段对指令和数据寻址:他们分别叫做内核代码段和内核数据段。

    2.3.1 Linux GDT

    在单处理器系统中只有一个GDT,而在多处理器系统中每个CPU对应一个GDT。

    每一个GDT中包含的18个段描述符指向下列的段:

    • 用户态和内核态下的代码段和数据段共4个。
    • 任务状态段(TSS),每一个处理器有一个。
    • 1个包括缺省局部描述符表的段,所有进程共享。
    • 3个局部线程存储段(Thread-Local Storage, TLS):这种机制允许多线程应用程序使用最多3个局部于线程的数据段。
    • 与高级电源管理(APM)相关的3个段。
    • 与支持即插即用(PnP)功能的BIOS服务程序相关的5个段。
    • 被内核用来处理“双重错误"异常的特殊TSS段。

    2.3.2 Linux LDT

    2.4 硬件中的分页

    分页单元吧线性地址转化成物理地址。

    2.4.1 常规分页

    32位线性地址被分成3个域:

    • Directory(目录)最高10位
    • Table(页表)中间10位
    • Offset(偏移量)最低12位

    正在使用的页目录的物理地址存放在控制寄存器cr3中。

    页目录项和页表项有同样的结构,每项都包含下面的字段:

    • Present标志
      • 如果被置为1,所指的页或页表就在主存中;为0,则不在。如果执行一个地址转换所需的页表项或页目录项中的Present标志被清零,那么分页单元就把该线性地址存放在控制寄存器cr2中,并产生14号异常:缺页异常。
    • Field包含页框物理地址最高20位的字段‘
      • 由于每一个页框有4KB的容量,他的物理地址必须是4096的倍数,因此物理地址的最低12位总是0.如果这个字段指向一个页目录,相应的页框就含有一个页表;如果它指向一个页表,相应的页框就含有一页数据。
    • Accessed标志
      • 每当分页单元对相应页框进行寻址时就设置这个标志。当选中的页被交换出去时,这一标志就可以由操作系统使用。分页单元从来不重置这个标志,而是必须由OS去做。
    • Dirty标志
      • 只应用于页表项。每当对一个页框进行写操作时,就设置这个标志。
    • Read/Write标志
      • 含有页或页表的存取权限。
    • User/Supervisor标志
      • 含有访问页或页表所需的特权级。
    • PCD和PWT标志
      • 控制硬件高速缓存处理页或页表的方式。
    • Page Size标志
      • 只应用于页目录项。如果置为1,则页目录项指的是2MB或4MB的页框。
    • Global标志
      • 只应用于页表项。这个标志用来放置常用页从TLB高速缓存中刷新出去。只有在cr4寄存器的页全局启用(Page Global Enable, PGE)标志置位时这个标志才起作用。
  • 相关阅读:
    PC端圣诞树下载
    win7开机一直在正在启动windows界面怎么办?
    EFI、UEFI、MBR、GPT的区别
    进入BIOS中,设置U盘启动
    CSS3摆动动画效果
    比特币钱包搭建与使用
    自动校时工具
    windows7蓝屏0x000000c4
    如何使用webpack打包你的项目
    开源货币/比特币Multiminer、bitrade、bitcoinjs-lib、python-bitcoinrpc介绍
  • 原文地址:https://www.cnblogs.com/wisehead/p/3819203.html
Copyright © 2011-2022 走看看