《奔跑吧linux内核(入门篇)》第6章新增系统调用的坑

这本书略得真的有点多,非常考验初学者抗打击能力和使用搜索引擎能力(非褒义),核心原理内容都没有给初学者解释到位,什么都不知道的情况下照着书做肯定做不出来,初学者买个书就是为了买个教学大纲

一个小坑是获取UID的方法是current_uid().val。

大坑是书上说的那个头文件只是C语言定义表,并非真正的ARM32系统调用表,并非需要编辑的地方。

ARM32系统需要编辑的是下面两个地方:

1、系统调用总数

数量修正,注意不是加1,而是加4,这个主要是因为padding对齐的原因。

--- a/arch/arm/include/asm/unistd.h
+++ b/arch/arm/include/asm/unistd.h
@@ -19,7 +19,7 @@
  * This may need to be greater than __NR_last_syscall+1 in order to
  * account for the padding in the syscall table
  */
-#define __NR_syscalls  (388)
+#define __NR_syscalls  (392)
 
 /*
  * *NOTE*: This is a ghost syscall private to the kernel.  Only the

2、真正的系统调用表

--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -397,6 +397,7 @@
 /* 385 */      CALL(sys_memfd_create)
                CALL(sys_bpf)
                CALL(sys_execveat)
+               CALL(sys_helloworld)
 #ifndef syscalls_counted
 .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
 #define syscalls_counted

x64系统需要编辑地方:

注意随着内核版本的更新,在系统调用数量和名称修饰等细节方面可能会有改动,甚至系统调用表文件位置也有所不同。这里以Ubuntu 18.04所用的内核版本4.18.0为例。4.18.0内核需要改动的地方是arch/x86/entry/syscalls/syscall_64.tbl。其中__x64_前缀是SYSCALL_DEFINEn(name, ...)宏自动生成的前缀,如果不使用这个宏就不需要加__x64_前缀。

330	common	pkey_alloc		__x64_sys_pkey_alloc
331	common	pkey_free		__x64_sys_pkey_free
332	common	statx			__x64_sys_statx
333	common	io_pgetevents		__x64_sys_io_pgetevents
334	common	rseq			__x64_sys_rseq
335	64	mysyscall		__x64_sys_mysyscall

#
# x32-specific system call numbers start at 512 to avoid cache impact
# for native 64-bit operation. The __x32_compat_sys stubs are created
# on-the-fly for compat_sys_*() compatibility system calls if X86_X32
# is defined.
#
512	x32	rt_sigaction		__x32_compat_sys_rt_sigaction
513	x32	rt_sigreturn		sys32_x32_rt_sigreturn
514	x32	ioctl			__x32_compat_sys_ioctl

参考资料

https://blog.csdn.net/21cnbao/article/details/51295955

https://blog.csdn.net/baron_wu/article/details/83065594

发布了29 篇原创文章 · 获赞 1 · 访问量 3418

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/92572611