从开机加电,到执行main函数之前的过程

好吧,这里应该是有执行3个汇编的文件,但是我不太了解。囧

从main函数,到启动OK(即可以响应用户操作了)

这个步骤做了3件事情:

  • 创建进程0,使之具备在主机中进行运算的能力,2.1
  • 已进程0为母本创建进程1,不仅有运算能力,而且还能以文件的行驶与外设进行数据交互,2.2-2.4
  • 以进程1为母本创建进程2,全面具备进程1的能力和环境,进一步具备支持“人机交互”,实现怠速,2.5-2.8

开中断之前的准备工作

  1. 复制根设备号和硬盘参数表
  2. 物理内存规划格局:除了1MB以内的内核区之外,其余物理内存要完成的工作是不同的,对这三类不同性质的区域,在大小,位置,以及管理方式上进行规划
    • “主内存区“:用来承载进程的相关信息,包括进程管理结构,进程对应的程序;
    • “缓冲区”:主机与外设进行数据交互的中转站
    • “虚拟盘区”:可选的区域,可将外设上的数据先复制到虚拟盘区,然后再使用。
  3. 虚拟盘设置与初始化:rd_init(某个设备请求的函数,对应到内核某块代码?????)
  4. 内存管理结构mem_map初始化:mem_init,对于1MB以上的内存都是分页管理的。
  5. 异常处理类中断服务程序挂接:trap_init
  6. 初始化块设备请求项结构
  7. 与简历人机交互界面相关的外设的中断服务程序挂接
    • 串行口设置
    • 显示器设置
    • 键盘设置
  8. 开机启动时间设置:进程0需要具备对时间的掌控能力,time_init()
  9. 系统开始激活进程0:sched_init函数开始
    • 使其具备运算及创建其他进程的能力
    • 时刻具备参与多进程轮询的能力
    • 具备处理系统调用的能力
  10. 进程相关事务初始化设置:
    • “任务状态描述符表”和“局部数据描述符表”挂接到全局描述附表GDT中
    • 对GDT和进程管理结构task[64]中除了与进程0相关的位置外,清空设置
    • 将GDT中关于进程0的“任务状态描述符”和“局部数据描述符”分别记录在CPU中的“任务状态寄存器”和“局部数据寄存器”中。
  11. 时钟中断设置
  12. 系统调用服务程序挂接:set_system_gate与中断描述符表挂接
  13. 初始化缓冲区管理结构
  14. 初始化硬盘hd_init,hd_interrupt
  15. 初始化软盘floppy_init
  16. 开中断:系统中所有中断服务程序都已经和中断描述附表正常挂接,中断服务构建完毕,系统可以在32位保护模式下处理中断信号了。

进程创建的最基本动作

  1. OS为进程0创建进程1做准备,
    • move_to_user_mode,从内核态转换到用户态
    • 上述函数后,相当于进行了一次中断返回,CS特权级从0转换到3,内核→用户
    • 用户态的进程0,从LDT去的代码段描述符,与弹出的EIP组成线性地址
    • 调用fork函数
  2. 在进程槽中为进程1申请一个空闲位置并且获取进程号
    • find_empty_process,为进程1获得可用的进程号和空闲的任务号
    • 全局变量last_pid存放系统开机以来累计的进程数。
    • 内核的数据区中有个task[NR_TASKS]进程槽,存放task_struct指针。第一次遍历该数组,判断获得的进程号是否可用。ifyes,第二次遍历获得一个空的task_struct。linux0.11中,最多64个进程。
  3. 复制进程信息之前,先将一些数据压栈:将进程0的管理结构拷贝给进程1的管理结构
    • copy_process
  4. 初步设置进程1管理结构
    • 进程0的母本包括:“进程0的管理结构”,“进程0的页表项”
  5. 进程0创建进程1的过程中发生时钟中断(场景分析)
    • 中断服务程序开始工作,跳转到_timer_interrupt执行,xxx压入进程0内核栈,保护现场
    • _do_timer判断是否需要进程切换
  6. 从时钟中断返回
    • ret_from_sys_call开始执行
  7. 调整进程1管理结构
    • 进程0的管理结构数据信息不一定全都适用于进程1,还需针对具体情况调整。
  8. 设置进程1的线性地址空间及物理页面
    • 创建页目录项和复制页表,从copy_mem开始
    • copy_page_tables
  9. 调整进程1管理结构
  10. OS如何区分进程0和进程1
    • _syscall0函数中,if(res>=0)这一行就是进程0中断返回后将要执行的第一行指令。。。
    • 到底如何区分,我也没搞清楚。。。
  11. 进程0准备切换到进程1
  12. 系统切换到进程1执行

