分析getdents64系统调用
在头文件include/uapi/asm-generic/unistd.h 中是所有内核支持的系统调用。通过_SYSCALL宏来定义。
#ifndef __SYSCALL
#define __SYSCALL(x, y)
#endif
/* fs/readdir.c */
#define __NR_getdents64 61
__SYSCALL(__NR_getdents64, sys_getdents64)
arch/arm64/kernel/sys.c
#undef __SYSCALL #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *); #include <asm/unistd.h> #undef __SYSCALL #define __SYSCALL(nr, sym) [nr] = __arm64_##sym, const syscall_fn_t sys_call_table[__NR_syscalls] = { [0 ... __NR_syscalls - 1] = __arm64_sys_ni_syscall, #include <asm/unistd.h> //arch/arm64/include/asm/unistd.h 将数组 函数指针全部指向__arm64_##sym,比如__arm64_sys_getdents64,这些函数参考下面的内容。 };include包含:
arch/arm64/include/asm/unistd.h
arch/arm64/include/uapi/asm/unistd.h
include/uapi/asm-generic/unistd.h
系统调用的具体实现通过SYSCALL_DEFINEx宏定义:
linux/syscalls.h
#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__) #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) #define SYSCALL_DEFINE_MAXARGS 6 #define SYSCALL_DEFINEx(x, sname, ...) \

文章详细介绍了Linux内核中getdents64系统调用的定义和实现过程,从头文件中的宏定义到arch/arm64层的函数映射,再到fs/readdir.c中的具体实现和ls命令的使用示例,揭示了系统如何处理目录遍历操作。
最低0.47元/天 解锁文章
892

被折叠的 条评论
为什么被折叠?



