1. 程式人生 > >例項:基於4412-實現新增自己的系統呼叫函式(學習《Linux核心設計與實現》 記錄)

例項:基於4412-實現新增自己的系統呼叫函式(學習《Linux核心設計與實現》 記錄)

學習筆記:
在學習《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