Linux Version 2.6.35.4
(CentOS)
目錄前的Linux代表kernel source code的根目錄
我的Linux= /usr/src/kernels/linux-2.6.35.4
A.
加一個自己的system call
1.
新增一筆syscall service
routine name到 syscall table中
Linux/arch/x86/kernel/syscall_table_32.S 中加 “.long sys_process_switch_info”
當syscall call發生時kernel會到此table中找到對應的service routine name
2.
定義syscall number
Linux/arch/x86/include/asm/unistd_32.h
把新的number加上去,並將__NR_syscalls +1
(__NR_syscalls代表maximum的syscalls number)
3.
定義syscall的prototype
Linux/include/syscalls.h 這裡定義所有的syscall
prototype
(asmlinkage是一種語法,用來與不同compiler間溝通)
此syscall中我自己定義的一個structure (在這裡不重要)
真正的syscall從SYSCALL_DEFINE[0-6](….)開始
SYSCALL_DEFINE可以接受0到6個參數, 第一個參數是SYSCALL NAME不算在內。定義形式是這樣的:
SYSCALL_DEFINE[參數個數](SYSCALL NAME, 參數1型態, 參數1, 參數2型態,參數2….)
因為我的syscall只有一個型態為 process_switch_info*的參數 psi, 因此我是
SYSCALL_DEFINE1(……)
(若沒有參數的話在第3步裡面參數地方要寫void不然會有錯)
5.
加入Makefile(把object檔放入 source code tree中)
Linux/kernel/Makefile
(新增的syscall放在哪一層,就加在該層的Makefile中)
6. 重編kernel
make
make modules_install
make install
B.
測試system call
1.
syscall(__NR_process_switch_info,
psi)是呼叫syscall的方法
第一個參數為syscall name, 後面的參數放該syscall所需的參數
可以直接寫在.c中,這裡定義了get_process_switch_info()讓.c中的function name有意義,因此傳了一個自訂的structure進來才呼叫syscall
沒有留言:
張貼留言