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

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

可能 info kgdb 收獲 執行 src 一個 學習 指針

讀書報告


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

入棧出棧:

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

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