20189221 郭開世《Linux核心原理與分析》第二週作業
阿新 • • 發佈:2018-11-10
讀書報告
《庖丁解牛Linux核心分析》
第 1 章 計算工作原理
1.1 儲存程式計算機工作模型
1.2 x86-32彙編基礎
1.3彙編一個簡單的C語言程式並分析其彙編指令執行過程
因為本科時期學過《微機原理與介面技術》課程,學習過8086/8088的組合語言,所以基本上算是複習。
- 通用暫存器
EAX:累加器,是算術運算的主要暫存器,I/O指令使用該暫存器與外設傳送資訊
EBX:通用暫存器,常用作基址暫存器
ECX:通用暫存器,在迴圈時作為隱含的計數器
EDX:通用暫存器,可以和AX一起儲存雙字,DX存放高位
ESP:用來指示棧頂的偏移地址
EBP:常用作堆疊區中的基地址指標
ESI:源變址暫存器,具有自動增/減功能
EDI:目的變址暫存器,具有自動增/減功能- 段暫存器
CS:程式碼段暫存器,存放程式碼段的段基址或段選擇字
DS:資料段暫存器,存放資料段的段基址或段選擇字
ES:附加段暫存器,存放附加資料段的段基址或段選擇字。
SS:堆疊段暫存器,存放堆疊段的段基址或段選擇字
FS:附加段暫存器,存放附加資料段的段基址或段選擇字
GS:附加段暫存器,存放附加資料段的段基址或段選擇字
《Linux核心原理與實現(第3版)》第1、2、18章
第 1 章 Linux核心簡介
- Linux與Unix的淵源及歷史
- 作業系統和核心
- Linux核心的特點
第 2 章 從核心出發
- 核心原始碼的獲取
- 核心和編譯核心
第 18 章 除錯
- 除錯準備
- 核心bug的分類
除錯方法
- printk( )
- oops
- 配置選項
- BUG( )和BUG_ON( )
- 系統請求鍵
- gdb和kgdb
- 探測系統
二分搜尋
本科時學習過作業系統課程,對於核心態有一定了解,但未自己進行核心開發,第 2 章進行學習準備,第 18 章先學習怎樣處理之後核心開發可能會遇到的問題,十分合理。
- Linux核心獲取
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git $ git pull
- 結合上次所學,對gdb的使用更加了解,但gdb無法修改核心資料。
- 近期俗事纏身,未能真正完全按照老師教導的方式深入學習第 18 章,沒能對核心除錯函式進行一個個詳細的分析學習。
讀書收穫
- mov指令中,movl中的l是指32位,movb中b指8位,movq中q指64位;
- 對Linux核心有了一個初步的淺顯的瞭解,獲取了核心原始碼,學習了幾種除錯方法,為之後的核心程式設計做準備;
- 兩年以後再次學習組合語言,很有意思,有不少新的感悟,希望能用於以後的程式設計實現中;
- 之前學過的作業系統知識終於要用於程式設計實現,希望在之後的Linux核心開發中獲得更多樂趣。
實驗報告
實驗過程
- 使用vim按照要求編輯main.c
可通過實驗樓支援的複製/貼上資料傳遞- 使用gcc編譯main.c,產生彙編程式碼檔案main.s
$ gcc -S -o main.s main.c -m32
過程如圖:
- 開啟main.s,刪除輔助資訊,檢視彙編程式碼
使用g/.s*/d刪除所有以“.”打頭的字元
結果如圖:
實驗分析
彙編程式碼工作過程
從main程式開始執行
- ebp入棧
- 把ebp值賦予給esp
- 將esp值減4,指向下一儲存空間(棧單位儲存空間)
- 將數值20181018(日期)存在esp所指的儲存空間中
呼叫f函式
- ebp入棧
- 把ebp值賦予給esp
- 將esp減4,指向下一地址空間
- 將ebp加8所指向的儲存空間內的內容賦予給累加暫存器eax
- 將eax的內容賦予給esp
呼叫g函式
- 對ebp進行壓棧
- 把ebp值賦予給esp
- 將ebp加8所指向的儲存空間內的內容賦予給累加暫存器eax
- 將eax儲存的數值加20189221(學號)
- 出棧
返回main函式
- 返回到f函式的leave命令
- 撤銷函式堆疊
- 返回到主函式的leave命令
- 將eax儲存的數加9527
- 撤銷函式堆疊
- 返回程式執行值
實驗收穫
組合語言:
eave指令包含著兩個步驟
- 將esp指向ebp的位置;
- 將當前ebp所指向的記憶體單元裡的內容彈出,並存入eip及存取
- 再次熟悉了組合語言,對於mov指令有了更為深入的瞭解;
真正將組合語言與C語言結合起來,真正瞭解很多時候的程式碼優化原理;
入棧出棧:
- 複習了堆疊中入棧出棧的步驟
- 學習棧在程式執行過程的作用,特別是編譯之後用匯編語言的執行過程