我试图找到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/