1. 程式人生 > >20189221 郭開世《Linux核心原理與分析》第二週作業

20189221 郭開世《Linux核心原理與分析》第二週作業

讀書報告


庖丁解牛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語言結合起來,真正瞭解很多時候的程式碼優化原理;

入棧出棧:

  • 複習了堆疊中入棧出棧的步驟
  • 學習棧在程式執行過程的作用,特別是編譯之後用匯編語言的執行過程