深入理解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            +                     |       =       线性地址

 

原文地址:https://www.cnblogs.com/plinx/p/2857214.html