Linux 3.10.12通過編譯核心新增系統呼叫
阿新 • • 發佈:2019-01-23
本文以linux-3.10.12核心、x86平臺、64位,為例進行說明。
新增新的系統呼叫,共需修改3處檔案:
(1)分配系統呼叫號:/usr/src/linux-x.x.x/include/uapi/asm-generic/unistd.h(不是/usr/src/linux-x.x.x/include/asm-generic/unistd.h)
(2)修改系統呼叫表:/usr/src/linux-x.x.x/arch/x86/syscalls/syscall_64.tbl。較早版本的核心,修改的是arch/x86/kernel/syscall_table_32.S檔案。
(3)新增處理函式:/usr/src/linux-x.x.x/kernel/sys.c,(不是必須在這個檔案中新增,可在其他檔案或新建檔案)
1、分配系統呼叫號
修改include/uapi/asm-generic/unistd.h檔案,設系統呼叫號為314,不衝突即可。同時修改__NR_syscalls的值274為275。
- #define __NR_mysyscall 314
- __SYSCALL(__NR_mysyscall, sys_mysyscall)
- #undef __NR_syscalls
- #define __NR_syscalls 275
2、修改系統呼叫表
修改arch/x86/syscalls/syscall_64.tbl檔案,根據原有表內容的格式,在322行處新增如下內容
-
314 64 mysyscall sys_mysyscall
3、新增處理函式
修改kernel/sys.c檔案。新增不帶引數的系統呼叫處理函式。
- SYSCALL_DEFINE0(mysyscall)
- {
- //在此處加入遍歷程序的程式碼
- struct task_struct *p;
- printk("********************************************\n");
- printk("------------the output of mysyscall------------\n");
-
printk("********************************************\n\n"
- printk("%-20s %-6s %-6s %-20s\n","Name","pid","state","ParentName");
- for(p = &init_task; (p = next_task(p)) != &init_task;)
- printk("%-20s %-6d %-6d %-20s\n",p->comm , p->pid, p->state, p->parent->comm);
- return 0;
- }
4、系統呼叫測試程式
編寫簡單的測試程式
- #include <linux/unistd.h>
- #include <sys/syscall.h>
- //系統呼叫號根據實驗具體
- #define __NR_mysyscall 314
- //數字而定
- int main()
- {
- syscall(__NR_mysyscall); /*或 syscall(313) */
- }
5、測試
編譯新核心並啟動,編譯測試程i#in序,在新啟動的核心中執行測試程式,並利用dmesg命令檢視輸出資訊。
本文利用的是qemu工具啟動新核心,並進行相關測試。