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启动过程相关推荐
- linux0.11 init函数,linux0.11启动与初始化
简单描述Linux0.11的启动与初始化过程. 启动过程中需要关注:IDT, GDT, LDT, TSS, 页表, 堆栈这些数据. 一:启动过程 启动的代码文件为bootsect.s.setup.s. ...
- linux0.11启动时bootsect.s和setup.s的主要作用
cpu启动时为实模式,此时硬烧录的将cs=0xFFFF,ip=0x0,并自动开始执行0xFFFF0(ROM-BIOS的地址)的代码,BIOS会自检,并在0x0地址处设置中断向量表,此后实模式的int中 ...
- 有关计算机启动过程的书籍,操作系统—计算机的启动过程
一 预备 在8086系统CPU中,有两个寄存器CS和IP用于保存CPU接下来需要执行的指令地址,具体计算方法为 CS<<4+IP 例如CS=0x7c0,而IP=0x0001,则CS< ...
- bootsect.s 预备——Linux-0.11 剖析笔记(一)
文章目录 boot 目录下文件介绍 16 位代码是什么意思 计算机启动过程 Linux 0.11 启动过程 boot 目录下文件介绍 boot 目录中一共有三个文件,都是用汇编语言写的,如下图(图来自 ...
- Linux0.11内核引导启动过程概述
Linux0.11仅支持x86架构.它的内核引导启动程序在文件夹boot内,共有三个汇编代码文件.按照启动流程依次是: (1)bootsect.s.boot是启动引导的意思,sect即sector,是 ...
- oracle集群启动状态,循序渐进:Oracle 11.2 RAC集群进程的初始化与启动过程
张大朋(Lunar)Oracle 资深技术专家 Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职于 ORACLE Sales Consul ...
- Tuscany SCA V1.0中的扩展机制和启动过程中的扩展点[11月29日更新]
2007年9月24日Tuscany SCA 发布了V1.0版本的实现 .本文讲述的内容使用的就是基于这个版本的,代码下载地址 http://incubator.apache.org/tuscany/s ...
- 11 阶段总结一:详解OS的引导启动过程(含Bochs模拟软件的使用)
阶段总结一:详解OS的引导启动过程 0 前文总结 1 BIOS的自述 2 MBR的面目 3 bochs模拟系统的基本使用 3.0 bochs的简介 3.1 *.bxrc配置文件选项解析(重点) 3.2 ...
- Linux0.11 键盘中断处理过程
Linux0.11 键盘中断处理过程 键盘中断初始化 在console.c的con_init(void)中: void con_init(void) {... set_trap_gate (0x21, ...
最新文章
- MySQL中改变相邻学生座位_力扣——换座位(数据库的题
- TalkingData CTO肖文峰:研发工程师,你为啥升不上去?
- 区块链BaaS云服务(27)米链科技 HSpeed链
- 十大经典排序算法之插入排序及其二分优化
- npm的镜像替换成淘宝
- 删除用户的命令是什么mysql_mysql新添加用户与删除用户具体操作命令_MySQL
- HugeGraph 多图配置
- MySQL进阶:从删库到跑路
- 多线程的那点儿事(之嵌套锁)
- laravel php环境,Laravel 5框架学习之环境与配置
- win7下使用U盘安装Ubuntu Kylin完全详解教程
- 【相机标定系列】双目相机标定要求,基础知识,相机参数
- 又出现*_limited.sof的问题了,还有另一个奇怪的现象!
- POJ 1191 棋盘分割【区间类DP】
- 2048游戏回顾三:自定义Dialog和ProgressBar
- Java类型转换简单运用
- 简述网页部分知识点:空链接、锚链接、网页图标等
- 网络安全学习记录-10
- 旋转框目标检测mmrotate v0.3.1入门
- 最简单的基于FFmpeg的解码器