自己动手写一个操作系统——我们能做什么,我们需要做什么

news2024/11/27 14:49:40

文章目录

    • 计算机启动流程
    • 第一条指令
    • BIOS
    • MBR
    • loader
    • kernel
    • 总结

计算机启动流程

在这里插入图片描述

第一条指令

在开机的一瞬间,也就是上电的一瞬间,CPU 的 CS:IP 寄存器被硬件强制初始化为 0xF000:0xFFF0。
CS:IP 就是 PC 指针,也就是 CPU 下一条要执行的指令的地址。
我们可以使用 qemu 模拟器进行验证:

$ qemu-system-i386 -S -s

在这里插入图片描述
输入 info registers,就可以看到 CPU 上电时寄存器状态:
在这里插入图片描述

BIOS

由于开机时处于实模式,段基址(CS)要左移 4 位,于是 0xF000:0xFFF0 的等效地址是 0xFFFF0。此地址便是 BIOS 的入口地址。
在这里插入图片描述
不过,0xffff0 到地址最高处 0xfffff 只有 16 字节的空间,BIOS 又要检测硬件,做各种初始化工作,还要建立中断向量表,显然 16 字节干不了这么多活。这说明 BIOS 真正的代码不在这,那此处的代码只能是个跳转指令。上表也有介绍,将会跳转到 f000:e05b
接下来 BIOS 便马不停蹄地检测内存、显卡等外设信息,当检测通过,并初始化好硬件后,开始在内存中 0x000~0x3FF 处建立中断向量表 IVT 并填写中断例程。
接着 BIOS 检查第一块硬盘的 0 盘 0 道 1 扇区,如果该扇区的最后两个字节是 0x55 和 0xAA,就说明这个扇区是 MBR,可以从这里引导。BIOS 便将这 512 字节从硬盘拷贝到内存的 0x7c00 处,并跳转到 0x7c00,控制权便交给了 MBR。
计算机执行到这份上,BIOS 也即将完成自己的历史使命了。
一直到这里,我们程序员都无法干预,从这里开始,程序员才能插手。
如下图,虚线左侧部分属于硬件部分(BIOS 固件也理解为硬件),我们无法干预。从虚线右侧开始,我们才能干预。
在这里插入图片描述

MBR

我们从 MBR 处开始接手 CPU 控制权。我们写的第一个程序就是 MBR(我将其称之为 boot)。

loader

由于 MBR 比较小,只有 512 字节,能完成的任务有限。所以,在 MBR 代码里我们将 loader 加载到内存,然后跳转过去。

kernel

loader 最终将 kernel 加载到内存,然后跳转过去。

总结

所以,接下来我们就一步一步编写 MBR、loader 和 kernel。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch7.8.0版本入门—— Elasticsearch7.8.0映射操作

目录一、映射的概述二、创建映射的示例2.1、首先,创建索引2.2、然后,再创建好的索引基础上,创建映射2.3、映射属性说明2.4、查看创建的映射2.5、最后,创建文档2.6、根据文档中name属性条件查询文档 理解映射示例2.7、根据文档中se…

HDM KVM维护

前言 服务器遇到个问题,无法启动,下面简单记录一下解决程 方法 进入维护界面: 尝试 H5 KVM,发现H5 kvm挂载镜像速度较慢 使用 KVM.jnlp,需配置 java 环境,安装好java 环境已经配置java 环境变量后&…

Linux常见命令 18 - 用户管理命令 useradd, passwd, who, w

目录 1. 添加用户命令 useradd 2. 设置用户密码 passwd 3. 查看用户登录信息 who 4. 查看用户登录详细信息 w 1. 添加用户命令 useradd 语法:useradd [用户名] 2. 设置用户密码 passwd 语法:passwd [用户名] 注意:每个用户只能用passwd更改自…

作为项目经理,如何做好项目进度管理

一、项目进度管理需要做什么? 项目进度管理分9步:其中前⑥条属于规划过程组的工作内容,第⑦条属于监控过程组的工作内容。 ①规划进度管理:在文档内计划如何做好进度管理 ②定义活动:识别和记录项目中的活动 ③排列活动…

数据库系统概念 | 第六章:形式化关系查询语言 | 含带答案习题

文章目录📚关系代数🐇基本运算🥕选择运算🥕投影运算🥕关系运算的组合🥕集合并运算🥕集合差运算🥕集合交运算🥕笛卡尔积运算🥕更名运算🥕一道综合例…

