博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于2.6.11内核init进程
阅读量:2383 次
发布时间:2019-05-10

本文共 5096 字,大约阅读时间需要 16 分钟。

1. 流程

start_kernel()---->rest_init()

rest_init的定义如下:

371 static void noinline rest_init(void)                                            372         __releases(kernel_lock)                                                 373 {                                                                               374         kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);      //进程的入口函数是init函数              375         printk(KERN_ERR "tom rest_init=%x",init);                                                                                                          376         numa_default_policy();                                                  377         unlock_kernel();                                                        378         preempt_enable_no_resched();                                            379         cpu_idle();                                                             380 }

2. kernel_thread

在kernel_thread的参数:

fn: 函数入口
arg:
flags:

297 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)           298 {                                                                               299         if(flags==(CLONE_FS | CLONE_SIGHAND))                                   300             printk(KERN_ERR "tom  kernel_thread\n");                            301         struct pt_regs regs;                                                    302                                                                                 303         memset(&regs, 0, sizeof(regs));                                         304                                                                                 305         regs.ebx = (unsigned long) fn;                                          306         regs.edx = (unsigned long) arg;                                         307                                                                                 308         regs.xds = __USER_DS;                                                   309         regs.xes = __USER_DS;                                                   310         regs.orig_eax = -1;                                                     311         regs.eip = (unsigned long) kernel_thread_helper;                        312         regs.xcs = __KERNEL_CS;                                                 313         regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;      314                                                                                 315         /* Ok, create the new process.. */                                      316         return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);317 }

dup_task_struct

134 static struct task_struct *dup_task_struct(struct task_struct *orig)             135 {                                                                                                         136         if ( !strcmp(orig->comm, "swapper"))                                                              137                             printk(KERN_ERR "tom dup_task_struct\n");            138         struct task_struct *tsk;                                                 139         struct thread_info *ti;                                                  140                                                                                  141         prepare_to_copy(orig);                                                   142                                                                                  143         tsk = alloc_task_struct();                                               144         if (!tsk)                                                                145                 return NULL;                                                     146                                                                                  147         ti = alloc_thread_info(tsk);                                             148         if (!ti) {                                                               149                 free_task_struct(tsk);                                           150                 return NULL;                                                     151         }                                                                                                                                                  152                                                                                  153         *ti = *orig->thread_info;                                                154         *tsk = *orig;                                                            155         tsk->thread_info = ti;                                                   156         ti->task = tsk;                                                          157                                                                                  158         /* One for us, one for whoever does the "release_task()" (usually parent) */ 159         atomic_set(&tsk->usage,2);                                               160         return tsk;                                                              161 }

转载地址:http://gafab.baihongyu.com/

你可能感兴趣的文章
冒号和他的学生们(连载13)——范式总结
查看>>
A Proposal on Organization of Information System
查看>>
冒号和他的学生们(连载2)——首轮提问
查看>>
正则表达式与文件格式化处理
查看>>
Java EE互联网轻量级框架整合开发
查看>>
Java语言程序设计(基础篇)
查看>>
大型网站技术架构:核心原理与案例分析
查看>>
JAVA并发编程实战
查看>>
RabbitMQ实战++高效部署分布式消息队列
查看>>
微服务设计
查看>>
Spring Cloud微服务实战
查看>>
C++ static 语义
查看>>
C++ static 语义
查看>>
Linux Cgroups概述
查看>>
centos7 硬盘性能测试
查看>>
cgroup使用--cpu资源限制
查看>>
cgroup使用--memory资源限制
查看>>
Redis 单机环境搭建
查看>>
elasticsearch 单机环境搭建
查看>>
spark 独立模式部署
查看>>