Operating System Course 2 - My OS
Computer Startup process
上一篇:http://t.csdn.cn/XfUKt 讲到这个启动设备的第一个扇区:引导扇区。那么引导扇区的代码长什么样子?
这里得看引导扇区代码源文件bootsect.s(.s后缀文件为用汇编语言编写的源代码文件)。
另外为什么是用汇编语言写的?
为什么用底层的汇编语言,而不用对应上更高级的C语言,因为如果是C语言,它是编译型语言,要经过编译。而编译的过程中可能就会出现一些我们无法控制的事情。比如int i,我们是无法用C语言去控制i存放的地址哪个位置。而汇编可以。汇编的指令都会变成真正的机器指令。
bootsect.s形成的机器指令最后就会实现在引导扇区上。
BOOTSEG: boot-sector的初始地址(通电后的初始地址) |
INITSEG:bootsect把自身搬运到0x90000 |
SETUPSEG:setup模块被加载到 0x90200 |
.globl begtext,begdata,begbss,endtext,enddata,endbss
// .globl用于定义随后的标识符是外部或者全局的,全局标识符,供ld86链使用
.text //文本段
begtext:
.data //数据段
begdata:
.bss //未初始化数据段
begbss:// BOOTSEG = 0x07c0 // 0x就是16进制
// INITSEG = INITSEC
// SETUPSEG = 0x9020entry start // 关键字entry告诉链接器“程序入口”
start:mov ax, #BOOTSEG mov ds, ax // mov 变量A 变量B 将变量B的值赋给变量Amov ax, #INITSEC mov es, ax // ds 7c0 es 9000mov cx, # 256 // 循环控制字节,512字节sub si, si sub di,di // 这里的值都等于0
// sub是减的意思,这里自己减自己,结果都为0 si清零,ds:si即0x07c00 di清零,es:si即0x90000rep movw // 循环直到cx==0,将ds:si复制到es:di,0x07c0:0x0000移动256位到0x9000 :0x0000jmpi go, INITSEC // 跳转到go标志处(一个标号地址),jmp是跳转,加i,jmpi是间接跳转,go是后面的一个标志,INITSEC即INITSEC【CPU就会跳到 0x9000:go】,INITSEG 是段地址,go 是偏移地址。
0x13是BIOS读磁盘扇区的中断:ah=0x02-读磁盘,al=扇区数量(SETUPLEN=4),ch=柱面号,cl=开始扇区,dh=磁头号,dl=驱动器号,es:bx=内存地址。
go: mov ax,cs // cs就是INITSEC=0x9000mov ds,axmov es,axmov ss,ax // cs = ds = es = ss = 0x9000mov sp,#0xFF00 // es:sp = 0x9000:0xff00 load_setup:mov dx,#0x0000 // 动器号(DL)0,磁头号(DH)0mov cx,#0x0002 // 起始扇区号2(从这里开始读), 磁道号0mov bx,#0x0200 // 偏移地址0x200mov ax,#0x0200+SETUPLEN // AH=0x02,al(SETUPLEN=4) ,这里就是从第二个扇区开始读4个扇区int 0x13 // BIOS中断jnc ok_load_setup // CF=0操作成功,CF=1操作失败。若CF为0则重载mov dx,#0x0000 // 需要复位的驱动器号=DL=0mov ax,#0x0000 // 复位int 0x13 // 复位磁盘j load_setup // 重读读入setup模块后:ok_load_setup
SYSSEG = 0x1000
ok_load_setup: // 载入setup模块mov dl,#0x00 // 驱动器号为0,说明是软盘mov ax,#0x0800 // AH=8获取磁盘参数int 0x13mov ch,#0x00 mov sectors,cx mov ah,#0x03 xor bh,bhint 0x10 // 读光标mov cx,#24 // cx为24,表示输出24个字符mov bx,#0x0007 // 7是显示属性mov bp,#msg1mov ax,#0x1301 int 0x10 // 显示字符mov ax,#SYSSEG // 0X1000mov es,ax // es=0x1000call read_it // 读入system模块jmpi 0,SETUPSEG // 跳入0x9020:0x0000执行setup.s,cs跳四位为0x9020 比如
msg1: .byte 13,10.ascii "Loading system...".byte 13,10,13,10我们也可以改的,把这里的Loading system...比如改成My OS,那么就需要把cx的输出字符数调成我们这里要输出的字符数,而这个loading system...是cx为24个字符,按ASCII的规则数一下即可。其他就没有需要改的。
读入system模块
read_it(system模块可能很大,需跨磁道,ENDSEG=SYSSEG+SYSSIZE,其中SYSSIZE=0x8000该变量可在编译操作系统时,根据image大小设定)
read_it: mov ax,escmp ax,#ENDSEGjb ok1_readret
ok1_read:mov ax,sectorssub ax,sread // sread是当前磁道已读扇区,ax是未读扇区call read_track // 读磁道引导扇区末尾
BIOS用以识别引导扇区
.org 510.word 0xAA55 // 扇区的最后两个字节 这里就跳回setup执行最后的语句:jmpi 0,SETUPSEG(IP只成0,cs=SETUPSEG 0x9000,然后cs跳四位为0x9020,最后结果:0x9020:0x0000,控制器交给setup.s)
这里bootsect.s就执行结束了,接下来就是setup.s。
学习参考:
https://www.bbsmax.com/A/Gkz1qNj6zR/
https://www.xiaolincoding.com/
【哈工大】操作系统 李治军
相关文章:
Operating System Course 2 - My OS
Computer Startup process上一篇:http://t.csdn.cn/XfUKt 讲到这个启动设备的第一个扇区:引导扇区。那么引导扇区的代码长什么样子?这里得看引导扇区代码源文件bootsect.s(.s后缀文件为用汇编语言编写的源代码文件)。另…...
离散数学 课时一 命题逻辑的基本概念
1 命题 1、命题:可以判断其真值的陈述句 2、真值:真或者假(1或者0) 3、真命题:真值为真的命题 4、假命题:真值为假的命题 5、原子命题:不可以再被分解成更简单的命题 6、复合命题:由原子命题通过联结词联结…...
Word文档带有权限密码怎么办?
Word文档的权限密码指的是什么?其实这是Word文档的保护方法之一,具体指Word文档的编辑、修改受到了限制,需要输入密码才能进行。 设置了权限密码的Word文档还是可以直接打开,只有当需要编辑或者修改内容的时候,才会发…...
C++多态
1. 多态的概念1.1 概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态举个例子:比如买票这个行为,当普通人买票时,是全价买票;…...
访问学者如何申请美国J1签证?
一、申请美国J1签证的步骤: 第一步:填写I901表。 填写I901表会收取SERVIS费用180美元,可以用VISA/Master卡直接网上支付。填完后打印收据单或者存成PDF后续再打印,记下I901收据编号。 第二步:DS-160表填写。 填写DS-…...
使用gitlab ci/cd来发布一个.net 项目
gitlab runner的安装和基本使用:https://bear-coding.blog.csdn.net/article/details/120591711安装并给项目配置完gitlab runner后再操作后面步骤。实现目标:master分支代码有变更的时候自动构建build。当开发人员在gitlab上给项目打一个tag标签分支的时候自动触发…...
笔试题-2023-蔚来-数字芯片设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.24应聘岗位:校招-芯片逻辑综合工程师-智能硬件笔试时长:90min笔试平台:nowcoder牛客网题目类型:不定项选择题(15道)、填空题…...
ThreadLocal 详解
ThreadLocal简介JDK源码对ThreadLocal类的注释如下:ThreadLocal提供线程局部变量,使得每个线程都有自己的、独立初始化的变量副本ThreadLocal实例通常是类中的private static字段,用于将状态与线程相关联,如用户ID、事务ID只要线程…...
【Java 面试合集】重写以及重载有什么区别能简单说说嘛
重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题,我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符,返回值,方法名,含义,参数等方面进行逐一分析来比较不同。 话不多话,看下…...
到底什么是股票委托接口?
在量化股票市场上,常见的股票委托接口其实有着不一样的交集,就拿股票交易接口,在量化股票跟程序化交易中,有共同之处就是在于直接委托执行下单,并且能很快的就能够将策略输出在账户持仓数据中,继续缓存下来…...
Linux驱动:VPU
1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 概述 VPU 是用来进行图像、视频数据进行硬件编、解码的硬件模块。内部集成了 Encoder、Decoder 功能部件进行图像、视频数据进行硬件编、解码&a…...
简介Servlet
目录 一、maven中心库 二、简介Servlet 三、实现Servlet动态页面 1、创建一个maven项目 2、引入依赖 3、创建目录结构 4、编写Servlet代码 5、打包 6、部署 7、验证程序 四、Servlet的运行原理 五、Tomcat伪代码 1、Tomcat初始化 a、让Tomcat先从指定的目录…...
Learning C++ No.7
引言: 北京时间:20223/2/9/22:20,距离大一下学期开学还有2天,昨天收到好消息,开学不要考试了,我并不是害怕考试,考试在我心里,地位不高,可能只有当我挂了,才能…...
【MyBatis】第八篇:一级,二级缓存
其实缓存字面的意思就是将一些内容缓存下来,等下次使用的时候可以直接调用,通过数据库得到数据,有时候会使用相同的数据,所以mybatis自然也支持缓存。 而mybatis按照缓存的效果可以分两大类:一级缓存和二级缓存。 一…...
【大唐杯备考】——5G基站开通与调测(学习笔记)
📖 前言:本期介绍5G基站开通与调测。 目录🕒 1. 概述🕒 2. 5G基站开通与调测基础🕘 2.1 3.5GHz单模100MHz配置(S111)🕘 2.2 3.5GHz单模100MHz配置(S111111)&a…...
redhat7 忘记root密码,重置办法
来自https://www.tracymc.cn/archives/802 亲测可用,太感谢了,在此记录一下,原文有图 1.启动的时候,在有启动项界面,相应启动项内核名称上按“e”; 2.进入后,找到linux16开头的地方,按“end”键或者controle到最后,输入rd.break,再按ctrlx进…...
QML- 对象属性
QML- 对象属性一、概述二、id 属性三、Property 属性1. 定义属性1. 自定义属性定义中的有效类型2. 为属性属性赋值1. 初始化时的值赋值2. 命令式赋值3. 静态值和绑定表达式值4. 类型安全5. 特殊属性类型1. 对象列表属性2. 分组属性6. 属性别名1. 属性别名的注意事项2. 属性别名…...
将.js文件转成vue标签结构的样式
例如:下图所示: 依次识别获取.js文件中的tag和props,可以理解为字符串拼接,将整个vue的标签结构看作是一个字符串。 话不多说,先放上完整代码,思路看代码备注。(自己实现的时候,可以…...
前端知识点复盘
组件和jsx <body><div id"root"></div><script type"text/babel">const root ReactDOM.createRoot(document.getElementById("root"))class App extends React.Component {render() {return (<div> <h1>s…...
前端JavaScript获取图片文件的真实格式
常见方式判断图片格式 当我们进行前端开发,需要处理图片上传功能,针对图片格式做判断时,常规的方法都是使用文件后缀名来判断,如下代码所示: input.addEventListener(change, (e) > {const file e.target.files[…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
