Authors: WhoAmI, CrazyMonkey
Date: 20231012
E-mail: kccddb@gmail.com
Copyright: CC BY-NC-SA
這是方便讀者使用 QEMU 進行實驗
主要讓 讀者 理解 system call 的運作原理
基本方法可參考:
這與 Linux kernel 版本 和 arch 有關, 這裡是 Linux kernel 3.8
[與QEMU 版本也有關, 不要使用太新的, QEMU 2.x.x i386 32bits 版, 否則太複雜不容易懂]
qemu-2.0.0, 可以用新的 與 自己用 busybox 做的 rootfs
Linux kernel 3.8
https://mirrors.edge.kernel.org/pub/linux/kernel/
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.8.tar.gz
不過 不幸的是 3.xx gcc version 5.xx 不能用, 因此只能用 4.x.x 的 kernel
linux 4.4.50:
https://elixir.bootlin.com/linux/v4.4.50/source/arch/x86/entry/syscalls/syscall_32.tbl
也注意 unistd.h 中 NR_syscall的大小
syscall_32.tbl
https://elixir.bootlin.com/linux/v3.8/source/arch/x86/syscalls/syscall_32.tbl
syscall.h
https://elixir.bootlin.com/linux/v3.8/source/include/linux/syscalls.h
重新 編譯 linux 3.8
當然QEMU 使用新的 kernel/rootfs 開機來執行
其中 user mode 部分
作者提的:
(a)
syscall() function in unistd.h can be used with syscall number to invoke it. In our case, 351.
這裏提的 unistd.h 是指 gcc tools 內的 unistd.h
(b)
If this application is compiled with -static then there is no need for C libs. It works fine.
這是指的是:
1. 假設 application 名稱 hello.c
2. gcc -static hello.c -o hello
也練習使用 ldd, strace, … 觀察 有無 static 的差別
Adding A System Call To The Linux Kernel (5.8.1) In Ubuntu (20.04 LTS)