函数逻辑报告 |
Source Code:kernel\fork.c |
Create Date:2022-07-27 09:58:08 |
Last Modify:2020-03-17 11:04:53 | Copyright©Brick |
首页 | 函数Tree |
注解内核,赢得工具 | 下载SCCT | English |
函数名称:创建进程
函数原型:static __latent_entropy struct task_struct *copy_process(struct pid *pid, int trace, int node, struct kernel_clone_args *args)
返回类型:struct task_struct
参数:
类型 | 参数 | 名称 |
---|---|---|
struct pid * | pid | 任务标志 |
int | trace | |
int | node | |
struct kernel_clone_args * | args |
1830 | pidfd等于负1 |
1834 | clone_flags等于flags |
1840 | 如果clone_flags按位与在新的namespace启动子进程按位或共享文件系统的值的值恒等于在新的namespace启动子进程按位或共享文件系统的值则返回:错误号 |
1850 | 如果clone_flags按位与属于同一个线程组且非clone_flags按位与共享信号处理的值则返回:错误号 |
1858 | 如果clone_flags按位与共享信号处理且非clone_flags按位与共享虚拟内存的值则返回:错误号 |
1867 | 如果clone_flags按位与新进程与创建它的进程是“兄弟”而不是“父子”且flags按位与r init: ignore fatal signals 则返回:错误号 |
1875 | 如果clone_flags按位与属于同一个线程组则 |
1876 | 如果clone_flags按位与新用户空间按位或新进程空间的值或task_active_pid_ns(当前进程)不等于pid_ns_for_children则返回:错误号 |
1888 | 如果clone_flags按位与Unused, ignored 按位或属于同一个线程组的值则返回:错误号 |
1898 | sigemptyset( & signal) |
1899 | INIT_HLIST_NODE( & node) |
1901 | spin_lock_irq( & siglock) |
1902 | 如果非clone_flags按位与属于同一个线程组的值则hlist_add_head( & node, & multiprocess) |
1904 | recalc_sigpending() |
1905 | spin_unlock_irq( & siglock) |
1906 | retval等于负ERESTARTNOINTR |
1907 | 如果signal_pending(当前进程)则转到:fork_out |
1921 | 设置子进程tid = (clone_flags & 设置子进程tid) ? child_tid : NULL |
1925 | 清除子进程tid = (clone_flags & 清除子进程tid) ? child_tid : NULL |
1927 | ftrace_graph_init_task(p) |
1929 | 进程互斥锁初始化 |
1936 | 如果atomic_read( & processes)大于等于task_rlimit(p, RLIMIT_NPROC)则 |
1938 | 如果真实用户身份不等于INIT_USER且非操作权限检查且非操作权限检查则转到:bad_fork_free |
1944 | retval等于copy_creds(p, clone_flags) |
1945 | 如果retval小于0则转到:bad_fork_free |
1954 | 如果活跃进程数大于等于活跃进程限制数则转到:bad_fork_cleanup_count |
1957 | 初始化延迟记录 |
1958 | 任务标志与等于使用超级用户权限按位或进程处于工作队列中按位或I am an IDLE thread 的值的反 |
1960 | 初始化链表头 |
1961 | 初始化链表头 |
1962 | rcu_copy_process(p) |
1963 | 完成量 = NULL |
1964 | spin_lock_init( & Protection against (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, mempolicy: ) |
1966 | 初始化信号发送 |
1972 | prev_cputime_init( & 进程耗时) |
1984 | 默认空闲时间等于timer_slack_ns |
1990 | 初始化I/O记录 |
1991 | 清除累计 |
1995 | 异步I/O请求 = NULL |
1996 | audit_set_context(p, NULL) |
1997 | cgroup_fork(p) |
2000 | 如果是错误则 |
2027 | pagefault_disabled等于0 |
2042 | retval等于sched_fork(clone_flags, p) |
2043 | 如果retval则转到:bad_fork_cleanup_policy |
2046 | retval等于perf_event_init_task(p) |
2047 | 如果retval则转到:bad_fork_cleanup_policy |
2050 | 如果retval则转到:bad_fork_cleanup_perf |
2053 | shm_init_task(p) |
2054 | retval等于security_task_alloc(p, clone_flags) |
2055 | 如果retval则转到:bad_fork_cleanup_audit |
2058 | 如果retval则转到:bad_fork_cleanup_security |
2061 | 如果retval则转到:bad_fork_cleanup_semundo |
2064 | 如果retval则转到:bad_fork_cleanup_files |
2067 | 如果retval则转到:bad_fork_cleanup_fs |
2070 | 如果retval则转到:bad_fork_cleanup_sighand |
2073 | 如果retval则转到:bad_fork_cleanup_signal |
2076 | 如果retval则转到:bad_fork_cleanup_mm |
2079 | 如果retval则转到:bad_fork_cleanup_namespaces |
2081 | retval等于Architectures that haven't opted into copy_thread_tls get the tls argument* via pt_regs, so ignore the tls argument passed via C. |
2083 | 如果retval则转到:bad_fork_cleanup_io |
2086 | stackleak_task_init(p) |
2088 | 如果任务标志不等于init_struct_pid则 |
2091 | 如果是错误则 |
2093 | 转到:bad_fork_cleanup_thread |
2103 | retval等于get_unused_fd_flags(O_RDWR | O_CLOEXEC) |
2104 | 如果retval小于0则转到:bad_fork_free_pid |
2109 | pidfile等于anon_inode_getfile("[pidfd]", & pidfd_fops, 任务标志, O_RDWR | O_CLOEXEC) |
2111 | 如果是错误则 |
2119 | 如果retval则转到:bad_fork_put_pidfd |
2124 | 堆栈堵塞 = NULL |
2126 | futex_init_task(p) |
2131 | 如果clone_flags按位与共享虚拟内存按位或父进程被挂起,直至子进程释放虚拟内存资源的值的值恒等于共享虚拟内存则sas_ss_reset(p) |
2138 | user_disable_single_step(p) |
2139 | 清除线程指定标志 |
2141 | 清除线程指定标志 |
2143 | clear_tsk_latency_tracing(p) |
2147 | 如果clone_flags按位与属于同一个线程组则 |
2151 | 否则 |
2154 | 否则进程退出时发出的信号等于exit_signal |
2160 | 赃页数等于0 |
2161 | 赃页阀值等于128右移PAGE_SHIFT determines the page size 减10位 |
2162 | 开始写暂停时间等于0 |
2164 | 父进程终止时发出的信号等于0 |
2165 | 初始化链表头 |
2166 | 回调队列 = NULL |
2168 | 开始摘除线程组 |
2175 | retval等于cgroup_can_fork(p) |
2176 | 如果retval则转到:bad_fork_cgroup_threadgroup_change_end |
2187 | 进程创建时间戳等于ktime_get_ns() |
2194 | write_lock_irq( & tasklist_lock) |
2197 | 如果clone_flags按位与新进程与创建它的进程是“兄弟”而不是“父子”按位或属于同一个线程组的值则 |
2198 | 真正的父进程等于real_parent |
2199 | 线程组跟踪等于parent_exec_id |
2200 | 否则 |
2202 | 线程组跟踪等于self_exec_id |
2205 | klp_copy_process(p) |
2207 | 加自旋锁 |
2213 | 复制安全计算 |
2215 | rseq_fork(p, clone_flags) |
2218 | 如果此条件成立可能性小(为编译器优化)(!(pid_allocated & PIDNS_ADDING))则 |
2220 | 转到:bad_fork_cancel_cgroup |
2224 | 如果fatal_signal_pending(当前进程)则 |
2226 | 转到:bad_fork_cancel_cgroup |
2230 | 如果pidfile则fd_install(pidfd, pidfile) |
2233 | init_task_pid_links(p) |
2234 | 如果此条件成立可能性大(为编译器优化)(进程ID)则 |
2235 | 调试跟踪初始化 |
2237 | 初始化进程标志 |
2238 | 如果thread_group_leader(p)则 |
2239 | 初始化进程标志 |
2240 | 初始化进程标志 |
2241 | 初始化进程标志 |
2243 | 如果是资源回收器则 |
2244 | child_reaper等于p |
2245 | 任务标志或等于r init: ignore fatal signals |
2256 | 添加链表项 |
2257 | 添加RCU链表项 |
2261 | __this_cpu_inc(process_counts) |
2262 | 否则 |
2273 | 活跃进程数自加 |
2275 | 总计创建次数自加 |
2276 | hlist_del_init( & node) |
2277 | 自旋锁解锁 |
2278 | syscall_tracepoint_update(p) |
2279 | write_unlock_irq( & tasklist_lock) |
2281 | 关联进程与proc文件系统 |
2282 | cgroup_post_fork(p) |
2283 | 摘除线程组完成 |
2284 | perf_event_fork(p) |
2286 | trace_task_newtask(p, clone_flags) |
2287 | uprobe_copy_process(p, clone_flags) |
2289 | 返回:p |
2291 | bad_fork_cancel_cgroup : |
2292 | 自旋锁解锁 |
2293 | write_unlock_irq( & tasklist_lock) |
2294 | cgroup_cancel_fork(p) |
2296 | 摘除线程组完成 |
2297 | bad_fork_put_pidfd : |
2300 | put_unused_fd(pidfd) |
2302 | bad_fork_free_pid : |
2303 | 如果任务标志不等于init_struct_pid则free_pid(任务标志) |
2305 | bad_fork_cleanup_thread : |
2306 | exit_thread(p) |
2307 | bad_fork_cleanup_io : |
2308 | 如果异步I/O请求则exit_io_context(p) |
2310 | bad_fork_cleanup_namespaces : |
2311 | exit_task_namespaces(p) |
2312 | bad_fork_cleanup_mm : |
2313 | 如果内存信息则 |
2317 | bad_fork_cleanup_signal : |
2318 | 如果非clone_flags按位与属于同一个线程组的值则free_signal_struct(信号) |
2320 | bad_fork_cleanup_sighand : |
2321 | __cleanup_sighand(sighand) |
2322 | bad_fork_cleanup_fs : |
2324 | bad_fork_cleanup_files : |
2325 | exit_files(p) |
2326 | bad_fork_cleanup_semundo : |
2328 | bad_fork_cleanup_security : |
2329 | security_task_free(p) |
2330 | bad_fork_cleanup_audit : |
2331 | audit_free(p) |
2332 | bad_fork_cleanup_perf : |
2333 | perf_event_free_task(p) |
2334 | bad_fork_cleanup_policy : |
2335 | lockdep_free_task(p) |
2337 | mpol_put( Protected by alloc_lock: ) |
2340 | delayacct_tsk_free(p) |
2341 | bad_fork_cleanup_count : |
2342 | atomic_dec( & processes) |
2343 | exit_creds(p) |
2344 | bad_fork_free : |
2346 | put_task_stack(p) |
2347 | delayed_free_task(p) |
2348 | fork_out : |
2349 | spin_lock_irq( & siglock) |
2350 | hlist_del_init( & node) |
2351 | spin_unlock_irq( & siglock) |
2352 | 返回:错误号 |
源代码转换工具 开放的插件接口 | X |
---|---|
支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |