深入理解系統呼叫

2022-08-09 02:30:15 字數 3544 閱讀 7153

一.實驗要求

二.實驗環境搭建

1.安裝開發工具

sudo apt install build-essential

sudo apt install qemu # install qemu

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

sudo apt install axel

axel -n 20 linux-5.4.34.tar.xz

xz -d linux-5.4.34.tar.xz

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.根檔案系統的製作

axel -n 20 

tar -jxvf busybox-1.31.1.tar.bz2

cd busybox-1.31.1

make menuconfig

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

settings --->

[*] build static binary (no shared libs)

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

make -j$(nproc) && make install

5.製作根檔案系統映象

mkdir rootfs

cd rootfs

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

mkdir dev proc sys home

sudo cp -a /dev/ dev/

6. init指令碼放到根檔案系統目錄下

#!/bin/sh

mount -t proc none /proc

mount -t sysfs none /sys

echo "welcome my os!"

echo "-------------------"

cd home

/bin/sh

7.輸入**看qemu是否正常啟動

#打包成記憶體根⽂件系統映象

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz

#測試掛載根⽂件系統,看核心啟動完成後是否執⾏init指令碼

qemu-system-x86_64 -kernel linux-5.4.34/arch/x86/boot/bzimage -initrd rootfs.cpio.gz 

三、實驗過程:中斷分外部中斷(硬體中斷)和內部中斷(軟體中斷),內部中斷⼜ 稱為異常(exception),異常⼜分為故障(fault)和陷阱(trap)。 系統調⽤就是利⽤陷阱(trap)這種軟體中斷⽅式主動從⽤戶態進⼊ 核心態的

從⽤戶態進⼊核心態是由中斷觸發的,可能是硬體中斷, 在⽤戶態程序執⾏時,硬體中斷訊號到來,進⼊核心態,就會執⾏這 個中斷對應的中斷服務例程。也可能是⽤戶態程式執⾏過程中,調⽤ 了⼀個系統調⽤,陷⼊了核心態,叫作陷阱(trap)(系統調⽤是特 殊的中斷)

本次實驗是通過系統提供的軟體中斷,實現系統呼叫

1、通過在arch/x86/entry/syscalls/syscall_64.tbl中檢視linux提供的系統呼叫,選擇以自己學號為結尾的33來實現系統呼叫

2、編寫test_dup2.c程式,呼叫32號系統呼叫

int main()

3、使用gcc靜態編譯,並重新打包

gcc -o test_dup test_dup.c -static

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz

4、進行gdb除錯

#開啟新的terminal

cd linux-5.4.34

gdb vmlinux

target remote:1234

#設定斷點

5、通過命令c來繼續執行,通過n來實現gdb單步除錯

6、通過bt可觀察當前堆疊資訊

四、總結:

linux的系統呼叫過程:

使用者程式------>c庫(即api):int 0x80 ----->system_call------->系統呼叫服務例程-------->核心程式

其中int 0x80是cpu將一些關鍵暫存器壓棧,然後核心保護現場,系統呼叫核心函式處理完成後恢復現場

system_call是借助cpu內部的msr暫存器來查詢系統調⽤處理⼊⼝,可以快速切換cpu的指令指標(eip/rip)到系統調⽤處理⼊⼝,但本質上還是中斷處理的思路,壓棧關鍵暫存器、儲存現場、恢復現場,最後系統調⽤返回。

系統呼叫的作用如下:

(1) 它為使用者空間提供了一種統一的硬體的抽象介面。

(2)系統呼叫保證了系統的穩定和安全。作為硬體裝置和應用程式之間的中間人,核心能夠基於許可權和其它一些規則對須要進行的訪問進行裁決。

深入理解Linux系統呼叫

環境準備 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 de...

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

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

深入理解Linux核心 系統呼叫

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