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