量子力学奇妙之旅-微扰论和变分法

专栏目录: 高质量文章导航 一.基本概念 前置: 厄密算符和简并: 两大重要结论: 厄米算符的本征值一定是实数 厄米算符不同本征值的本征态一定正交 证明: 我们 λ<

Day02函数和条件表达

0. 格式化字符串 格式 化字符串 print(1) print(1,2,3,4)a 1 b 2.1123 c hello s a %d b %f c %s % (a,b,c)s -- worldprint(s)s fa {a} b {b} c {c} print(s)s a {0:5d} b {1:.2f} c {0}.format(a,b,c) print(s)1. 函数概述 print() input() type() int…

C++菱形继承以及解决方法--虚继承 虚基表

目录菱形继承形成原因出现二义性变量的内存布局应对方案虚继承 vitrual解决二义性变量内存布局--虚基表感悟关于代码复用等的另一种关系-组合菱形继承形成原因 多继承&#xff0c;呈菱形状 菱形继承代码: class A { public:A() {}int _a ; }; class B :public A { public…

NAT技术原理、使用场景

随着Internet的发展和网络应用的增多&#xff0c;有限的IPv4公有地址已经成为制约网络发展的瓶颈。为解决这个问题&#xff0c;NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术应需而生。 NAT技术主要用于实现内部网络的主机访问外部网络…

JDK8 新特性之新增的Optional类

目录 一&#xff1a;以前对null的处理方式 二&#xff1a;Optional类介绍 三&#xff1a;Optional的基本使用 Optional的高级使用 小结 一&#xff1a;以前对null的处理方式 Test public void test01() { String userName "凤姐"; // String userName null; …

十八、Gtk4-Stateful action

有些动作action有状态。状态的典型值是布尔值或字符串。但是&#xff0c;如果你愿意&#xff0c;也可以使用其他类型的状态。 具有状态的动作称为有状态的。 Stateful action without a paramete 有些菜单被称为切换菜单。例如&#xff0c;全屏菜单有一个状态&#xff0c;它…

在甲骨文云容器实例(Container Instances)上部署edge

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署edge。 Step1. 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&#xff0c; …

审批工作流—ccflow

审批工作流—ccflow目录概述需求&#xff1a;设计思路实现思路分析1.java 代码分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challen…

LeetCode[547]省份数量

难度&#xff1a;中等题目&#xff1a;有 n个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a与城市 b直接相连&#xff0c;且城市 b与城市 c直接相连&#xff0c;那么城市 a与城市 c间接相连。省份 是一组直接或间接相连的城市&#xff0c;组内不含其…

Leetcode:93. 复原 IP 地址(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。…

leetcode刷题记录总结-2.链表

文章目录一、重排列表[1. 奇偶链表](https://leetcode.cn/problems/odd-even-linked-list/solutions/)题解二、链表的增、删、改、查[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)题解不简洁代码简洁代码707.设计链表题解不简洁代码优化后的…

mysql主从复制配置(windows和linux操作都有)

我是目录主从复制是什么&#xff1f;操作实践验证主从设置主从复制是什么&#xff1f; mysql主从复制是一个异步的复制过程&#xff0c;底层是基于mysql数据库自带的二进制日志功能。就是一台或多台mysal数据库&#xff08;slave&#xff0c;即从库&#xff09;从另一台mysql数…

macOS Big Sur 11.7.3 (20G1116) 正式版 ISO、PKG、DMG、IPSW 下载

本站提供的 macOS Big Sur 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Big-Sur/&#xff0…

【Python百日进阶-Web开发-Linux】Day236 - Win11安装Windows Subsystem for Android(WSA)

文章目录一、Win11运行安卓app前提条件二、Win11运行安卓app支持以下新特性三、Win11运行安卓app操作步骤3.1 修改定位3.2 开启VT虚拟化3.3 开启电脑的Hyper-V和虚拟机平台四、WSA下载4.1 百度网盘下载4.2 store.rg-adguard.net下载五、WSA安装&#xff08;没有成功&#xff0c…

C++初阶--继承

目录 继承的概念 继承定义 继承基类成员访问方式 基类和派生类对象的赋值转换 继承中的作用域 派生类的默认成员函数 友元关系不能继承 基类static成员 菱形继承与菱形虚拟继承 虚拟继承解决数据冗余和二义性的原理 继承和组合 继承的概念 继承是类层次的复用。 继…