2

I am trying to find the implementation codes of the functions defined in syscalls.h of linux kernel. For example, I see the following function prototype in syscalls.h file

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 *);

But I cannot find the actually implementation in my linux source directory. I am particularly interested in the implementation about the sys_uname function. Can some one help me where I can find it in the linux source tree? I am using ubuntu 12.10.

4

2 回答 2

4

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

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源文件也是。

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

于 2013-05-28T20:05:54.767 回答
1

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

于 2013-05-28T18:56:00.977 回答