Linux0.11启动过程
从开机加电,到执行main函数之前的过程
好吧,这里应该是有执行3个汇编的文件,但是我不太了解。囧
从main函数,到启动OK(即可以响应用户操作了)
这个步骤做了3件事情:
- 创建进程0,使之具备在主机中进行运算的能力,2.1
 - 已进程0为母本创建进程1,不仅有运算能力,而且还能以文件的行驶与外设进行数据交互,2.2-2.4
 - 以进程1为母本创建进程2,全面具备进程1的能力和环境,进一步具备支持“人机交互”,实现怠速,2.5-2.8
 
开中断之前的准备工作
- 复制根设备号和硬盘参数表
 - 物理内存规划格局:除了1MB以内的内核区之外,其余物理内存要完成的工作是不同的,对这三类不同性质的区域,在大小,位置,以及管理方式上进行规划
- “主内存区“:用来承载进程的相关信息,包括进程管理结构,进程对应的程序;
 - “缓冲区”:主机与外设进行数据交互的中转站
 - “虚拟盘区”:可选的区域,可将外设上的数据先复制到虚拟盘区,然后再使用。
 
 - 虚拟盘设置与初始化:rd_init(某个设备请求的函数,对应到内核某块代码?????)
 - 内存管理结构mem_map初始化:mem_init,对于1MB以上的内存都是分页管理的。
 - 异常处理类中断服务程序挂接:trap_init
 - 初始化块设备请求项结构
 - 与简历人机交互界面相关的外设的中断服务程序挂接
- 串行口设置
 - 显示器设置
 - 键盘设置
 
 - 开机启动时间设置:进程0需要具备对时间的掌控能力,time_init()
 - 系统开始激活进程0:sched_init函数开始
- 使其具备运算及创建其他进程的能力
 - 时刻具备参与多进程轮询的能力
 - 具备处理系统调用的能力
 
 - 进程相关事务初始化设置:
- “任务状态描述符表”和“局部数据描述符表”挂接到全局描述附表GDT中
 - 对GDT和进程管理结构task[64]中除了与进程0相关的位置外,清空设置
 - 将GDT中关于进程0的“任务状态描述符”和“局部数据描述符”分别记录在CPU中的“任务状态寄存器”和“局部数据寄存器”中。
 
 - 时钟中断设置
 - 系统调用服务程序挂接:set_system_gate与中断描述符表挂接
 - 初始化缓冲区管理结构
 - 初始化硬盘hd_init,hd_interrupt
 - 初始化软盘floppy_init
 - 开中断:系统中所有中断服务程序都已经和中断描述附表正常挂接,中断服务构建完毕,系统可以在32位保护模式下处理中断信号了。
 
进程创建的最基本动作
- OS为进程0创建进程1做准备,
- move_to_user_mode,从内核态转换到用户态
 - 上述函数后,相当于进行了一次中断返回,CS特权级从0转换到3,内核→用户
 - 用户态的进程0,从LDT去的代码段描述符,与弹出的EIP组成线性地址
 - 调用fork函数
 
 - 在进程槽中为进程1申请一个空闲位置并且获取进程号
- find_empty_process,为进程1获得可用的进程号和空闲的任务号
 - 全局变量last_pid存放系统开机以来累计的进程数。
 - 内核的数据区中有个task[NR_TASKS]进程槽,存放task_struct指针。第一次遍历该数组,判断获得的进程号是否可用。ifyes,第二次遍历获得一个空的task_struct。linux0.11中,最多64个进程。
 
 - 复制进程信息之前,先将一些数据压栈:将进程0的管理结构拷贝给进程1的管理结构
- copy_process
 
 - 初步设置进程1管理结构
- 进程0的母本包括:“进程0的管理结构”,“进程0的页表项”
 
 - 进程0创建进程1的过程中发生时钟中断(场景分析)
- 中断服务程序开始工作,跳转到_timer_interrupt执行,xxx压入进程0内核栈,保护现场
 - _do_timer判断是否需要进程切换
 
 - 从时钟中断返回
- ret_from_sys_call开始执行
 
 - 调整进程1管理结构
- 进程0的管理结构数据信息不一定全都适用于进程1,还需针对具体情况调整。
 
 - 设置进程1的线性地址空间及物理页面
- 创建页目录项和复制页表,从copy_mem开始
 - copy_page_tables
 
 - 调整进程1管理结构
 - OS如何区分进程0和进程1
- _syscall0函数中,if(res>=0)这一行就是进程0中断返回后将要执行的第一行指令。。。
 - 到底如何区分,我也没搞清楚。。。
 
 - 进程0准备切换到进程1
 - 系统切换到进程1执行
 
加载根文件系统(进程1来完成;原文中均有流程图说明)
- 进程1通过对一些与硬盘管理相关的数据结构进行设置,进一步为进程依托系统与硬盘以文件行驶进行数据交互创造条件
 - 进程11用虚拟盘代替软盘,使之成为根设备
 - 进程1以虚拟盘中提供的数据为依据,加载根文件系统
 
- 开始执行:从_syscall0的if(__res>=0)这行代码开始,然后调用init函数
 - 开始执行:在init中,先调用setup
 - 进程1开始以数据块的形式操作硬盘
 - 将找到的缓冲块与请求项挂接
 - 将请求项与硬盘处理函数挂接
 - 进行硬盘读盘前的准备工作
 - 给硬盘下达读盘指令
 - 进程1由于等待读盘操作挂起
 - 系统切换到进程0执行
 - 进程0的执行过程
 - 进程0执行过程中发生硬盘中断
 - 硬盘中断服务程序响应后,进程0继续执行
 - 再次响应硬盘中断并唤醒进程1
 - 读盘操作完成后,进程1继续执行
 - 进程1继续设置硬盘管理结构
 - 进程1获取软盘超级块,为加载根文件系统做准备
 - 进程1备份超级快数据
 - 进程1将根文件系统从软盘拷贝到虚拟盘
 - 进程1开始加载根文件系统
 - 进程1准备根文件系统超级块
 - 进程1准备读取根目录i节点
 - 进程1加载根目录i节点 1。进程1结束加载根文件系统的过程
 
打开中断设备文件及复制文件句柄
- 进程1与内核文件表挂接,为打开文件做准备
 - 确定打开操作的起点
 - 获得枝梢i节点-dev目录文件的i节点
 - 确定dev目录文件i节点为枝梢i节点
 - 继续返回枝梢i节点
 - 查找tty0文件的i节点
 - 将tty0设备文件的i节点返回给sys_open系统调用
 - 分析tty0文件i节点
 - 设置文件管理结构并返回给用户进程
 - 进程1复制tty0文件句柄
 
创建进程2
进程1等待进程2退出
shell程序的加载
系统实现怠速
Linux0.11启动过程的更多相关文章
- 11.Linux启动过程详解
		
目录: 本文转载自:http://blog.csdn.net/miss_acha/article/details/50004717 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一 ...
 - Linux0.11从开机到准备执行main函数的启动学习
		
最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照Linux From Scratch那样的把改造后的系统编译运行就心满意足了.正 ...
 - Linux0.11内核剖析--内核体系结构
		
一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...
 - linux0.11下的中断机制分析
		
http://orbt.blog.163.com/ 异常就是控制流中的突变,用来响应处理器状态中的某些变化.当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用, ...
 - linux0.12 编译过程
		
感谢这篇文章的作者: http://www.cnblogs.com/strugglesometimes/p/4231359.html 编译是个很蛋疼的事情,本想把linux0.12在bochs上 ...
 - linux0.11学习笔记(1)
		
公布软件包包括内容: bootimage.Z - 具有美国键盘代码的压缩启动映像文件: rootimage.Z - 以1200kB 压缩的根文件系统映像文件: linux-0.11.tar.Z- 内核 ...
 - Linux0.11小结
		
第一部分 基础内容 1.操作系统基础 操作系统是计算机硬件系统与用户程序间重要环节,理解操作系统的原理是编写优秀代码的基础.教课书中阐述的操作系统一般由5部分组成. 一个最简单的操作系统,可以 ...
 - Linux0.11进程切换和TSS结构
		
TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息. X86体系从硬件上支持任务间的切换.为此目的,它增设了一个新段:任务状态段( ...
 - 对Linux0.11 中 进程0 和 进程1分析
		
1. 背景 进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节.比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有 ...
 
随机推荐
- JavaScript的事件、DOM模型、事件流模型以及内置对象详解(三)
			
JS中的事件 JS中的事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize ...
 - MySQL系列教程(二)
			
mySQL执行计划 语法 explain <sql语句> 例如: explain select * from t3 where id=3952602; explain输出解释 +---- ...
 - Oracle性能优化-读懂执行计划
			
Oracle的执行计划 得到执行计划的方式 Autotrace例子 使用Explain explain plan set STATEMENT_ID='testplan' for select * fr ...
 - Android简易实战教程--第四十三话《上拉加载与下拉刷新》
			
ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现.本篇案例是基于xlistview的. 布局: <RelativeLayout xmlns:android= ...
 - Android简易实战教程--第四十一话《vitamio网络收音机》
			
在Android初级教程专栏里面,介绍了Android原生的VideoView和vitamio框架Android视频媒体相关,VideoView和开源框架vitamio.并演示了播放网络视频的对应的D ...
 - Intellij IDEA 插件开发之自建插件仓库
			
Intellij IDEA 有一个自己的官方的插件仓库,但是当我们的开发的 Intellij IDEA 的插件不能够对外公开时,我们就需要搭建自己的 Intellij IDEA 的插件仓库.前不久我们 ...
 - x264源代码简单分析:编码器主干部分-2
			
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
 - java.io.FileNotFoundException: ..\lib\commons-el.jar
			
安装openfire成功后,启动遇到java.io.FileNotFoundException: ..\lib\commons-el.jar错误,并不是缺少了jar包,只需以管理员身份运行即可解决.
 - python+OpenCV 特征点检测
			
1.Harris角点检测 Harris角点检测算法是一个极为简单的角点检测算法,该算法在1988年就被发明了,算法的主要思想是如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点.基本原理是根据 ...
 - Ubuntu 16.04 安装和使用QQ最简洁的方式
			
推荐参考网址: 1 http://www.ubuntukylin.com/ 2 http://www.ubuntukylin.com/application/ Wine QQ 1 http:// ...