歡迎使用CSDN markdown編輯器

2021-07-29 10:55:31 字數 1622 閱讀 3600

使用gdb跟蹤分析乙個系統呼叫核心函式(您上週選擇那乙個系統呼叫),系統呼叫列表參見 ,推薦在實驗樓linux虛擬機器環境下完成實驗。

開啟實驗樓的虛擬機器系統,進入linuxkernel資料夾中的menu,修改其中的test.c**,將上週實驗中的系統呼叫函式以子函式的形式加入進去,並相應的新增主函式。

2. 使用make rootfs進行編譯,啟動核心

3. 核心能夠正常啟動,help命令能夠正常使用,但是呼叫getppid以及getppid_asm的時候,會出現以下問題,導致系統掛機。

4. 通過查詢網路,得知這種資訊一般都是由記憶體訪問越界造成的,不管是使用者態程式還是核心態程式訪問越界都會出core, 並在系統日誌裡面輸出一條這樣的資訊。這條資訊的前面分別是訪問越界的程式名,程序id號,訪問越界的位址以及當時程序堆疊位址等資訊,比較有用的資訊是 最後的error number. 以上錯誤的處理辦法我仍在摸索

目前由於未能除錯成功,故先對實驗相關原理進行分析:

(1)系統呼叫systemcall:linux核心系統呼叫是指所有的作業系統在其核心裡都有一些內建的函式,這些函式可以完成一些系統級別的功能。

(2)這些函式代表了從使用者空間到核心空間的一種轉換,例如呼叫getppid函式,則會在核心空間呼叫sys_getppid

系統呼叫過程:

(1)通過軟體中斷0x80,系統會跳轉到乙個預設的核心空間位址,它指向了系統呼叫處理程式(不要和系統呼叫服務例程相混淆),即在arch/i386/kernel/entry.s檔案中使用組合語言編寫的system_call函式。很顯然,所有的系統呼叫都會同一跳轉到這個位址進而執行system_call函式

(2)軟中斷指令int 0x80執行時,系統呼叫號會被放進eax暫存器,同時,sys_call_table每一項占用4個位元組。這樣,system_call函式可以讀取eax暫存器獲得當前系統呼叫的系統呼叫號,將其乘以4的偏移位址,然後以sys_call_table為基址,基址加上偏移位址所指向的內容即是應該執行的系統呼叫服務例程的位址。

(3)除了傳遞系統呼叫號到eax暫存器,假如需要,還會傳遞一些引數到核心,比如write系統呼叫的服務例程原型為: 呼叫write系統呼叫時就需要傳遞檔案描述符fd、要寫進的內容buf以及寫進位元組數count等幾個內容到核心。ebx、ecx、edx、esi以及edi暫存器可以用於傳遞這些額外的引數。

(4)注:系統呼叫通過軟中斷0x80陷進核心,跳轉到系統呼叫處理程式system_call函式,並執行相應的服務例程,但由於是代表使用者程序,所以這個執行過程並不屬於中斷上下文,而是處於程序上下文。

流程圖

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...