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