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            +                     |       =       线性地址

     

  • 相关阅读:
    查看系统运行时间和系统当前时间
    根据端口查进程信息
    SELinux深入理解
    nginx配置文件
    centos7 nginx配置httpsCenos(6.6/7.1)下从源码安装Python+Django+uwsgi+nginx环境部署(二)
    Linux的加密认证功能以及openssl详解
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    理解GRUB2工作原理及配置选项与方法
    在用busybox制作系统过程中遇到的问题
    内核编译选配(VMware篇)
  • 原文地址:https://www.cnblogs.com/plinx/p/2857214.html
Copyright © 2011-2022 走看看