1. 程式人生 > >Linux 3.10.12通過編譯核心新增系統呼叫

Linux 3.10.12通過編譯核心新增系統呼叫

本文以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。

  1. #define __NR_mysyscall 314
  2.  __SYSCALL(__NR_mysyscall, sys_mysyscall)  
  3. #undef __NR_syscalls
  4. #define __NR_syscalls 275

2、修改系統呼叫表

修改arch/x86/syscalls/syscall_64.tbl檔案,根據原有表內容的格式,在322行處新增如下內容

  1. 314     64      mysyscall               sys_mysyscall  

3、新增處理函式

修改kernel/sys.c檔案。新增不帶引數的系統呼叫處理函式。

  1. SYSCALL_DEFINE0(mysyscall)  
  2. {  
  3.         //在此處加入遍歷程序的程式碼
  4.         struct task_struct *p;  
  5.         printk("********************************************\n");  
  6.         printk("------------the output of mysyscall------------\n");  
  7.         printk("********************************************\n\n"
    );  
  8.         printk("%-20s %-6s %-6s %-20s\n","Name","pid","state","ParentName");  
  9.         for(p = &init_task; (p = next_task(p)) != &init_task;)  
  10.                 printk("%-20s %-6d %-6d %-20s\n",p->comm , p->pid, p->state, p->parent->comm);  
  11.         return 0;  
  12. }  

4、系統呼叫測試程式

編寫簡單的測試程式

  1. #include <linux/unistd.h>
  2. #include <sys/syscall.h>
  3. //系統呼叫號根據實驗具體
  4. #define __NR_mysyscall 314
  5. //數字而定
  6. int main()  
  7. {  
  8.     syscall(__NR_mysyscall);    /*或 syscall(313) */
  9. }  

5、測試

編譯新核心並啟動,編譯測試程i#in序,在新啟動的核心中執行測試程式,並利用dmesg命令檢視輸出資訊。

本文利用的是qemu工具啟動新核心,並進行相關測試。