一.實驗要求
二.實驗環境搭建
1.安裝開發工具
sudo apt install build-essentialsudo apt install qemu # install qemu
sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev
sudo apt install axel3.配置核心選項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
• 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 205.製作根檔案系統映象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
mkdir rootfs6. init指令碼放到根檔案系統目錄下cd rootfs
cp ../busybox-1.31.1/_install/* ./ -rf
mkdir dev proc sys home
sudo cp -a /dev/ dev/
#!/bin/sh7.輸入**看qemu是否正常啟動mount -t proc none /proc
mount -t sysfs none /sys
echo "welcome my os!"
echo "-------------------"
cd home
/bin/sh
#打包成記憶體根⽂件系統映象三、實驗過程:中斷分外部中斷(硬體中斷)和內部中斷(軟體中斷),內部中斷⼜ 稱為異常(exception),異常⼜分為故障(fault)和陷阱(trap)。 系統調⽤就是利⽤陷阱(trap)這種軟體中斷⽅式主動從⽤戶態進⼊ 核心態的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
從⽤戶態進⼊核心態是由中斷觸發的,可能是硬體中斷, 在⽤戶態程序執⾏時,硬體中斷訊號到來,進⼊核心態,就會執⾏這 個中斷對應的中斷服務例程。也可能是⽤戶態程式執⾏過程中,調⽤ 了⼀個系統調⽤,陷⼊了核心態,叫作陷阱(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 -static4、進行gdb除錯find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
#開啟新的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呼叫是乙個函式定義 系統呼叫是通過軟中斷向...