linux - Linux内核中syscalls.h中函数的实现在哪里

标签 linux kernel system-calls

我试图找到linux内核的syscalls.h中定义的函数的实现代码。例如,我在 syscalls.h 文件中看到以下函数原型(prototype)

asmlinkage long sys_gethostname(char __user *name, int len);
asmlinkage long sys_sethostname(char __user *name, int len);
asmlinkage long sys_setdomainname(char __user *name, int len);
asmlinkage long sys_newuname(struct new_utsname __user *name);
asmlinkage long sys_uname(struct old_utsname __user *);
asmlinkage long sys_olduname(struct oldold_utsname __user *);

但是我在我的linux源目录中找不到实际的实现。我对 sys_uname 函数的实现特别感兴趣。有人可以帮我在 linux 源代码树中哪里可以找到它吗?我使用的是 ubuntu 12.10。

最佳答案

这些定义很难找到,因为它们使用宏。

grep sys_uname **/*.[ch]

发现了一些用途,但没有实现。但是寻找SYSCALL_DEFINE并且...

grep 'SYSCALL_DEFINED.*uname' **/*.[ch]

你会得到这个:

kernel/sys.c:SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
kernel/sys.c:SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
kernel/sys.c:SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)

不能保证宏在将来的某个时候不会被重新设计,除此之外还有其他类似的东西很难找到,所以这是我用来查找东西的技巧:转到你已经找到的树上实际上编译了一个内核,并 grep 目标文件。

nm -A **/*.o | grep sys_uname

结果(去掉无聊的东西)是:

kernel/built-in.o:000000000001258b T sys_uname
kernel/sys.o:00000000000023df T sys_uname
vmlinux.o:00000000000391a3 T sys_uname

vmlinux.o 基本上是整个内核,所以 sys_uname 当然在那里。这并没有告诉我们任何事情。 built-in.o 位于由该目录中链接在一起的所有目标文件组成的任何目录中(不包​​括模块 - 仅内置模块),因此也请忽略它。如果您收到任何带有 U 且没有地址的行,请忽略这些行。剩下的就是答案:kernel/sys.o 是目标文件,因此 kernel/sys.c 是源代码。

如果您正在寻找纯粹宏的实现,或者实际上并未包含在编译的内核配置中,因为它不会出现在目标文件中,则此方法将失败。

关于linux - Linux内核中syscalls.h中函数的实现在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799263/

相关文章:

linux - 如何针对目录中的多个文件执行 Pig 脚本

将数据从内核空间复制到用户空间

c - 为什么 lseek 使用偏移量 `-2` 而不是 `-1` 来反向读取?

linux - 什么是抢占/什么是可抢占内核?到底有什么好处呢?

c - 有关 C 语言文件和 I/O 系统调用的基础问题(在 Linux/UNIX 上)

linux - Knife 工问题

c++ - 在 linux 上将共享库与未解析的符号链接(symbolic link)

php - 我的虚拟主机主目录中的数据库连接

linux-kernel - 通过 mmap 提供多个内核缓冲区

c - 为什么操作系统需要/维护内核线程?