L3 【哈工大_操作系统】操作系统启动

2024-04-15 02:20

本文主要是介绍L3 【哈工大_操作系统】操作系统启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节要点:
1、理解 OS 启动过程发生了什么,理解 OS硬件应用 之间的关系
2、本节讲解了 setup 模块 和 system 模块实现的功能

1、计算机上电时,操作系统在硬盘(磁盘)上,为了“取指执行”,需要把操作系统代码放在内存里。

  • bootsect.s:将操作系统读入内存(分段读 bootsect.s、setup.s、system.s …)

2、setup.s 模块:完成 OS 启动前的设置,OS 接管硬件

在这里插入图片描述

  • int 0x15 获得物理内存的大小保存到 ax(#0x88 作为参数)
  • [2] 是间接寻址,默认段寄存器是 9000,所以是 0x90002。即将扩展内存数存入 0x90002,使操作系统对内存大小有一个认知
  • 把操作系统从 90000 移动到 00000,然后再继续 取指执行

在这里插入图片描述

  • CS左移4位+IP 只能访问 20位 -> 1M,这种寻址方式无法方位内存 4G 的空间。所以要从16位机(实模式)切换为32位机(保护模式)
  • 将值为 #0x0001 赋给寄存器 cr0 来启动保护模式,相当于 CPU 要走另外一条解释执行的电路gdt(不是实模式的左移4位再相加了)
  • 再通过 jmpi 赋值 cs 寻找表象,赋值 ip 获得偏移
    ps: 2^10 = 1KB 2^20 = 1MB 2^30 = 1GB 2^32 = 4GB

在这里插入图片描述

  • gdt 用硬件来实现,相比于软件更快。CS用于选择gdt表中的表象以生成基址(32位),再和ip偏移(32位)相加
  • 同样,中断也会根据 int n 去表象中寻找中断处理函数入口地址

在这里插入图片描述

  • setup 初始化保护模式所用到的 gdt 表

在这里插入图片描述

  • 前面赋值 cs = 8,因为一个表象是一个字,即两个字节,所以一行8个字节,则8对应第二行。把四个字填入 设计好的硬件电路,按设计来获得 段基址,再加上 ip 来获得寻址。

setup.s 任务总结:
① 读硬件参数(如内存大小)
② 把 system 模块从 90000 移动到 00000,将OS的核心代码一直放在开头
③ 启动保护模式,应用32位的汇编指令跳到 0 地址处执行

3、 system 模块

在这里插入图片描述

  • BIOS 读 bootsect.s, bootsect.s 读 setup.s、system模块,再执行 setup.s,执行 system模块等。
  • system 模块由许多文件组成,这些文件运行的先后顺序,由 Linux/Makefile (操作系统的控制代码)来控制。
  • Makefile 通过一堆源码来产生操作系统镜像,再写入0磁道0扇区。(将一堆 .c 源文件生成 .o 文件,再通过链接指令把文件全部链接在一起就有了 system)

在这里插入图片描述

  • head.s 建立真正的 idt表(中断) 和 gdt表(寻址),之前的临时 gdt 表只是为了跳转到 system 模块来执行
  • 此时 head.s 的32位(保护模式),是用的 32位汇编代码,与之前的不一样,现在前面是源操作数,后面是目标操作数了

在这里插入图片描述

  • c语言中的函数调用:对应的压栈,把函数参数压入栈中, 跳到调用函数去执行,最后再通过 ret 指令从栈中弹出返回地址,并将控制权转移到该地址。
  • 从 head.o 进入到 main.c 去执行(汇编调用c文件),实际上和上述操作一样,通过压栈来执行
  • 当 main 函数执行完要返回地址,就会回到 L6,查看代码可以发现 L6 是死循环(电脑死机)

在这里插入图片描述

  • main 函数中包含了各种外设的初始化程序

在这里插入图片描述

  • 初始化 mem_map 表格,先将其置为0(右移12位,相当于4k,即每次4k大小的内存进行初始化)
  • end_mem 在 setup.s 读入了内存的大小4G(0x90002)

系统启动的全过程:将 OS、GDT、IDT等代码放在内存的起始位置,将应用程序放到内存OS的上端。

boot:将 OS 从磁盘读入内存
setup:获得一些硬件参数,启动保护模式
system:head:初始化 gdt 表 和 idt 表main:初始化一堆设备,如:mem_init

这篇关于L3 【哈工大_操作系统】操作系统启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904657

相关文章

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu