《30天自制操作系统》 第一周(D1-D7) 笔记
前言:这是我2023年5月份做的一个小项目,最终是完成了整个OS。笔记的话,只记录了第一周。想完善,却扔在草稿箱里许久。最终决定,还是发出来存个档吧。
一、汇编语言
基础指令
- MOV: move赋值,数据传送指令。一个规则:源数据和目的数据必须位数相同。该指令的数据传送源和传送目的地,不仅可以是寄存器或常数,而且可以是内存地址
- ADD: add加,演算指令
- CMP: compare比较指令
- JMP: jump/goto跳转,跳转到指定的内存地址(例如:JMP 0x7c50)
- ORG: origin源头起点,程序要从指定的该地址开始
- DB: define byte往文件里直接写入1个字节的指令,db小写功能相同;也可直接用它写字符串
- RESB: reserve byte预留n个字节,空出地址上自动填充0x00
条件跳转指令
- JE: jump if equal如果相等就跳转
- JB: jump if below如果小于就跳转
- JAE: jump if above or equal大于或等于时就跳转
- JBE: jump if below or equal小于或等于时就跳转
- JC: jump if carry如果进位标志是1就跳转
- JNC: jump if not carry如果进位标志是0就跳转
其他指令
- DW: define word16位,2字节
- DD: define double-word32位,4字节
- BYTE/WORD/DWORD: 保留字
- DWORD: Double Word双字节数据类型,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位
- entry: 入口,标签的声明,指定JMP指令的跳转目的地【汇编中,所有标号都是数字,其对应的数字由汇编语言编译器根据ORG指令计算出来】
- EQU: equal声明常数
- fin: finish结束
- INT: interrupt中断,调用BIOS函数的指令
- HLT: halt停止,让CPU停止动作的指令(进入待机状态),节能
- CLI: clear interrupt flag中断标志置为0
- STI: set interrupt flag中断标志置为1
- EFLAGS: 存储进位标志和中断标志等标志的寄存器
- PUSHFD: push flags double-word标志位的值按双字节长压入栈
- POPFD: pop flags double-word标志位的值按双字节长从栈弹出
- LGDT: 指定一个内存地址,从指定的地址【ESP+6】读取6个字节后赋值给GDTR寄存器(48位)
- 将指定的段上限【存放在ESP+4】和地址值【ESP+8】赋值给名为GDTR的48位寄存器(低位放在内存地址小的字节里,前)
- $: 这一行现在的字节数;若有ORG,代表将要读入的内存地址
- []: 内存/主存,对于CPU,其为外部存储器
二、存储相关概念

缓冲区地址:从软盘上读出的数据装载到内存的哪个位置
EBX处理4G内存,32位基址寄存器
起辅助作用的段寄存器:MOV AL,[ES:BS] 代表ES*16+BX的内存地址
先用附加段寄存器指定一个大致的地址,然后再用基址寄存器来指定其中一个具体地址
可以默认省略数据段寄存器DS,DS必须预先指定为0:
例如
MOV CX,[1234] 等价于MOV CX,[DS:1234]
MOV AL,[SI]等价于MOV AL,[DS:AL]
指定处理的扇区数,范围在0x01-0xff(指定0x02以上的数值时,要特别注意能够连续处理多个扇区的条件。如果是FD的话,似乎不能跨越多个磁道,也不能超过64KB的界限)
读盘顺序:扇区-磁头-柱面
AH=0x02: 读盘
AH=0x03: 写盘
AH=0x04: 校验
AH=0x0c: 寻道
AL=处理对象的扇区数(只能同时处理连续的扇区)
CH=柱面号&0xff
CL=扇区号(0-5位)|(柱面号&0x300)>>2
DH=磁头号
DL=驱动器号
ES:BX=缓冲地址;(校验及寻道时不使用)
返回值:
FLAGS.CF: 进位标志
FLACG.CF==0: 没有错误,AH==0
FLAGS.CF==1: 有错误,错误号码存入AH内(与重置(reset)功能一样)
0x10(16号): 控制显卡
//显示一个字符 AH=0x0e; AL=character code; BH=0; BL=color code; 返回值:无
//系统复位,复位软盘状态,再读一次 AH=0X00 DL=0X00 INT=0x13
![]()
正在上传…重新上传取消正在上传…重新上传取消
一般向一个空软盘保存文件时,
1)文件名会写在0x002600以后的地方
2)文件的内容会写在0x004200以后的地方

