例項:基於4412-實現新增自己的系統呼叫函式(學習《Linux核心設計與實現》 記錄)
阿新 • • 發佈:2018-12-21
學習筆記:
在學習《linux核心設計與實現》過程中,瞭解到:
在Linux中,系統呼叫是使用者空間訪問核心的唯一手段(除異常和陷入之外)。
系統呼叫主要有三個作用:
①:為使用者空間提供一個硬體的抽象介面。
②:系統呼叫保證了系統的穩定和安全。
③:為了實現多工和虛擬記憶體(應用程式不可以隨意訪問硬體)
具體理論知識,可以自己看書瞭解,本帖子主要介紹基於iTOP-4412的3.0.15版本核心,增加自己系統呼叫的過程。
需要注意的是,建立一個系統呼叫非常簡單,但絕不提倡。
大家可以使用一些替代方法,如,“裝置節點”、“訊號量”和“檔案描述符”等
核心修改過程
1、使用如下命令
vi arch/arm/kernel/calls.S
在397行新增如下內容,並儲存退出。
CALL(sys_foo)
如下圖所示:
2、使用如下命令
vi arch/arm/kernel/sys_arm.c
在檔案最後,新增如下內容
asmlinkage long sys_foo(void)
{
printk("this is kernel sys_foo ! \n");
return THREAD_SIZE;
}
返回每個程序的核心棧大小。
如下圖所示。
3、使用如下命令
vi arch/arm/include/asm/unistd.h
在405行,新增如下內容
#define __NR_foo (__NR_SYSCALL_BASE+376)
後面新增的數字是遞增的,不可以和之前的系統呼叫號重複,並且之後的應用測試程式也要和該數字對應。
如下圖所示
新增完成之後,重新編譯燒寫到板子。
應用程式
#include <stdio.h> #include <unistd.h> #include <sys/syscall.h> int main (void) { long return_foo = syscall(376,NULL); printf("this is user and sys_foo() return : %ld \n",return_foo); return 0; }
syscall()函式的第一個引數為系統呼叫號,與“arch/arm/include/asm/unistd.h ”中的定義統一。
執行測試:
~ # ./test
[ 118.131030] this is kernel sys_foo !
this is user and sys_foo() return : 8192
~ #
由列印資訊可知,可以成功呼叫剛才增加的sys_foo()系統呼叫函式。
參考連結:
https://blog.csdn.net/liduxun/article/details/48119849