uname系统调用入口
<kernel/sys.c> SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name) { int errno = 0; down_read(&uts_sem); if (copy_to_user(name, utsname(), sizeof *name)) errno = -EFAULT; up_read(&uts_sem); if (!errno && override_release(name->release, sizeof(name->release))) errno = -EFAULT; if (!errno && override_architecture(name)) errno = -EFAULT; return errno; }其中调用utsname,定义如下:
<include/linux/utsname.h> static inline struct new_utsname *utsname(void) { return ¤t->nsproxy->uts_ns->name; }uts_ns的定义来自init_uts_ns
struct uts_namespace init_uts_ns = { .kref = { .refcount = ATOMIC_INIT(2), }, .name = { .sysname = UTS_SYSNAME, .nodename = UTS_NODENAME, .release = UTS_RELEASE, .version = UTS_VERSION, .machine = UTS_MACHINE, .domainname = UTS_DOMAINNAME, }, .user_ns = &init_user_ns, };而UTS_VERSION定义在
<include/generated/compile.h> #define UTS_VERSION "#1 PREEMPT Thu Aug 22 10:10:49 CST 2013"compile.h是在kernel/scripts/mkcompile_h这个脚本生成