arm64系统调用之getdents64

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

分析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, ...) \ 
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古井无波1999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值