Linux內核分析與應用-學習筆記(二)

第二章 內存尋址

2.1 內存管理之內存尋址

圖靈機->馮諾依曼體系結構

arm

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章