linux核心探索(3)--系統呼叫(傳參)
阿新 • • 發佈:2018-12-16
踩坑啊啊啊啊啊啊!!!
目錄
核心版本:
開始:
1、編寫sys.c
/usr/src/linux-4.18.11/kernel/sys.c
新增:
#include <linux/linkage.h> SYSCALL_DEFINE2(test_one, int, count, const char __user *, buf) { char *p; printk("This is Syscall Test One.\n"); printk("buf addr is %p \n",buf); if(count > 1024) { printk("Your input str is too long.\n"); return 1; } p = (char *)kmalloc(sizeof(char) * count, GFP_KERNEL); if(!copy_from_user(p, buf, count)) { printk("input is %s \n", p); } kfree(p); return 1; } SYSCALL_DEFINE1(test_four, int, num) { printk("This is Syscall Test Four.\n"); printk("Four: Your input num is %d \n", num); return 1; }
2、編寫syscalls.h
/usr/src/linux-4.18.11/include/linux/syscalls.h
新增:
asmlinkage long sys_test_one(int count, const char __user *buf);
asmlinkage long sys_test_four(int num);
3、編寫syscall_64.tbl
/usr/src/linux-4.18.9/arch/x86/entry/syscalls/syscall_64.tbl
新增:
335 common test_one __x64_sys_test_one 338 common test_four __x64_sys_test_four
4、編譯啟動映像
make bzImage
5、編譯模組
make modules
6.1、先安裝模組
make modules_install
6.2、安裝核心
make install
7、update-grub2 命令會幫我們自動修改grub
8、重啟系統
sudo reboot
9、編寫測試用例:
test_one.c
#include<stdio.h> #include<unistd.h> #include<string.h> int main(int argc, char * argv[]) { long ret; char *buf = "335 syscall"; printf("buf addr is %p \n", buf); ret = syscall(335, strlen(buf) + 1, buf); if (ret == 1) { printf("Syscall Succeed!\n"); } else { printf("Syscall Failed!\n"); } return 0; }
test_four.c:
#include<stdio.h>
#include<unistd.h>
int main(int argc, char * argv[])
{
long ret;
int num = 338;
ret = syscall(338, num);
if (ret == 1) {
printf("Syscall Succeed!\n");
} else {
printf("Syscall Failed!\n");
}
return 0;
}
10、測試
./test_one
dmesg:
./test_four
dmesg:
成功!