当前位置: 首页 > news >正文

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 概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态举个例子:比如买票这个行为,当普通人买票时,是全价买票&#xff1b…...

访问学者如何申请美国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获取图片文件的真实格式

常见方式判断图片格式 当我们进行前端开发&#xff0c;需要处理图片上传功能&#xff0c;针对图片格式做判断时&#xff0c;常规的方法都是使用文件后缀名来判断&#xff0c;如下代码所示&#xff1a; input.addEventListener(change, (e) > {const file e.target.files[…...

PromethAI-Backend:构建标准化AI智能体后端框架的工程实践

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想搞一个能处理复杂工作流的智能体系统&#xff0c;发现了一个挺有意思的开源项目——PromethAI-Backend。这名字听着就有点“普罗米修斯”盗火种给人类的意思&#xff0c;挺形象的&#xff0c;它本质上就是一个为…...

macOS开发环境标准化实践:基于Homebrew的CUR环境构建

1. 项目概述与核心价值最近在折腾macOS开发环境&#xff0c;尤其是涉及到一些需要特定编译工具链的项目时&#xff0c;经常被各种依赖和版本问题搞得焦头烂额。相信很多从Linux或Windows转过来的开发者都有同感&#xff0c;macOS虽然优雅&#xff0c;但在某些底层开发工具的生态…...

明日方舟游戏素材宝库:8000+高清美术资源免费获取终极指南

明日方舟游戏素材宝库&#xff1a;8000高清美术资源免费获取终极指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 你是否曾为寻找高质量的游戏美术素材而烦恼&#xff1f;无论是角色…...

基于Arduino与蓝牙的智能夜灯DIY:从硬件到App全流程解析

1. 项目概述&#xff1a;打造你的专属蓝牙智能夜灯如果你对Arduino和物联网项目感兴趣&#xff0c;一直想亲手做一个既能远程控制、又能播放音乐的智能小玩意儿&#xff0c;那么这个“8BitBox”项目绝对值得一试。它本质上是一个由Arduino驱动、通过Android手机蓝牙控制的智能夜…...

【信息科学与工程学】【通信工程】第四十四篇 城域网络设计10 城域网中涉及的数学物理、数学化学及数学地理01

城域网中涉及的数学、数学物理、数学化学及数学地理方法,并按照您要求的表格格式进行呈现。 编号 领域 类型 城域网领域 子领域 城域网架构 城域网中的数学/数学物理/数学化学方法/算法/现象 现象描述/算法/函数逐步推理思考的数学方程式(完整的参数列表、常数、变量、…...

Midscene.js视觉驱动自动化测试终极教程:跨平台AI测试实战深度解析

Midscene.js视觉驱动自动化测试终极教程&#xff1a;跨平台AI测试实战深度解析 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 还在为多设备、多平台测试的碎片化…...

从开发者控制台直观感受Taotoken的用量监控与审计功能

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从开发者控制台直观感受Taotoken的用量监控与审计功能 对于依赖大模型API构建应用的开发者而言&#xff0c;清晰、及时地掌握资源消…...

Diablo Edit2:解放暗黑破坏神II角色定制的终极免费工具

Diablo Edit2&#xff1a;解放暗黑破坏神II角色定制的终极免费工具 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 还在为暗黑破坏神II中无尽的刷怪升级感到疲惫吗&#xff1f;想要快速体验不同职…...

基于多模态视觉模型和图文向量模型的工业图像知识库研究与应用

目录1 概述... 12 单一模型分析的局限性... 23 多模态视觉模型和图文向量模型的优势... 34 多模态视觉模型和图文向量模型应用场景... 45 多模态视觉模型和图文向量模型原理... 46 多模态视觉模型和图文向量模型应用... 86.1 图片知识库... 86.2 检索图片... 117.总结... 13…...

Adafruit IO Feeds:物联网数据流管理的核心枢纽与实战指南

1. 项目概述&#xff1a;为什么Feeds是物联网项目的“数据心脏”如果你正在玩转物联网项目&#xff0c;无论是用ESP32做个家庭气象站&#xff0c;还是用树莓派监控植物生长&#xff0c;最终都会遇到一个核心问题&#xff1a;数据往哪存&#xff0c;怎么管&#xff1f;传感器读数…...