如果与C语言联合使用,有的寄存器能自由使用:EAX/ECX/EDX,其他寄存器只能使用其值,不能改变其值
char *p;//用于BYTE类地址 short *p;//用于WORD类地址 int *p;//用于DWORD类地址
![]()
正在上传…重新上传取消正在上传…重新上传取消
os思想:把操作和机制分开
三、术语
TAB=4: TAB键的宽度
FAT=12: 用Windows或MS-DOS格式化出来的软盘就是该格式
boot sector: 启动区,软盘的第一个扇区(512字节为1扇区),一张软盘共有2880个扇区
IPL: initial program loader启动程序加载器,必须取8字节的名字
boot: bootstrap启动,原指靴子上附带的便于拿取的靴带,自力更生完成任务
BIOS: basic input output system基本输入输出系统,组装在电脑主板的ROM(read only memory)单元里
0x00007c00-0x00007dff: 启动区内容的装载地址
地址空间:一个进程用于寻址内存的一套地址集合。主要用于解决多个应用程序同时处于内存中并且互不影响的问题——保护和重定位。
.com: 地址空间可以非数字,以.com结尾的网络域名的集合也是地址空间。
sys是system的缩写,就是系统的意思,sys是Windows的系统文件。如安装文件,日志文件,驱动文件,备份文件,操作如播放等文件,还有些垃圾文件等诸如此类。 都是这类sys后缀名的。
sys文件是驱动程序的可执行代码,其扩展名为.sys,驱动程序安装保持在windows/system32/drivers目录中。
在windows中文件的文件的路径是用反斜杠(\)表示(当初是为了和Unix的文件路径使用”/“区分开来),例如 C:\windows\system,但是我们在写程序的时候能不能再路径的字符串中写成C:\windows\system?答案是不能的,这一点想一下就会可以理解,在很多编译器中,“\”是一个转义字符,例如“\n,\r”等,如果在程序中写成“C:\windows\system“那么实际上编译出来的就是“C:windowssystem ",从而获取不到文件,但是这个路径可以写成C:\windows\system,或者也可以用正斜杠C:/windows/system,这两中方式都是可以的。说到这里,基本上这两种用法不会混淆了,只要记住”\“反斜杠有转义的功能,那么写路径的时候就不会出问题了。 顺便拓展一下,文件的相对路径和绝对路径: 例如一个绝对路径:C:\Windows\System\aaa.dll 如果当前目录是C:\windows 那么aaa.dll这个文件的地址可以表示为: ./system/aaa.dll 中”.“表示当前路径, …/windows/system/aaa.dll中”…“表示父级目录。
VGA显卡:VGA(Video Graphics Array)视频图形阵列是IBM于1987年提出的一个使用模拟信号的电脑显示标准。
sprintf: 只对内存进行操作,可应用于所有OS。不是按指定格式输出,只是将输出内容作为字符串写在内存中。能够不使用OS的任何功能。
分段:将4GB的内存分割,每一块的起始地址都看作0来处理
分页:paging,有多少个任务就要分多少页,还要对内存进行排序
GDT设定要优先于IDT
GDT: global (segment) descriptor table全局段号记录表。将这些数据整齐地排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在CPU内被称作GDTR(global segment descriptor table register)的特殊寄存器中,设定完成。C语言里不能对GDTR赋值。
IDT: interrupt descriptor table中断记录表
中断功能:当CPU遇到外部状况变化,或者是内部偶然发生某些错误时,会临时切换过去处理这种突发事件。这就是中断功能。
要使用鼠标,就必须要使用中断。
各个设备有变化时就产生中断,中断发生后,CPU暂时停止正在处理的任务,并做好接下来能够继续处理的准备,转而执行中断程序。中断程序执行完后,再调用事先设定好的函数,返回处理中的任务。正是得益于中断机制,CPU可以一直不用查询键盘、鼠标、网卡等设备的状态,将精力集中在处理任务上。
这就是为什么每个操作前后要加中断标志的原因叭~
系统专用和应用程序用 等价于 内核模式和用户模式
PIC: programmable interrupt controller可编程中断控制器。将8个中断信号IRQ(interrupt request)集合成一个中断信号的装置。
![]()
正在上传…重新上传取消正在上传…重新上传取消
PIC寄存器(8位)
IMR: interrupt mask register中断屏蔽寄存器。8位分别对应8路IRQ信号。如果该位值为1,对应IRQ信号被屏蔽,PIC忽视该路信号。理由:对中断设定进行更改时,如果再接受别的中断会引起混乱,所以要屏蔽;此外,还可以屏蔽静电干扰等。
ICW: initial control word初始化控制数据。(只有CPU里word指代16位,这里不一定)
OCW:操作命令字。OCW1写入奇地址口,OCW2、OCW3写入偶地址口。功能:PIC继续时刻监视IRQ信号中断是否发生。io_out8(PIC0_0CW2, 0x60+IDQ号码)
四、遇到的问题
描述问题1:模拟运行操作系统时,双击"!cons_9x.bat"启动失败。 解决方法:导致该问题的原因是我自己没有仔细看书上的标注,双击"!cons_nt.bat"重试后启动成功。原因是两个文件中的命令不同,"!cons_9x.bat"中命令为command,适合linux一类系统,而"!cons_nt.bat"中命令为cmd.exe适合我现在所用的windows系统。
问题2
![]()
正在上传…重新上传取消正在上传…重新上传取消
人麻了,以为路径表示不对,跟着重新打了一遍一模一样的,最后发现是拼写失误!IMG写成ING了。
改了名称,一切正常。
网上跟我同一个报错的,但理由又是各不相同。
问题3数据也能执行吗?msg 机器语言也能显示吗?entry
不会报错,标号只是一个数字,但会错乱
不太懂以下的语句:
0A 0A——OR CL,[BP+SI]
68 65 6C——PUSH 0x6c65
问题4
![]()
正在上传…重新上传取消正在上传…重新上传取消
![]()
正在上传…重新上传取消正在上传…重新上传取消
问题5 无法生成sys文件
磁盘名称11字节
代码抄错,生成镜像文件时,一定要确保bin,sys, Makefile 同时存在
报错驱使我把代码看得更细
人才:把200写成了2OO,吐血
![]()
正在上传…重新上传取消正在上传…重新上传取消
学会定位错误。添加新的中间文件makefile时,需要注意前后的连贯性,是否需要添加/增减
![]()
正在上传…重新上传取消正在上传…重新上传取消
忘记声明全局变量了
![]()
正在上传…重新上传取消正在上传…重新上传取消
问题可能出在makefile/naskfunc.nas/bootpack.c中
问题
![]()
正在上传…重新上传取消正在上传…重新上传取消
使用32位寄存器需要你进入保护模式,进入保护的方法就是开A20 gate,我看下面几行的汇编应该就是在对CR0的这个位进行设置,从而进行快速A20。如果想使用64位寄存器,就必须在进入保护模式之后,开启长模式(long mode)。
![]()
正在上传…重新上传取消正在上传…重新上传取消
INSTRSET指令:告诉nask这个程序是给486使用的哦,nask会将EAX解释成寄存器名
486是英特尔系列的CPU【32位】
指定内存时,不知道是BYTE,WORD,DWORD,只有另一方也是寄存器的时候才能省略
p不是指针,而是地址变量,用于存放地址值
问题:如何显示字符
这个逻辑还是没有搞清楚
//extern char hankaku[4096]; why can delete?
//GDT的长度是怎么定的?0x270000-0x27ffff
问题:
第六天中的GB到底是什么?
1GB(Gigabyte)=1024MB
G:granularity颗粒度,单位的大小
4KB * 1M=4GB。1KB * 1M = 1GB。
问题: 为什么键盘输入需要缓冲区
缓冲区其实就是一块内存空间,它用在硬件设备和用户程序之间,用来缓存数据, 目的是让快速的CPU 不必等待慢速的输入输出设备,同时减少操作硬件的次数。
_io_stihlt
汇编语言写的函数,链接到C语言使用时,一定要加_
根据CPU规范,机器语言的STI指令之后,如果紧跟着HLT指令,那么就暂不受理这两条指令之间的中断,而要等到HLT指令之后才受理,所以使用io_stihlt函数就能克服这一问题
最常出现的错误:can't link
关注细节语法错误,重点看中断部分
.h 和 naskfunc.nas
问题:
改善FIFO缓冲区,还存在E0问题
五、总结感悟
- 头文件.h 和 makefile类正则匹配的共同目的:减少重复片段
- 头文件.h的作用:类似目录
- 报错首先检查笔误,再依次按关联度从高到低排查文件
相关文章:
《30天自制操作系统》 第一周(D1-D7) 笔记
前言:这是我2023年5月份做的一个小项目,最终是完成了整个OS。笔记的话,只记录了第一周。想完善,却扔在草稿箱里许久。最终决定,还是发出来存个档吧。 一、汇编语言 基础指令 MOV: move赋值,数据传送指令…...
SQL注入:报错注入
SQL注入系列文章:初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入? 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand(随机数) floor(向上取整&…...
K8s 安装部署-Master和Minion(Node)文档
K8s 安装部署-Master和Minion(Node)文档 操作系统版本:CentOS 7.4 Master :172.20.26.167 Minion-1:172.20.26.198 Minion-2:172.20.26.210(后增加节点) ETCD:172.20.27.218 先安装部署ETC…...
OpenAI 降低价格并修复拒绝工作的“懒惰”GPT-4,另外ChatGPT 新增了两个小功能
OpenAI降低了GPT-3.5 Turbo模型的API访问价格,输入和输出价格分别降低了50%和25%。这对于使用API进行文本密集型应用程序的用户来说是一个好消息。 OpenAI官网:OpenAI AIGC专区:aigc 教程专区:AI绘画,AI视频&#x…...
springboot+value静态属性获取配置文件中的值的操作方法
1.配置类需要让spring管理 2.set方法不要加static 3.如果静态属性是private修饰,则在使用的时候,需要 类名.getXXX方法 如果静态属性是public修饰,则在使用的时候,需要 类名.属性名 import org.springframework.beans.factory.an…...
Prometheus 架构全面解析
在本指南中,我们将详细介绍 Prometheus 架构。 Prometheus 是一个用 Golang 编写的开源监控和告警系统,能够收集和处理来自各种目标的指标。您还可以查询、查看、分析指标,并根据阈值收到警报。 此外,在当今世界,可观…...
把批量M3U8网络视频地址转为MP4视频
在数字媒体时代,视频格式的转换已成为一项常见的需求。尤其对于那些经常处理网络视频的用户来说,将M3U8格式的视频转换为更常见的MP4格式是一项必备技能。幸运的是,现在有了固乔剪辑助手这款强大的工具,这一过程变得异常简单。下面…...
联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案
近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …...
Keycloak - docker 运行 前端集成
Keycloak - docker 运行 & 前端集成 这里的记录主要是跟我们的项目相关的一些本地运行/测试,云端用的 keycloak 版本不一样,不过本地我能找到的最简单的配置是这样的 docker 配置 & 运行 keycloak keycloak 有官方(Red Hat Inc.)的镜像&#…...
架构篇27:如何设计计算高可用架构?
文章目录 主备主从集群小结计算高可用的主要设计目标是:当出现部分硬件损坏时,计算任务能够继续正常运行。因此计算高可用的本质是通过冗余来规避部分故障的风险,单台服务器是无论如何都达不到这个目标的。所以计算高可用的设计思想很简单:通过增加更多服务器来达到计算高可…...
Python 有用的库模块
简介 Python中有许多常用的库或者模块,在写代码的时候或多或少会遇到,本文对其进行总结,方便日后查阅。 pprint Python中的pprint模块是用于打印数据结构(如字典,列表等)的模块,提供了一种以…...
vivado DDS学习
实现DDS通常有两种方式,一种是读取ROM存放的正弦/余弦信号的查表法,另一种是用DDS IP核。这篇学习笔记中,我们要讲解说明的是VIVADO DDS IP核的应用。 目前本篇默认Phase Generator and SIN/COS LUT(DDS)的standard模式…...
微信小程序(十六)slot插槽
注释很详细,直接上代码 上一篇 温馨提醒:此篇需要自定义组件的基础,如果不清楚请先看上一篇 新增内容: 1.单个插槽 2.多个插槽 单个插糟 源码: myNav.wxml <view class"navigationBar custom-class">…...
gtest 单元测试
文章目录 前言一、Google Test介绍1.1 gtest源码下载编译1.2 常用API介绍1.3 gtest运行参数介绍 二、Google Mock参考资料 前言 Google Test(简称gtest)是一个开源的C单元测试框架。和常见的测试工具一样,gtest提供了单体测试常见的工具和组…...
掌握assert的使用:断言在错误检查和调试中不可或缺
断言在错误检查和调试中不可或缺 一、简介二、断言的基本语法和用法三、错误检查与断言四、 调试与断言五、避免滥用断言六、总结 一、简介 断言是一种在程序中用于检查特定条件是否满足的工具。一般用于验证开发者的假设,如果条件不成立,就会导致程序报…...
概念杂记--到底啥是啥?(数据库篇)
文章目录 1.聚集索引(clustered index)2.非聚集索引(Non-clustered index)3.聚集索引和非聚集索引区别?4.覆盖索引(covering index)5、复合索引 (Composite Index)6.索引…...
Ubuntu20.4 Mono C# gtk 编程习练笔记(四)
连续实时绘图 图看上去不是很清晰,KAZAM录屏AVI尺寸80MB, 转换成gif后10MB, 按CSDN对GIF要求,把它剪裁缩小压缩成了上面的GIF,图像质量大不如原屏AVI,但应该能说明原意:随机数据随时间绘制在 gtk 的 drawin…...
1 月 26日算法练习
文章目录 九宫幻方穿越雷区走迷宫 九宫幻方 小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个33的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…...
今日AI大热潮,明日智能风向标
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
03 SB实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)
1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址:portal/findAllTypes 请求方式:get 请求参数:无 响应数据: 成功 {"code":"200","mes…...
Arduino轻量级CRC-32校验库:零依赖、低内存、确定性执行
1. 项目概述Arduino_CRC32 是一个面向嵌入式场景轻量级 CRC-32 校验库,专为 Arduino 及兼容平台(如 STM32 Core for Arduino、ESP32 Arduino Core)设计。其核心目标并非追求极致吞吐性能,而是以零依赖、低内存占用、确定性执行时间…...
如何利用爬虫技术快速精准地抓取目标数据?
1. 爬虫策略:从"无脑抓"到"精准狙击" 我刚入行时犯过一个典型错误——用单线程脚本无差别抓取整站数据,结果不仅触发反爬机制被封IP,还浪费三天时间清洗90%的无用数据。现在回头看,合理的爬虫策略就像狙击手…...
Ansible Playbook实战指南:从基础到高级技巧全解析
1. Ansible Playbook基础入门 第一次接触Ansible Playbook时,我被它简洁的YAML语法和强大的自动化能力惊艳到了。记得当时需要给50台服务器部署Nginx,传统方式要手动操作每台机器,而用Playbook只花了10分钟就搞定了全部部署。这种效率提升让我…...
2025届最火的五大AI学术方案实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI写作工具,是借助自然语言处理技术所开发出来的智能软件,它可以辅助…...
2025最权威的降AI率助手推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 背景是人工智能生成内容越来越普及,降AIGC工具因此出现,目的是降低文…...
跨境人都在用的TT跨境出海矩阵软件哪个靠谱?
你有没有过这种经历?拍十几条TT营销视频花了整整一周,上线后播放量却寥寥无几,账号矩阵的日更计划完全跟不上?做跨境TT矩阵,核心痛点从来不是多账号登录,而是内容量产、成本控制和合规风险的三重夹击。到底…...
AutoCAD数据处理的.NET解决方案:ACadSharp全功能指南
AutoCAD数据处理的.NET解决方案:ACadSharp全功能指南 【免费下载链接】ACadSharp C# library to read/write cad files like dxf/dwg. 项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp 在工程数字化时代,如何高效处理AutoCAD文件数据已成…...
本科论文知网AI率高的原因和解决方法全在这里
知网AIGC检测出来AI率高,很多同学第一反应是"我没有全程用AI写啊,为什么这么高?"这个问题确实需要好好解释一下——知网检测到的AI率高,未必是因为你完全靠AI写的。 知网AIGC检测是怎么工作的 知网的AIGC检测系统会分…...
PHP 8新特性盘点
PHP 8 新特性概览PHP 8 引入了多项重大改进和新功能,以下为关键特性总结:JIT 编译器即时编译:通过 JIT(Just-In-Time)编译器提升性能,尤其适用于 CPU 密集型任务。配置选项:在 php.ini 中可通过…...
ESP-01s固件烧录与Arduino编程:从接线玄学到一键下载的避坑指南
1. ESP-01s模块入门:为什么你的接线总是出错? 第一次接触ESP-01s的朋友,十有八九会在烧录固件或上传程序时遇到各种莫名其妙的失败。我见过太多人把模块插上CH340就以为万事大吉,结果在电脑前折腾一整天都搞不定下载。这其实是因为…...
