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

相关文章

Linux中查看操作系统及其版本信息的多种方法

《Linux中查看操作系统及其版本信息的多种方法》在服务器运维或者部署系统中,经常需要确认服务器的系统版本、cpu信息等,在Linux系统中,有多种方法可以查看操作系统及其版本信息,以下是一些常用的方... 目录1. lsb_pythonrelease 命令2. /etc/os-release 文件3. h

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin