博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核进程管理启动rest_init
阅读量:2344 次
发布时间:2019-05-10

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

在这里插入图片描述

pid = kernel_thread(kernel_init, NULL, CLONE_FS);

kernel_init

{。。。。kernel_init_freeable();。。。/*ramdisk_execute_command  	a.如果命令行参数中指定了“rdinit=...”,则ramdisk_execute_command等于这个参数指定的程序。  	b.否则,如果/init程序存在,ramdisk_execute_command就等于/init  	c.否则,ramdisk_execute_command为空*/	if (ramdisk_execute_command) {		ret = run_init_process(ramdisk_execute_command);		if (!ret)			return 0;		pr_err("Failed to execute %s (error %d)\n",		       ramdisk_execute_command, ret);	}		if (execute_command) {		ret = run_init_process(execute_command);		if (!ret)			return 0;		panic("Requested init %s failed (error %d).",		      execute_command, ret);	}	if (!try_to_run_init_process("/sbin/init") ||	    !try_to_run_init_process("/etc/init") ||	    !try_to_run_init_process("/bin/init") ||	    !try_to_run_init_process("/bin/sh"))		return 0;}
void __init kernel_init_freeable(void){。。。	/* Open the /dev/console on the rootfs, this should never fail */	if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)		pr_err("Warning: unable to open an initial console.\n");。。。}
static int run_init_process(const char *init_filename){	argv_init[0] = init_filename;	pr_info("Run %s as init process\n", init_filename);	return do_execve(getname_kernel(init_filename),		(const char __user *const __user *)argv_init,		(const char __user *const __user *)envp_init);}

do_execve函数大部分都在构建一个struct linux_binprm *bprm;的结构体。

sys_execve() > do_execve() > do_execveat_common > search_binary_handler() > load_elf_binary()

exec_binprm() > search_binary_handler > fmt->load_binary(bprm);

fmt->load_binary(bprm);是用可执行文件来替换当前进程的内存空间的,并设置eip的值到main。那么当前进程就会被替换为需要执行的可执行文件。

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

你可能感兴趣的文章
spring源码
查看>>
上传jar包到nexus私服
查看>>
lambda和抽象类
查看>>
idea自定义文档注释模板
查看>>
Enterprise Architect 生成项目类图
查看>>
idea导出配置
查看>>
JVM学习资料收集
查看>>
Codility经典算法题之九:MissingInteger
查看>>
静态导入
查看>>
java 获取路径
查看>>
spring boot 打印sql
查看>>
我的死锁经历
查看>>
spring boot日志配置
查看>>
list排序
查看>>
搭建zookeeper集群
查看>>
1005. 数独
查看>>
1006. 求和游戏
查看>>
IDEA eclipse 控制台日志输出到文件
查看>>
1022. Fib数列
查看>>
一些开源项目
查看>>