Linux源码分析:主流程:Linux 1.0

结构

在这里插入图片描述

主流程

boot/head.S

startup_32:
...
  call start_kernel

0号进程: start_kernel

void start_kernel(){
  //...
  int process_1_pid; //进程1的进程号. 恰巧进程1的进程号也是1, 这只是个巧合. 
  
  process_1_pid=fork();
  
  //从本行(本行是注释所在行, 即执行完上一行代码后) 开始, 当前进程(0号进程)复制出另一个进程(子进程:1号进程),
  //且 父子进程都从此行继续开始执行, 
  // 父进程(0号进程)的 变量process_1_pid 为 子进程的进程号(这里子进程的进程号是1)
  // 子进程(1号进程)的 变量process_1_pid 为 0

  if(!process_1_pid){//所以 子进程(1号进程) 此条件成立,  而 父进程(0号进程) 此条件不成立.  注意 父子进程都执行了本行. 
    // 子进程(1号进程:init进程) 进入到这里
    init();
    
    //注意init内部代码结构是个死循环, 因此子进程(1号进程:init进程)不可能进入到本行
  }
  
  //而 父进程(0号进程) 进入到这里
  for(;;){
    // 父进程(0号进程) 进入一个不能过多占用cpu的死循环中 做一些 貌似无关紧要的工作
    idle();
  }
}

1号进程: init

void init(){
	int pid_shell_for_user;  //用户shell进程的进程号
	int shell_process_exit_code; //用户shell进程的退出码
	
	//忽略以下三行, 不影响对主流程的理解
	//execve("/etc/init",argv_init,envp_init);
	//execve("/bin/init",argv_init,envp_init);
	//execve("/sbin/init",argv_init,envp_init);

	//循环启动shell进程: 当shell进程退出后再继续启动shell进程
	//shell进程作用: 等待用户登陆、与用户交互式的执行命令
	while(true){
		pid_shell_for_user=fork();
		//从本行开始, 复制出子进程,  父进程(1号进程:init进程)、子进程都从本行继续执行
		if(pid_shell_for_user<0){
			//fork shell进程 失败
			continue;
		}
		if(!pid_shell_for_user){
			//子进程进入这里
			//...
			
			//替换子进程的代码段为/bin/sh的代码段, 即子进程成为shell进程
			execve("/bin/sh",argv,envp);


			//子进程: 若execve能正常替换代码段, 则不可能执行到本行
			
			//...
		}
		//所以子进程不可能进入到这里, 而父进程(1号进程:init进程)进入到这里
		while(true){
			//父进程(1号进程:init进程) 等待, 直到 子进程(用户shell进程)退出
			if(pid_shell_for_user==wait(&shell_process_exit_code)){
				break;
			}
		}
		//父进程(1号进程:init进程)发现 子进程(用户shell进程)退出, 于是本循环将继续重新开始, 继续启动新的子进程(用户新的sell进程) 来 供给 用户登陆、与用户交互式的执行命令
		//打印消息: 用户shell进程 pid_shell_for_user 以 退出码 shell_process_exit_code 死亡
		//...
	}
	
}

init: 原始代码
红框中代码完全和绿框中代码作用一样的,
所以直接去掉红框 并不影响主流程
在这里插入图片描述

中断

中断有两个意义,

  1. 一是普通意义的中断:cpu指令周期中有一段专门检测是否有中断发生、中断处理程序、对用户来说中断相当于函数调用
  2. 二是权限隔离:中断处理程序是内核的一部分 运行在最高权限ring0(内核态)、而调用中断指令运行在最低权限ring3(用户态), 这是普通的函数调用指令没有的样子

故而, 中断==函数调用、在cpu每指令中轮询问是否调用、权限提升

linux1.0 利用了 第0x80号软中断 ,在这一个中断处理程序中, 自定义了各种子功能(即各种系统调用:创建进程fork、文件打开、文件关闭、文件读取、……)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值