新版Linux內核添加系統調用的方法

新版Linux內核添加系統調用的方法


今天做Linux內核的作業,要自己動手添加一個系統調用。在網上搜了很多帖子,都是真的2.6版本的,我下載的版本是3.2.11,發現新版的內核添加方法非常不同,舊的方法已經不再使用,於是記下方法,僅供參考。

第一步

在linux-3.2.11/kernel下創建mysyscall.c文件,內容如下:

#include <linux/kernel.h>

asmlinkage long sys_mysyscall(void){
        printk(KERN_ALERT "This is my sys call!\n");
        return 0;
}       

第二步

在linux-3.2.11/kernel/Makefile中加入:

obj-y += mysyscall.o

第三步

在linux-3.2.11/include/linux/syscalls.h中加入:

asmlinkage long sys_mysyscall(void);

第四步

在linux-3.2.11/arch/x86/kernel/syscall_table_32.S(如果你編譯的是64位機器則32替換爲64)中加入:

.long sys_mysyscall
在linux-3.2.11/arch/x86/ia32/ia32entry.S中加入:
.quad sys_mysyscall

第五步

在linux-3.2.11/arch/x86/include/asm/unistd_32.h中加入:

#define __NR_mysyscall          349
並將
#define NR_syscalls 349
替換爲

#define NR_syscalls 350
(這裏根據實際情況,__NR_mysyscall爲現有最大值,NR_syscalls加一即可)

第六步

重新編譯、安裝、重啓

測試

查看/proc/kallsyms中是否有mysyscall,如果有,表示符號已經導出。

編寫測試程序:

#include <sys/syscall.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
        printf("%d\n", syscall(__NR_mysyscall));
        return 0;
}
編譯運行,輸出0即爲正確,-1爲錯誤。
若運行正確,用dmesg查看,末尾有輸出:This is my sys call!


發佈了46 篇原創文章 · 獲贊 12 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章