如何找到Linux内核系统调用的实现?

Navaneeth KN

我试图mkdir通过查看内核源代码来理解一个函数的工作原理。这是一种尝试了解内核内部结构并在各种功能之间导航的尝试。我知道mkdir是在中定义的sys/stat.h我找到了原型:

/* Create a new directory named PATH, with permission bits MODE.  */
extern int mkdir (__const char *__path, __mode_t __mode)
     __THROW __nonnull ((1));

现在,我需要查看在哪个C文件中实现此功能。从源目录,我尝试了

ack "int mkdir"

哪个显示

security/inode.c
103:static int mkdir(struct inode *dir, struct dentry *dentry, int mode)

tools/perf/util/util.c
4:int mkdir_p(char *path, mode_t mode)

tools/perf/util/util.h
259:int mkdir_p(char *path, mode_t mode);

但是它们都不符合中的定义sys/stat.h

问题

  1. mkdir实施哪个文件
  2. 使用上面的函数定义,如何找出实现的文件?内核在定义和实现方法时遵循什么模式?

注意:我正在使用内核2.6.36-rc1

沃伦·杨(Warren Young)

系统调用不会像常规函数调用那样处理。它需要特殊的代码才能从用户空间过渡到内核空间,基本上是在调用站点上将一些内联汇编代码注入到您的程序中。“捕获”系统调用的内核端代码也是底层的东西,您可能至少在一开始时可能不需要深入了解。

include/linux/syscalls.h内核源目录下,您可以找到以下内容:

asmlinkage long sys_mkdir(const char __user *pathname, int mode);

然后在中/usr/include/asm*/unistd.h,您会发现:

#define __NR_mkdir                              83
__SYSCALL(__NR_mkdir, sys_mkdir)

这段代码说的mkdir(2)是系统调用#83。也就是说,系统调用是通过数字调用的,而不是通过地址调用,而不是像在您自己的程序或链接到该程序的库中的正常函数调用那样,通过地址进行调用。我上面提到的内联汇编粘合代码使用它来进行从用户到内核空间的转换,并带上您的参数。

还有一点证据表明这里有些奇怪,那就是系统调用并不总是有严格的参数列表:open(2)例如,可以使用2个或3个参数。这意味着open(2)重载,C的特征++,不是C,但系统调用接口是C兼容。(这与C的varargs功能不同,后者允许单个函数采用可变数量的参数。)

要回答您的第一个问题,没有单个文件mkdir()存在。Linux支持许多不同的文件系统,并且每个文件系统都有其自己的“ mkdir”操作实现。让内核将所有内容隐藏在单个系统调用之后的抽象层称为VFS因此,您可能想开始fs/namei.c使用vfs_mkdir()低级文件系统修改代码的实际实现在其他地方。例如ext4_mkdir(),定义了ext4实现fs/ext4/namei.c

关于第二个问题,是的,所有这些都有模式,但没有一条规则。实际上,您需要对内核的工作原理有一个相当广泛的了解,以便弄清楚应该在哪里寻找任何特定的系统调用。并非所有系统调用都涉及VFS,因此它们的内核端调用链并非都始于fs/namei.cmmap(2)例如,开始于mm/mmap.c,因为它是内核内存管理(“ mm”)子系统的一部分。

我建议您得到Bovet和Cesati的“了解Linux内核的副本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不重新编译Linux内核的情况下实现自己的系统调用?

如何在Linux内核4.x中实现我自己的系统调用?

带结构参数的Linux内核系统调用实现

如何使用Linux内核模块中的Linux系统调用

linux系统调用实现

如何正确拦截 Linux 内核 5.* 中的系统调用?

在Linux内核文件中使用系统调用

我如何找到我的系统调用已添加到内核?

如何为FreeBSD内核创建系统调用

如何在Linux内核4.x中添加系统调用

如何从Linux内核空间(即从自定义系统调用)添加自定义扩展属性

Linux内核如何知道哪个进程进行了系统调用?

Linux 内核如何看待文件系统

如何找到Linux内核Menuconfig依赖项?

在Linux内核中如何实现消息队列?

在Linux内核中如何实现percpu指针?

如何使用Linux内核列表实现队列?

如何在内核空间调用系统调用?

如果内核在处理系统调用时可以休眠,执行如何返回系统调用?

文件系统:内核调用与缓存

Linux内核如何处理Windows NTFS文件系统?

Linux内核如何从系统固件中检索ACPI表?

如何在文件系统中找到可变参数宏实现

如何/在哪里找到要修复的Linux内核错误?

如何找到可以在我的PC上正常运行的Linux内核?

Linux内核中如何实现I / O通道?

如何在Linux内核3.2中实现pthread?

如何阻止Linux“读取”系统调用被阻止?

linux如何识别特定文件系统以执行系统调用