好像也不是什麼技巧~只是別校同學上課的一個小作業 kernel 2.6.19 一、在linux source code的部份(/usr/src/linux/) 1. arch/i386/kernel/syscall_table.S的最後面加上要新增的system call名稱 例: ....... .long sys_request_key .long sys_keyctl .long sys_yang (新增的system call) 2. include/asm-i386/unistd.h裡面加上自己的define 貌: ....... #define __NR_request_key 287 #define __NR_keyctl 288 #define __NR_yang 289 (新增的) #define NR_syscalls 290 (改成最後一個define的數字加1) 3. include/linux/syscalls.h裡面加上函式的定義 例: ...... asmlinkage long sys_keyctl.................. asmlinkage long sys_yang(void); (新增的~也可以定義成傳參數) #endif 4. kernel/裡面新增或在隨便一個檔案裡面加上system call的實作 例: 新增一個yang.c 內容: #include #include asmlinkage long sys_yang(void) { printk("My System Call Test\n"); return 0; } 5. kernel/Makefile 在 obj-y 後面加上自己新增要編譯的檔 例: ............ ............sys_ni.o yang.o (新增yang.o) 二、修改一般程式include進來的檔(/usr/include/) 1.asm/unistd.h一樣加上自己的define 例: #define __NR_sys_kexec_load 283 #define __NR_yang 289 (新增的) #define NR_syscalls 290 (最後一個define的數字加上1) 2.bits/syscall.h最後面加上自己的define 例: #define SYS_writev __NR_writev #define SYS_yang __NR_yang (新增的) 三、make && make modules_install 四、寫個小程式測式一下吧 例: mysyscalltest.c #include #include static inline _syscall0(long,yang); //linux中一共定義了7種不同的_syscall*,在unistd.h裡面可以看到 //若定義system call有要傳參數的話必需使用別的_syscall int main() { yang(); return 0; } 五、test gcc mysyscalltest.c ./a.out dmesg | tail -n 5 最後面就可以看到了 希望如果大家有trace或改kernel的經驗可以一起分享出來 對於測試程式部份 由於現在部分的 linux distribution (如 FC6) 已經正式讓 _syscallx 進入歷史以後不再提供了, 所以就得乖乖的用 syscall 來呼叫 system call 所以最後的範例程式 可以改寫成 代碼: #include #include #include int yang(int n) { return syscall(__NR_yang, n); //__NR_yang 為註冊的syscall編號 , n為傳入的參數 } int main() { yang( 0); return 0; }