2013-05-28 109 views
2

我想找到在linux内核的syscalls.h定义的功能的实现代码。例如,我看到syscalls.h文件其中是在Linux内核syscalls.h内的功能的实现

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。

回答

1

它们是自动生成的。请参阅(例如,用于x86)arch/x86/syscalls中的代码。特别是使用sys_uname(),您会注意到实际上有几个实现(sys_olduname,sys_uname,sys_newuname),具体取决于调用进程的系统调用号和处理器模式。

+0

我没有在源码树中看到文件arch/x86/syscalls?它是在'make'过程中产生的吗?请给我更多关于它的细节? – user2423523

+1

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/x86/syscalls –

2

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

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是源代码。

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