Linux 系統呼叫及核心除錯

2021-09-12 23:20:56 字數 2978 閱讀 3680

編號後三位 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.每個系統呼叫都對應乙...