深入理解Linux系統呼叫

2022-05-30 23:48:11 字數 3241 閱讀 6260

環境準備

1. 安裝環境

1 sudo apt install build-essential

2 sudo apt install qemu # install qemu

3 sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev

4 sudo apt install axel

1 axel -n 20 

2 xz -d linux-5.4.34.tar.xz

3 tar -xvf linux-5.4.34.tar cd linux-5.4.34

3. 配置核心編譯選項

make defconfig #default configuration is based on 'x86_64_defconfig'

make menuconfig

#開啟debug相關選項

kernel hacking --->

compile-time checks and compiler options --->

[*] compile the kernel with debug info

[*] provide gdb scripts for kernel debugging [*] kernel debugging

#關閉kaslr,否則會導致打斷點失敗

processor type and features ---->

randomize the address of the kernel image (kaslr)

4. 編譯核心

1 make -j$(nproc)

2 # 測試一下核心能不能正常載入執行,因為沒有檔案系統最終會kernel panic

3 qemu-system-x86_64 -kernel arch/x86/boot/bzimage

5. 製作根檔案系統

1 axel -n 20 

2 tar -jxvf busybox-1.31.1.tar.bz2

3 cd busybox-1.31.1

製作根檔案系統

make menuconfig

記得要編譯成靜態鏈結,不用動態鏈結庫。

settings --->

[*] build static binary (no shared libs)

然後編譯安裝,缺省會安裝到原始碼目錄下的 _install 目錄中。

make -j$(nproc) && make install

6. 製作記憶體根檔案系統映象

1 mkdir rootfs

2 cd rootfs

3 cp ../busybox-1.31.1/_install/* ./ -rf

4 mkdir dev proc sys home

5 sudo cp -a /dev/ dev/

7. 準備init指令碼檔案放在根檔案系統跟目錄下(rootfs/init),新增如下內容到init檔案。

1 #!/bin/sh

2 mount -t proc none /proc mount -t sysfs none /sys

3 echo "wellcome mengningos!" echo "--------------------"

4 cd home

5 /bin/sh

給init指令碼新增可執行許可權

1 chmod +x init
打包成記憶體根檔案系統映象

1 find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
測試掛載根檔案系統,看核心啟動完成後是否執行init指令碼

我的系統呼叫號是10, mprotect()函式

gcc編譯(這裡採用靜態編譯)後執行,輸出結果:

gcc -o write-file wrrite-file.c -stat
彙編改寫手動觸發系統呼叫

新建在rootfs/home目錄下新建檔案 test.c,在後面新增以下內容:

gcc編譯後檢視執行結果

重新打包根檔案目錄,純命令⾏下啟動虛擬機器。

然後給對應的系統呼叫打上斷點

gdb單步除錯

結果分析『

系統呼叫的儲存現場和恢復現場;entry_syscall_64是系統呼叫的入口點,它完成了儲存現場,呼叫對應的核心處理函式、恢復現場、系統呼叫返回等工作。

彙編指令syscall 觸發系統呼叫,通過msr暫存器找到了中斷函式入口;

接著跳轉獲得系統呼叫號,執行系統呼叫的內容

深入理解系統呼叫

一.實驗要求 二.實驗環境搭建 1.安裝開發工具 sudo apt install build essential sudo apt install qemu install qemu sudo apt install libncurses5 dev bison ex libssl dev libe...

深入理解Linux核心 系統呼叫

系統呼叫 使用者態程序向核心發出的,實現使用者態程序呼叫硬體裝置的函式或者中斷 優點 使程式設計更容易,將使用者從學習硬體裝置的低階程式設計特性中解放 提高系統到安全性,核心在滿足請求之前可以做正確性檢查 提高可移植性 系統呼叫與api呼叫的區別 1 api呼叫是乙個函式定義 系統呼叫是通過軟中斷向...

深入理解系統呼叫與庫函式呼叫

今天對系統呼叫和庫函式呼叫進行了一次總結 在這裡把心得寫出來,如果有什麼錯誤希望大家能指出 我們假設unix系統 庫函式有c編譯器提供 而你有用彙編編寫c庫函式的能力 首先要知道巨集觀上知道系統呼叫和庫函式的區別 系統呼叫由作業系統提供,我門假設用彙編編寫的 而庫函式是編譯器提供 而我們知道系統呼叫...