第二章 內存尋址
2.1 內存管理之內存尋址
圖靈機->馮諾依曼體系結構
X86尋址的不同時期
8位(8080絕對地址)->16位(8086,段機制,實模式)->24位(80286,保護模式)->32位(80386,保護模式下可達4GB)->64位
- 實模式與保護模式寄存器的對比
- 保護模式下的頁表寄存器
- 控制寄存器
Linux內核中的C與彙編
C語言->GNU的擴展C
彙編語言->AT&T
C語言中嵌入彙編語言->GCC嵌入式彙編
參考資料
《深入理解Linux內核》第三版第二章
《Intel 64 and IA-32 Architectures Software Developer Manuals》
2.2保護模式下的段機制
- 簡單的“Hello World”程序
#incldue <stdio.h>
int main(void){
printf("Hello,World!\n");
return 0;
}
- 程序的編譯、彙編、鏈接與裝載
1.預處理
gcc -E hello.c -o hello.i
2.編譯
gcc -S hello.i -o hello.s
3.彙編
gcc -c hello.s -o hello.o
4.鏈接
gcc hello.o -o hello
5.裝載與執行
./hello
6.反彙編
objdump -d hello>log.txt(將反彙編的結果重定向,保存到log.txt中)
文件:待審覈通過之後添加鏈接地址
最左邊爲虛擬地址,中間爲指令碼,右側爲AT&T彙編指令 - CPU訪問虛擬地址:
- MMU的地址轉換
- 分段機制
1.段描述符表
段號描述的是虛擬地址空間段的編號
基地址是線性空間中段的起始地址
- 段描述符結構
- 保護模式下段寄存器中存放什麼?
索引or段號,這裏的段寄存器也叫選擇符,即從描述表中選擇某個段。
RPL:表示請求者的特權級。
TI:Table Index表明段描述符是在全局還是局部描述符表中。
保護模式下的特權級:0~3,Linux中只使用:0-內核態,3-用戶態 - 保護模式下的其他描述符表
GDT全局描述符表
IDT中斷描述符表
LDT局部描述符表 - Linux中的段
線性地址 = 段的起始地址 + 偏移量
Linux在啓動的過程中設置了段寄存器的值和全局描述表GDT的內容:
#define __KERNEL_CS 0x10
#define __KERNEL_DS 0x18
#define __USER_CS 0x23
#define __USER_DS 0x2B