本文檔解釋了怎樣在Linux2.6中實現一個新的系統調用。一個系統調用被應用程序用來向操作系統請求服務。
2. 系統調用
一個系統調用被應用程序用來向操作系統請求服務。下面的語句闡述了為什麼需要
系統調用。一個操作系統可以直接訪問一個系統的硬件,但是一個用戶程序沒有直接訪問硬件的權限。這樣做是為了使系統免於遭受惡意的用戶程序的破壞,保證系統的安全和保密。但是,經常,一個用戶程序需要一些硬件相關的信息(例如,從一個攝像頭中獲取數據以顯示圖像),但是,它不能直接獲取信息。因此,它請求操作系統提供它這些信息。這個請求是通過使用一個合適的系統調用來完成的。
一個系統調用可以在內核模式下執行。每個系統調用有一個與之關聯的數字。這個數字被傳遞給內核,內核是根據這個數字來決定該執行哪個系統調用。當一個用戶程序發出一個系統調用時,它實現上是調用一個庫函數。該庫函數通過執行匯編指令INT0x80向Linux操作系統發出一個陷阱。它同時也通過EAX寄存器將系統調用號傳遞給內核。系統調用的參數通過其他的寄存器(EBX,ECX,etc)也傳遞給內核。內核執行該系統調用,並通過一個寄存器將執行結果返回給用戶程序。如果該系統調用需要返回給用戶程序大量的數據,它會使用其他的機制(例如,copy_to_user調用)。
3. 需要修改或創建的文件列表
假設你的Linux源碼的基目錄是/usr/src/linux.需要修改的內核文件如下所示:
1./usr/src/linux/arch/i386/kernel/syscall_table.S
2./usr/src/linux/include/asm-i386/unistd.h
3./usr/src/linux/include/linux/syscalls.h
4. /usr/src/linux/Makefile
需要新創建的文件/目錄如下所示:
1. /usr/src/linux/mycall –包含我們自己的系統調用的源文件,頭文件和Makefile的目錄(你也可以在一個已存在的文件中實現自己的系統調用).
2. /usr/src/linux/mycall/mycall.c–實現我們自已的系統調用的源碼.
3. /usr/src/linux/mycall/Makefile- Makefile
新創建的用戶空間文件以及用於測試我們的系統調用的文件列表如下所示:
1. testmycall.c –調用我們自己的系統調用的源碼.
2. testmycall.h –頭文件.
4. 需要修改的內核文件
文件的全路徑-/usr/src/linux/arch/i386/kernel/syscall_table.S
該文件包含系統調用的名字.
1.在該文件的後面添加一行(假設我們的系統調用名是mycall).
2. 添加".longsys_mycall"列表的尾部.
4. 2. unistd.h
文件全路徑-/usr/src/linux/include/asm-i386/unistd.h
該文件包含系統調用號,當一個系統調用被調用時通過寄存器(EAX)將其傳遞給內核.
在列表後面添加"#define__NR_mycall Last_System_Call_Num + 1 "
如果上一個系統調用定義在這裡:
"#define__NR_vmsplice 316",那麼在列表後面添加:
"#define__NR_mycall 317".
將"NR_syscalls"增1.這樣,如果NR_syscalls定義如下:
"#defineNR_syscalls 317",那麼將其改為:
"#defineNR_syscalls 318"
文件全路徑-/usr/src/linux/include/linux/syscalls.h
該文件包含了系統調用的聲明.
在該文件的末尾加入如下語句:
"asmlinkagelong sys_mycall(int i);"
4.4. Makefile
文件全路徑-/usr/src/linux/Makefile
Add mycall/ to core-y (Search for regex: core-y.*+=). You will be creating this directory.
This directory will contain the source file, header file and the Makefile for our system call.