设为首页 加入收藏

TOP

关于Linux系统如何实现fork的研究(四)
2015-02-13 18:24:19 来源: 作者: 【 】 浏览:98
Tags:关于 Linux 系统 如何 实现 fork 研究
setuid16)
27? ? ? ? CALL(sys_getuid16)
28 /* 25 */? ? CALL(OBSOLETE(sys_stime))
29? ? ? ? CALL(sys_ptrace)
30? ? ? ? CALL(OBSOLETE(sys_alarm))? ? /* used by libc4 */
31? ? ? ? CALL(sys_ni_syscall)? ? ? ? /* was sys_fstat */
32? ? ? ? CALL(sys_pause)
33
34? ? ? ? ......................
35? ? ? ? ......................
36? ? ? ?
37 /* 120 */? ? CALL(sys_clone)? ? ? ? /* 120在此,之前传进来的系统调用号120进入内核后会到这 */
38? ? ? ? CALL(sys_setdomainname)
39? ? ? ? CALL(sys_newuname)
40? ? ? ? CALL(sys_ni_syscall)? ? ? ? /* modify_ldt */
41? ? ? ? CALL(sys_adjtimex)
42 /* 125 */? ? CALL(sys_mprotect)
43? ? ? ? CALL(sys_sigprocmask)
44? ? ? ? CALL(sys_ni_syscall)? ? ? ? /* was sys_create_module */
45? ? ? ? CALL(sys_init_module)
46? ? ? ? CALL(sys_delete_module)
47?
48? ? ? ? ......................
49? ? ? ? ......................
50? ? ? ?
51 /* 375 */? ? CALL(sys_setns)
52? ? ? ? CALL(sys_process_vm_readv)
53? ? ? ? CALL(sys_process_vm_writev)
54? ? ? ? CALL(sys_kcmp)
55? ? ? ? CALL(sys_finit_module)
56 /* 380 */? ? CALL(sys_sched_setattr)
57? ? ? ? CALL(sys_sched_getattr)
58? ? ? ? CALL(sys_renameat2)
59? ? ? ? CALL(sys_seccomp)
60? ? ? ? CALL(sys_getrandom)
61 /* 385 */? ? CALL(sys_memfd_create)
62? ? ? ? CALL(sys_bpf)
63 #ifndef syscalls_counted
64 .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
65 #define syscalls_counted
66 #endif
67 .rept syscalls_padding
68? ? ? ? CALL(sys_ni_syscall)
69 .endr


?


?


? ? CALL为一个宏,而我们使用的那一行CALL(sys_clone)配合ldrcc pc,[tbl,scno,lsl #2]使用的结果就是把sys_clone的地址放入pc寄存器。具体我们仔细分析一下,首先先看看CALL宏展开,然后把CALL代入ldrcc,结果就很清晰了


?


清楚的看出来,ldrcc最后是将sys_clone的函数地址存入了pc寄存器,而sys_clone函数内核是怎么定义的呢,如下


?1 /* 文件地址: linux内核目录/kernel/Fork.c */
?2
?3 /* 以下代码根据不同的内核配置定义了不同的clone函数
?4? * 其最终都调用的do_fork函数,我们先看看SYSCALL_DEFINE是怎么实现的吧,实现在此代码片段后面
?5? */
?6 #ifdef __ARCH_WANT_SYS_CLONE
?7 #ifdef CONFIG_CLONE_BACKWARDS
?8 SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
?9? ? ? ? ? int __user *, parent_tidptr,
10? ? ? ? ? int, tls_val,
11? ? ? ? ? int __user *, child_tidptr)
12 #elif defined(CONFIG_CLONE_BACKWARDS2)
13 SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags,
14? ? ? ? ? int __user *, parent_tidptr,
15? ? ? ? ? int __user *, child_tidptr,
16? ? ? ? ? int, tls_val)
17 #elif defined(CONFIG_CLONE_BACKWARDS3)
18 SYSCALL_DEFINE6(clone, unsigned long, clone_flags, unsigned long, newsp,
19? ? ? ? int, stack_size,
20? ? ? ? int __user *, parent_tidptr,
21? ? ? ? int __user *, child_tidptr,
22? ? ? ? int, tls_val)
23 #else
24 SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
25? ? ? ? ? int __user *, parent_tidptr,
26? ? ? ? ? int __user *, child_tidptr,
27? ? ? ? ? int, tls_val)
28 #endif
29 {
30? ? return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
31 }
32
33
34? /************************************************
35? * 我是代码分界线
36? ************************************************/
37
38 /* 文件地址: linux内核目录/include/linux.h */
39
40 #define SYSCALL_DEFINE0(sname) \
41? ? SYSCALL_METADATA(_##sname, 0); \
42? ? asmlinkage long sys_##sname(void)
43
44 #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
45 #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
46 #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
47 #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
48 #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
49 #define SYSCALL_DEFINE6(na

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Spring 4.0 中的 WebSocket 架构 下一篇对entry-common.S和call.S的部分..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: