作業系統實習課(三) -建造新的System Call- 助教:鄧執中 實驗室:720A 課程網頁:140.120.108.141
前置步驟: 取得root超級權限以便之後的操作: 改變文件權限: #chmod xxx 檔案、文件名 user group other w(可寫入)=2 →1+2+4=7 r(可讀取)=4 syscall_64.h全部使用者可寫、讀、執行→ #chmod 777 syscall_64.h
有些kernel沒辦法修改system call,此時需要自行下載新 的來編譯。 將下載來的kernel放入/usr/src目錄之下。
1.修改syscall table 路徑: /usr/src/linux kernel-XXXX/arch/x86/include/generated/asm/syscalls_64.h syscall table 裡面存了所有 syscall 的記憶體位址
在這裡加上syscall 名稱與編號 在最後一個syscall後面加入: __SYSCALL_COMMON(41, sys_hello, sys_hello)
2.增加syscall的定義 路徑: /usr/src/linux kernel-XXXX/arch/x86/include/generated/asm/unistd_64_x32.h
#define NR_syscalls XXX 為定意systemcall的下界,因此我們把此行XXX+1,並 在前新增: #define __NR_x32_hello XXX 若是後面沒有定意其他函式則直接在最後一行define後加#define __NR_x32_hello XXX+1 就行。
3.定義函式原型 路徑: /usr/src/linux kernel-XXXX/include/linux/syscalls.h
新增: asmlinkage int sys_mycall(void); asmlinkage:由於system call 是在kernel中實現的,必須符合kernel編程的 規則,函數定義時都需加上此標識符。
4.新增system call的主程式碼 路徑:/usr/src/linux kercel-XXXX/kernel 新增的程式碼檔名得要跟system call的名稱一樣,否則則系統無法找到 正確的 system call 對應。(EX:foo.c)
5. 設定Makefile 6. 編譯kernel並替換(超出範圍) 路徑:/usr/src/linux kernel-XXXX/kernel/Makefile 變數 obj-y 表示需要編繹到內核中的目標檔案名集合 在obj-y後加上要編譯的檔案 6. 編譯kernel並替換(超出範圍)