CALL(sys_eventfd2)
CALL(sys_epoll_create1)
CALL(sys_dup3)
CALL(sys_pipe2)
/* 360 */ CALL(sys_inotify_init1)
CALL(sys_preadv)
CALL(sys_pwritev)
CALL(sys_rt_tgsigqueueinfo)
CALL(sys_perf_event_open)
CALL(sys_pk) #我自己加的系统调用
了解了一个系统调用的执行过程就可以试着添加一个自己的系统调用了:
内核:
1. 在内核代码实现一个系统调用函数,即 sys_xxx()函数,如我在 kernel/printk.c 中添加了
void pk()
{
printk(KERN_WARNING"this is my first sys call !\n");
}
2. 添加系统调用号 在 arch/arm/include/asm/Unistd.h
添加 #define __NR_pk (__NR_SYSCALL_BASE+365)
3. 添加调用函数指针列表 在arch/arm/keenel/Calls.S
添加 CALL(sys_pk)
4. 声明自己的系统调用函数 在include/linux/syscall.h
添加asmlinkage long sys_pk()
用户空间:
void pk()
{
__asm__(
"ldr r7 =365 \n"
"swi \n"
:
:
:
);
}
int main()
{
pk();
retrun 0;
}
完成上面的编写以后就可以编译内核和应用程序了。
将生成的文件在arm开发板上运行可以打印出: This is my first sys call!
说明我添加的系统调用可以使用。
至此,描述系统调用的实现机制和添加一个新的系统调用就完成了。