zoukankan      html  css  js  c++  java
  • 深入理解linux内核读书笔记1

    第二章 内存寻址

    物理地址 logical address

             由段地址(segment)和偏移量(offset)构成。

    线性地址/虚拟地址 linear/virtual address

             32位无符号整数0x0000 0000 – 0xffff ffff 寻址4GB。

    物理地址 physical address

             32位或36位无符号整数表示。

             内存控制单元(Memorty Management Unit/MMU)通过一种称为分段单元(Segmentation Unit)的硬件电路把一个逻辑地址转换成线性地址;接着,第二个称为分页单元(Paging Unit)的硬件电路吧线性地址转换成一个物理地址。

    附录一(linux完整的启动过程):------------------------------------------插播新闻

    1)BIOS(Basic Input/Output System)

    实模式地址的寻址

    实模式的物理地址=逻辑地址*10H+偏移量

    BIOS实现了四个操作:

             1POST(Power-On Self-Test)上电自检

             2初始化硬件

             3搜索操作系统

             4找到有效的设备(拷贝引导扇区的内容到RAM)

    2)引导装入程序(Boot Loader)

    3)从磁盘启动linux

    Linux引导装入程序(LILO/Linux LOader)

    GRUB(GRand Unitfied Bootloader)比LILO更为先进,识别多个文件系统

    此处简介LILO引导过程

             1BIOS Loading

             2内核映像的第一个512B存入RAM中的0x0009 0000开始的位置

       setup()存入0x0009 0200开始的位置

       3调用BIOS过程从磁盘装载其余内核映像

       低地址0x0001 0000存放make zImage映像

       或 高地址0x0010 0000存放make bzImage映像(防止ISA黑洞)

       4跳转setup()

    4)setup()函数

             Setuo函数的汇编代码存放在offset 0x200处

             Setup()函数必须初始化计算机中的硬件设备,并为内核程序的执行建立环境

             BIOS已经初始化了一次,但是linux不依赖于BIOS,故以自己的方式重新初始化设备以增强移植性和健壮性。

             Setup()函数的本质如下

             1调用BIOS例程

             2设置键盘重复延时和速率

             3初始化视频卡

             4重新初始化磁盘控制器并检测硬盘参数

             5检查IBM微通道总线(MCA)

             6检查PS/2指针设备

             ……

             15……

    5)startup_32()函数

    6)start_kernel()函数 ------------------------------------------------------------新闻插播结束

    硬盘中的分段

             从80286模型开始,Intel微处理器以两种不同的方式执行地址转换,这两种方式分别是实模式(Real Mode)和保护模式(Protected Mode)

             一个逻辑地址用两部分组成:一个段标识符和一个指定段相对地址的偏移量

             段标识符是一个16位长的字段,成为段选择符(Segment Selector)

             而偏移量是一个32位长的字段

    段描述符

             每个段都是由8字节(64位)的段描述符(Segment Descriptor)表示的

             段描述符放在全局描述符表(GDT/Global Descriptor Table)或局部描述符表(LDT/Local Descriptor Table)中

             GDT在贮存中的地址和大小存放在gdtr控制寄存器中,当前正在被使用的LDT的地址和大小存放在ldtr控制寄存器中。

    段描述符 Segment Descriptor        :               偏移地址  offset

    D15-------D3    D2    D1-------D0     :               D31-------------------------------D0

      Index          TI          RPL

      |       |            0      0  内核态               |

      |       |       0      1  linux不使用            |

      |       |        1      0  linux不使用             |

      |       |        1      1  用户态              |

      |       |                          |

      |       |——Table Index                   |

      |       |——0-GDT 1-LDT                  |

      |       |                           |

      | * 8  +     D63-------------D0(gdtr/ldtr)             |

         |=                              |

         |                                                                             |

         |                                                                             |

             描述符gdt/ldt            +                     |       =       线性地址

     

  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/plinx/p/2857214.html
Copyright © 2011-2022 走看看