1. 程式人生 > >linux核心探索(3)--系統呼叫(傳參)

linux核心探索(3)--系統呼叫(傳參)

踩坑啊啊啊啊啊啊!!!

目錄

10、測試

核心版本:

開始:

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:

成功!