加载根文件系统(进程1来完成;原文中均有流程图说明)

  • 进程1通过对一些与硬盘管理相关的数据结构进行设置,进一步为进程依托系统与硬盘以文件行驶进行数据交互创造条件
  • 进程11用虚拟盘代替软盘,使之成为根设备
  • 进程1以虚拟盘中提供的数据为依据,加载根文件系统

  1. 开始执行:从_syscall0的if(__res>=0)这行代码开始,然后调用init函数
  2. 开始执行:在init中,先调用setup
  3. 进程1开始以数据块的形式操作硬盘
  4. 将找到的缓冲块与请求项挂接
  5. 将请求项与硬盘处理函数挂接
  6. 进行硬盘读盘前的准备工作
  7. 给硬盘下达读盘指令
  8. 进程1由于等待读盘操作挂起
  9. 系统切换到进程0执行
  10. 进程0的执行过程
  11. 进程0执行过程中发生硬盘中断
  12. 硬盘中断服务程序响应后,进程0继续执行
  13. 再次响应硬盘中断并唤醒进程1
  14. 读盘操作完成后,进程1继续执行
  15. 进程1继续设置硬盘管理结构
  16. 进程1获取软盘超级块,为加载根文件系统做准备
  17. 进程1备份超级快数据
  18. 进程1将根文件系统从软盘拷贝到虚拟盘
  19. 进程1开始加载根文件系统
  20. 进程1准备根文件系统超级块
  21. 进程1准备读取根目录i节点
  22. 进程1加载根目录i节点 1。进程1结束加载根文件系统的过程

打开中断设备文件及复制文件句柄

  1. 进程1与内核文件表挂接,为打开文件做准备
  2. 确定打开操作的起点
  3. 获得枝梢i节点-dev目录文件的i节点
  4. 确定dev目录文件i节点为枝梢i节点
  5. 继续返回枝梢i节点
  6. 查找tty0文件的i节点
  7. 将tty0设备文件的i节点返回给sys_open系统调用
  8. 分析tty0文件i节点
  9. 设置文件管理结构并返回给用户进程
  10. 进程1复制tty0文件句柄

创建进程2

进程1等待进程2退出

shell程序的加载

系统实现怠速

Linux0.11启动过程的更多相关文章

  1. 11.Linux启动过程详解

    目录: 本文转载自:http://blog.csdn.net/miss_acha/article/details/50004717 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一 ...

  2. Linux0.11从开机到准备执行main函数的启动学习

    最近一直在看操作系统以及内核设计的东西,不确定自己有能力会参与到类似的开发之中,但是争取能自己改造这内核玩一下,然后按照Linux From Scratch那样的把改造后的系统编译运行就心满意足了.正 ...

  3. Linux0.11内核剖析--内核体系结构

    一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...

  4. linux0.11下的中断机制分析

    http://orbt.blog.163.com/     异常就是控制流中的突变,用来响应处理器状态中的某些变化.当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用, ...

  5. linux0.12 编译过程

    感谢这篇文章的作者:    http://www.cnblogs.com/strugglesometimes/p/4231359.html 编译是个很蛋疼的事情,本想把linux0.12在bochs上 ...

  6. linux0.11学习笔记(1)

    公布软件包包括内容: bootimage.Z - 具有美国键盘代码的压缩启动映像文件: rootimage.Z - 以1200kB 压缩的根文件系统映像文件: linux-0.11.tar.Z- 内核 ...

  7. Linux0.11小结

    第一部分 基础内容 1.操作系统基础     操作系统是计算机硬件系统与用户程序间重要环节,理解操作系统的原理是编写优秀代码的基础.教课书中阐述的操作系统一般由5部分组成. 一个最简单的操作系统,可以 ...

  8. Linux0.11进程切换和TSS结构

    TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息.       X86体系从硬件上支持任务间的切换.为此目的,它增设了一个新段:任务状态段( ...

  9. 对Linux0.11 中 进程0 和 进程1分析

    1. 背景 进程的创建过程无疑是最重要的操作系统处理过程之一,很多书和教材上说的最多的还是一些原理的部分,忽略了很多细节.比如,子进程复制父进程所拥有的资源,或者子进程和父进程共享相同的物理页面,拥有 ...

随机推荐

  1. PHP 5 Timezones

    PHP 支持的时区 下面是 PHP 支持的时区的完整列表,这些对一些 PHP 日期函数很有用. 非洲 美洲 南极洲 北冰洋 亚洲 大西洋 大洋洲 欧洲 印度洋 太平洋 非洲 Africa/Abidja ...

  2. PHP学习(4)——数据类型

    PHP 支持 8 种原始数据类型. 四种标量类型:(标量类型即为基本类型) boolean(布尔型) integer(整型) float(浮点型,也称作 double) (由于历史原因,float也叫 ...

  3. Android Studio 如何打JAR包

    Android Studio 如何打JAR包 在eclipse中我们知道如何将一个项目导出为jar包,供其它项目使用.  在AS中可以通过修改gradle才处理.  我们新建一个项目MakeJar,在 ...

  4. Swift运行时简介

    因为Swift的操作在高层并且也得与Objc联合起来干活,用Swift写的程序一般会被Objc和Swift运行时处理.因为Swift的本性--换句话说,它是一门静态语言--Swift运行时在一些关键地 ...

  5. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  6. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  7. 深度学习&机器学习资源汇总1

    本篇博客的目地,是对工作学习过程中所遇所见的一些有关深度学习.机器学习的优质资源,作分类汇总,方便自己查阅,也方便他人学习借用. 主要会涉及一些优质的理论书籍和论文.一些实惠好用的工具库和开源库.一些 ...

  8. Dynamics CRM2016 业务流程之Task Flow(二)

    接上篇,Page页设置完后,按照业务流程管理也可以继续设置Insert page after branch 或者 Add branch,我这里选择后者,并设置了条件,如果Pipeline Phase ...

  9. 【Android 系统开发】使用 Source InSight 阅读 Android 源码

    1. 安装 Source Insight (1) Source Insight 相关资源 安装相关资源 : -- 下载地址 : http://www.sourceinsight.com/down35. ...

  10. 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri

     模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...