編號後三位 411,參考孟寧老師
wget
tar -xzvf linux-5.0.3.tar.gz
sudo apt install flex bison libssl-dev
make i386_defconfig
# make
make -j8
#include
intmain()
}
gcc -o init init.c -m32 -static
mkdir rootfs
cp init rootfs/
cd rootfs
ls| cpio -o -hnewc |
gzip -9 >
../rootfs.img
qemu-system-i386 -kernel linux-5.0.2/arch/x86/boot/bzimage -initrd rootfs.img
可以看到以下執行效果
使用以下命令重新編譯核心,為核心啟用除錯選項
# 安裝依賴
sudo apt install libncurses-dev
# 生成編譯配置
# 啟動編譯
make -j6
我的編號後兩位是11,因此測試11號api
#define __nr_execve 11
查資料了解到這個系統呼叫的功能是啟動乙個可執行程式,因此我需要至少兩個可執行程式,乙個包含execve呼叫,另乙個被啟動。
我編寫了以下兩個程式。
#include
intmain()
#include
#include
intmain()
;char
*envp=
;printf
("starting systemcall execve......\n");
if(fork()
==0)printf
("stoped systemcall execve......\n");
}while(0
<1)
}
前乙個輸出簡單的 helloworld 資訊,後乙個包含系統呼叫,用於啟動 helloworld 程式。
我還編寫了彙編形式的系統呼叫,但由於gdb可以單步除錯彙編,因此這裡不作為主要測試**。
qemu-system-i386 -kernel linux-5.0.2/arch/x86/boot/bzimage -initrd rootfs.img
可以看到執行結果
除錯時需要新增附加選項
cd linux-5.0.2
gdb vmlinux
可以看到如下除錯介面
除錯 start_kernel 函式, 使用以下 gdb 命令除錯
b start_kernel // 設定斷點
c // 執行到第乙個斷點
display /i $pc //顯示彙編**
l // 顯示當前c**
s // 單步執行
s // 單步執行
為了除錯方便,我將之前編寫的init程式直接在ubuntu上進行除錯,著重分析系統呼叫過程
可以看到,此處的系統呼叫通過sysenter進入核心,然後啟動了 helloworld 程式,呼叫過程為:
ecx 暫存器壓棧 -> edx 暫存器壓棧 -> ebp 暫存器壓棧 -> mov esp 到 ebp -> sysenter (此處執行了helloworld程式)-> ebp 暫存器出棧 -> edx 暫存器出棧 -> ecx出棧
Linux核心編譯及新增系統呼叫
1 總體設計思路 系統呼叫的本質是呼叫核心函式,以核心態執行程式。為了在核心態下執行,本實驗針對linux的核心進行修改,增加自定義系統呼叫函式實現使用者態程式對任意程序的nice值進行修改或者讀取來進行測試。2 主要函式的介面設計 核心態程式 syscall define3 mysetnice,p...
linux核心之系統呼叫
應用程式與系統呼叫 使用者應用程式訪問並使用核心所提供的各種服務的途徑,就是系統呼叫,系統呼叫介面層作為核心和使用者應用程式之間的中間層,扮演了乙個橋梁,系統呼叫把應用程式的請求傳達給核心,核心處理完後,把結果返回給應用程式。應用程式通過作業系統提供的應用程式設計介面api而不是直接通過系統呼叫來程...
Linux核心之系統呼叫
linux核心之系統呼叫 1.應用程式通過api而不是直接呼叫系統呼叫來程式設計 2.getpid 系統呼叫示例 asmlinkage long sys getpid void asmlinkage 編譯器僅從棧中提取引數 系統呼叫的命名規則 sys syscallname 3.每個系統呼叫都對應乙...