《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

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

一般向一个空软盘保存文件时,

1)文件名会写在0x002600以后的地方

2)文件的内容会写在0x004200以后的地方

img

如果与C语言联合使用,有的寄存器能自由使用:EAX/ECX/EDX,其他寄存器只能使用其值,不能改变其值

char *p;//用于BYTE类地址
short *p;//用于WORD类地址
int *p;//用于DWORD类地址

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

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)集合成一个中断信号的装置。

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

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

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

人麻了,以为路径表示不对,跟着重新打了一遍一模一样的,最后发现是拼写失误!IMG写成ING了。

改了名称,一切正常。

网上跟我同一个报错的,但理由又是各不相同。

问题3数据也能执行吗?msg 机器语言也能显示吗?entry

不会报错,标号只是一个数字,但会错乱

不太懂以下的语句:

0A 0A——OR CL,[BP+SI]

68 65 6C——PUSH 0x6c65

问题4

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

问题5 无法生成sys文件

磁盘名称11字节

代码抄错,生成镜像文件时,一定要确保bin,sys, Makefile 同时存在

报错驱使我把代码看得更细

人才:把200写成了2OO,吐血

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

学会定位错误。添加新的中间文件makefile时,需要注意前后的连贯性,是否需要添加/增减

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

忘记声明全局变量了

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

问题可能出在makefile/naskfunc.nas/bootpack.c中

问题

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

使用32位寄存器需要你进入保护模式,进入保护的方法就是开A20 gate,我看下面几行的汇编应该就是在对CR0的这个位进行设置,从而进行快速A20。如果想使用64位寄存器,就必须在进入保护模式之后,开启长模式(long mode)。

uploading.4e448015.gif

正在上传…重新上传取消正在上传…重新上传取消

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的作用:类似目录
  • 报错首先检查笔误,再依次按关联度从高到低排查文件

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

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

相关文章

【传记】-综述

写在前面 “我就是想告诉你们, 别废了自己在部队的日子,做人要有目标感。” “别混日子了,小心日子把你们给混了。”—— 老马 影视来源于生活,借用《士兵突击》中老马的话开篇,回到现实,我们也确实需要时时…

C语言常见面试题:什么是内存管理,C语言中如何进行内存管理?

内存管理是计算机科学中的一个重要概念,它涉及到如何有效地分配、使用和释放计算机内存。内存管理是操作系统和编程语言实现中的一项关键任务,它确保了程序能够安全、有效地运行。 在C语言中,内存管理主要通过以下方式进行: 静态…

提升养殖场效益,从饲料粉碎机开始

为了提高养殖效益,养殖户可以从很多方面着手,其中饲料成本是一个重要的因素。为了降低饲料成本,养殖户可以考虑从饲料粉碎环节入手。通过购买和采用高效、低成本的饲料粉碎机,养殖户可以更好地控制饲料成本,提高饲料的…

互动直播项目 梳理 自定义视频帧控件 BitmapControl

目录 一、自定义控件 lib静态库引用 1、控件源文件位置 2、ui_kit 静态lib库项目

ElementName与RelativeSource局限性

引言 xaml代码中属性的绑定主要是通过元素名或类型进行查找绑定和解析的,但是当在后台生成控件或面对popup、menuitem时,发现他们都查找不到这时为什么呢? 局限性 1、无法绑定后台生成控件 xaml中声明的元素会自动被添加进可视化树中&…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

win10通过ssh链接deepin23并开启x11转发

前提 主机环境:win10 lstc 虚拟机环境:deepin23beta2 终端:tabby x11服务器: vcxsrv 安装ssh sudo apt install ssh开启root登录(看你需求) 首先你要给root账号设置密码 sudo passwd root修改配置文件 sudo vim /etc/ssh/ss…

windows安装PostgreSQL后进行远程连接,发生SSL错误

1. 报错情况 SSL 关闭 的 pg_hba.conf 记录 (pgjdbc: autodetected server-encoding to be GB2312, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf) 或是乱码提示,提示中有SSL、 pg_hba.con…

Go语言grpc服务开发——Protocol Buffer

文章目录 一、Protocol Buffer简介二、Protocol Buffer编译器安装三、proto3语言指南四、序列化与反序列化五、引入grpc-gateway1、插件安装2、定义proto文件3、生成go文件4、实现Service服务5、gRPC服务启动方法6、gateway服务启动方法7、main函数启动8、验证 相关参考链接&am…

Go、容器以及Linux调度器

在容器中运行Go应用程序时,需要设置合理的GOMAXPROCS,从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时,重要的一点是要设置CPU限制以确保容器不会耗…

Python 潮流周刊第 37 期(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 周刊全文:h…

Python无人驾驶系统的重要性

Python无人驾驶系统的重要性。无人驾驶系统是一个复杂而庞大的项目,涉及到多个模块和算法,代码量非常庞大。 一个完整的无人驾驶系统通常由以下几个主要模块组成: 感知模块 - 通过传感器(如相机、激光雷达等)获取周围…

YOLOv8-Seg改进:轻量化改进 | RepGhost,通过重参数化实现硬件高效的Ghost模块

🚀🚀🚀本文改进:RepGhost,通过重参数化实现硬件高效的Ghost模块,性能优于GhostNet、MobileNetV3等,在移动设备上具有更少的参数和可比的延迟。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1…

CMU15-445 Project0

CMU14445 Task #1 - Copy-On-Write Trie Get()思路: 获取根节点指针,顺着key逐字符往下找节点,最后根据题意可以使用dynamic_cast检查是否是TrieNodeWithValue(dynamic_pointer_cast也可以),以下为两者用法&#xff1…

Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

文章目录 摘要1.问题的提出引出当前研究的不足与问题KGC方法LLM幻觉现象解决方案 2.数据集和模型构建数据集模型方法基线方法任务模型方法基于LLM的KGC的知识前缀适配器知识前缀适配器 与其他结构信息引入方法对比 3.实验结果与分析结果分析:可移植性实验&#xff1…

SQL 关键字参考手册(二)

目录 SQL 关键字 SQL CREATE TABLE 关键字 CREATE TABLE 使用另一个表创建表 SQL CREATE PROCEDURE 关键字 CREATE PROCEDURE SQL CREATE UNIQUE INDEX 关键字 CREATE UNIQUE INDEX SQL CREATE VIEW 关键字 CREATE VIEW 查询视图 SQL DATABASE 关键字 CREATE DATA…

Web3 游戏开发者的数据分析指南

作者:lesleyfootprint.network 在竞争激烈的 Web3 游戏行业中,成功不仅仅取决于游戏的发布,还需要在游戏运营过程中有高度的敏锐性,以应对下一次牛市的来临。 人们对 2024 年的游戏行业充满信心。A16Z GAMES 和 GAMES FUND ONE …

【VUE】v-if 和 v-show 大详解(多角度分析+面试简答版)

多角度分析+面试简答版 一、`v-if` 和 `v-show` 的区别之多角度分析控制手段:编译过程:编译条件:性能消耗:总结使用场景二、 `v-if`、`v-show`、`display:none` 和`visibility: hidden` 的区别三、简洁版回答:`v-show` 与 `v-if` 比较一、v-if 和 v-show 的区别之多角度分…

网络安全热门岗位大盘点

网络安全已成为当今社会不可或缺的重要领域,国家和企业越来越重视网络安全,众多厂商也纷纷加大网络安全岗位的招聘力度。如果你对网络安全感兴趣,不妨了解一下这些热门岗位! 🎯首席信息官(CISO)…