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

结构

Linux源码分析:主流程:Linux 1.0_第1张图片

主流程

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: 原始代码
红框中代码完全和绿框中代码作用一样的,
所以直接去掉红框 并不影响主流程
Linux源码分析:主流程:Linux 1.0_第2张图片

中断

中断有两个意义,

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

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

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

你可能感兴趣的:(linux,系统架构,鸿蒙系统)