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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/544980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vite多环境配置与打包:灵活高效的Vue开发工作流

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

京东商品详情接口可以获取到那些数据?商品属性价格sku主图

京东商品详情接口可以获取到关于商品的丰富数据,包括但不限于以下内容: 商品基本信息:例如商品标题、价格、销量等。商品详情描述:这包括商品的详细描述、规格参数、包装清单等。商品评价信息:比如商品的好评率、评价…

图神经网络

图的性质 聚类系数 C i E i T i C_i \frac{E_i}{T_i} Ci​Ti​Ei​​ E i E_i Ei​表示节点 i i i的邻居实际存在的边的数量, T i T_i Ti​表示节点 i i i的邻居可能(最多)存在的边的数量 理论溯源 聚类系数这一概念首先源于论文“Colle…

OpenCV的查找命中或未命中

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9更多形态转换 下一篇:OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何使用 Hit-or-Miss 转换(也称为 Hit-and-Miss 转…

已解决:前端直传阿里oss报错跨域问题,“No ‘Access-Control-Allow-Origin‘”,这个错误基本就是在阿里的开放平台没做规则配置(附我封装的上传源码)

解决方案(我封装的上传代码在后面“封装上传”部分): 就直接上阿里oss管理后台去增加一个跨域规则:见图片,特详细 配置成这样点确定就好了,就这么简单 案发背景: 标题其实就已经是答案了&…

2024年第十五届蓝桥杯C/C++B组复盘(持续更新)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 试题A:握手问题问题描述思路 试题B:小球反弹问题描述思路…

【算法】字符串

个人主页 : zxctscl 如有转载请先通知 题目 1. 14. 最长公共前缀1.1 分析1.2 代码 2. 5. 最长回文子串2.1 分析2.2 代码 3. 67. 二进制求和3.1 分析3.2 代码 4. 43. 字符串相乘4.1 分析4.2 代码 1. 14. 最长公共前缀 1.1 分析 从第一个字符串开始两两比较&#xff…

LlamaIndex 文档 2

文章目录 一、构建 LLM 应用构建LLM 应用的关键步骤 二、使用LLM可用的LLM使用本地LLM Prompts 三、加载数据(提取)Loaders1、使用 SimpleDirectoryReader 加载2、使用 LlamaHub 的 Readers3、直接创建文档 转换 Transformations1、高级转换 API2、较低级…

Unity URP PBR_Cook-Torrance模型

Cook-Torrance模型是一个微表面光照模型,认为物体的表面可以看作是由许多个理想的镜面反射体微小平面组成的。 单点反射镜面反射漫反射占比*漫反射 漫反射 基础色/Π 镜面反射DFG/4(NV)(NL) D代表微平面分布函数,描述的是法线与半角向量normalize(L…

自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路 查阅opencv的官方文档,可看到有个cudacodec扩展,用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。 同时,为了考虑后续方便,顺手编译了FFMPEG,并将其与OPENCV绑定。 在之前的博文“鲲鹏主机昇腾A…

帆软查询按钮,获取组件值。

【查询】按钮增加点击事件,通过_g().parameterEl.getWidgetByName(‘组件名’).getValue(); 获取组件值。 js脚本示例: var bm _g().parameterEl.getWidgetByName(bm).getValue(); if(!bm || bm.length 0 ) {alert ("没有选择部门,查询速度会很…

解决PyCharm安装第三方库时出现“Error updating package list: Connect timed out”问题

在使用PyCharm开发Python项目时,有时会遇到在安装第三方库时出现“Error updating package list: Connect timed out”的错误。这通常是由于网络连接不稳定或PyPI官方源访问速度较慢导致的。为解决此类问题,本文将介绍以下几种策略: 2. 设置P…

【练习】位运算思想

🎥 个人主页:Dikz12🔥个人专栏:算法(Java)📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.判断字符串是否唯一 题目描述 讲解 代码实现 2.丢失的数字 题目描述…

重学Java 12 JavaBean

一、JavaBean的使用 1.标准javaBean JavaBean是Java语言编写类的一种标准规范,符合JavaBean的类,要求: ①类必须是具体的(非抽象 abstract)和公共的,public class 类名 ②并且具有无参数的构造方法&#x…

C#泛型,利用反射创建和普通创建泛型

泛型,利用反射创建和普通创建 反射 var input Activator.CreateInstance(typeof(Input<>).MakeGenericType(typeof(T))) as dynamic;typeof(T)这个位置可以塞入不同的类型 Activator.CreateInstance 反射动态创建实例&#xff1a; 这种方式使用 Activator.CreateIns…

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent&#xff1a;通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

在Windows上安装Go编译器并配置Golang开发环境

文章目录 1、安装Go语言编译程序1.1、下载GoLang编译器1.2、安装GoLang编译器 2、配置Golang IDE运行环境2.1、配置GO编译器2.1.1、GOROOT 概述2.1.2、GOROOT 作用2.1.2、配置 GOROOT 2.2、配置GO依赖管理2.2.1、Module管理依赖2.2.2、GOPATH 管理依赖 2.3、运行GO程序2.3.1、创…

CMake基础语法

目录 概述一、示例引入二、语法规则三、变量四、控制结构4.1 条件判断4.2 循环语句4.2.1 foreach循环4.2.2 while循环4.2.3 break、continue 五、函数六、文件操作七、环境配置7.1 设置交叉编译7.2 作用域7.3 属性 八、补充8.1 数学运算math 概述 首先我们都知道Makefile带来的…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…