[读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言
1. 制作真正的IPL
- IPL 启动程序装载器, 用来装载程序
- 分析代码
; haribote-ipl
; TAB=4ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述JMP entryDB 0x90DB "HARIBOTE" ; ブートセクタの名前を自由に書いてよい(8バイト)DW 512 ; 1セクタの大きさ(512にしなければいけない)DB 1 ; クラスタの大きさ(1セクタにしなければいけない)DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする)DB 2 ; FATの個数(2にしなければいけない)DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする)DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない)DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない)DW 9 ; FAT領域の長さ(9セクタにしなければいけない)DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない)DW 2 ; ヘッドの数(2にしなければいけない)DD 0 ; パーティションを使ってないのでここは必ず0DD 2880 ; このドライブ大きさをもう一度書くDB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしいDD 0xffffffff ; たぶんボリュームシリアル番号DB "HARIBOTEOS " ; ディスクの名前(11バイト)DB "FAT12 " ; フォーマットの名前(8バイト)RESB 18 ; とりあえず18バイトあけておく; プログラム本体entry:MOV AX,0 ; レジスタ初期化MOV SS,AXMOV SP,0x7c00MOV DS,AX; ディスクを読むMOV AX,0x0820MOV ES,AXMOV CH,0 ; シリンダ0MOV DH,0 ; ヘッド0MOV CL,2 ; セクタ2MOV AH,0x02 ; AH=0x02 : ディスク読み込みMOV AL,1 ; 1セクタMOV BX,0MOV DL,0x00 ; AドライブINT 0x13 ; ディスクBIOS呼び出しJC error; 読み終わったけどとりあえずやることないので寝るfin:HLT ; 何かあるまでCPUを停止させるJMP fin ; 無限ループerror:MOV SI,msg
putloop:MOV AL,[SI]ADD SI,1 ; SIに1を足すCMP AL,0JE finMOV AH,0x0e ; 一文字表示ファンクションMOV BX,15 ; カラーコードINT 0x10 ; ビデオBIOS呼び出しJMP putloop
msg:DB 0x0a, 0x0a ; 改行を2つDB "load error"DB 0x0a ; 改行DB 0RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令DB 0x55, 0xaa
- 我们这里主要分析下面这段代码
1.2 相应指令分析
- INT 0x13 实际上是BIOS 的19 号函数, 用来操作硬盘
对照上面的说明, 我们可以发现, 代码中, 将AH 赋值为 0x02, 实际上是读盘操作, 读取 AL 个扇区,* 将读取数据写入到内存 【ES:BX】所指定的位置处*
另外如果操作出现问题, 会将错误号码存入AH 中, 并将 CF(进位) 标志位标记为 TRUE
1.3 软盘驱动器的构造
ie, 一张软盘有80个柱面, 2 个磁头, 18 个扇区, 每个扇区 512 byte, 总容量 1440kb, 共计2880 个扇区
- 一般我们为了书写方便, 如果使用DS 段寄存器, 可以省略
2. 试错代码
这里我们使用SI 记录错误尝试的次数, 超过 5 次就显示 error 信息, 否则继续尝试, 需要注意的是, 由于AH 放置了错误信息, 在重新尝试的时候, 需要将其进行复位 AH = 0
3. 读到18扇区
上面的代码只是读取了 磁盘中的 2 号扇区, 利用相同的方式, 我们可以读取后面的扇区, 由于1 个柱面总共有 18 个扇区, 因此这里我们只读到 18 扇区, ie, 读取一个柱面
这里每次向后读一个扇区, 需要将段寄存器 ES 向后移动 0x0020, ie, 内存地址向后移动 0x200, (正好就是 512 byte)
- 实际上, 他也是借助了一个循环进行实现
4. 读入 10 个柱面
这里需要注意的是, 由于一个柱面上虽然只有 18 个扇区, 但是他有正反两面, 2 个磁头, 所以在循环的时候, 需要注意寄存器变量的切换工作
5. 着手开发操作系统
- 一般向一个空软盘保存文件的时候:
- 文件名会写在0x002600 以后的地方
- 文件的内容会写在0x004200 以后的地方
6. 从启动区执行操作系统
- 当需要指定执行的操作系统的代码的时候, 在相应的xx.nas 里面加入ORG 0xc200 指令 (0x8000 + 0x4200)
7. 确认操作系统的执行情况
下面给出了 设置显卡的一些说明
ie, 我们这里采用的是 vga 图形模式
8. 32bit 模式前期准备
- 如果使用了 32bit 模式, 就不能调用 BIOS 的相关功能了, 这是因为BIOS 是通过16bit机器语言编写的, 如果想要使用BIOS 实现一些功能, 最好全部都放在开头来实现, 一旦进入32bit 模式就不能再调用 BIOS 函数了
9. 开始导入C 语言
- 使用C 语言, 需要涉及相应的链接工作
[读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言相关推荐
- 30天自制操作系统Day3
一.内存分布图 二.启动区汇编代码 这段代码是启动区代码,启动区的代码会保存到0x7c00至0x7dff(ORG 0x7c00),0x7c00之前的区域存放着BIOS程序或让BIOS程序用来实现各种功 ...
- 30天自制操作系统 Day3
BIOS的寄存器和磁盘 http://community.osdev.info/?(AT)BIOS 作者给的这个页面可能需要科学上网,访问不了.我的选择是暂时放弃T_T.反正作者写了我们在还页面上会看 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...
- 《30天自制操作系统》笔记(04)——显示器256色
<30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...
- 《30天自制操作系统》笔记(09)——绘制窗口
<30天自制操作系统>笔记(09)--绘制窗口 进度回顾 上一篇中介绍了图层式窗口管理的思路和算法.在此基础上,本篇就解决绘制窗口及其简单的优化问题. 这里稍微吐槽一下<30天自制操 ...
- 《30天自制操作系统》学习笔记--第好多天
之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...
- 《30天自制操作系统》-day3(MAC)
第3天 进入32位模式并导入C语言 基本配置 汇编语言内容 文件 hanbote.nas ipl.nas Makefile 原因 用法 基本配置 设备:Macbookpro(13-inch,2018) ...
- 30天自制操作系统——第1天 从计算机结构到汇编程序入门
落灰一学期的<30天自制操作系统>,希望能够利用大二最后这几个月完成操作系统的制作,以下是我阅读本书所记录的笔记以及学习过程,愿顺利完成. 1.先动手操作 (1)安装"二进制编辑 ...
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...
最新文章
- 返回手势导致页面卡死并且UI错乱的问题解决
- 6-java代码片段
- 教你 Shiro + SpringBoot 整合 JWT
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-6.微信扫码登录回调本地域名映射工具Ngrock...
- 高并发高可用高性能的解决方案
- 初学者关于贝叶斯纳什均衡各类符号的一点理解
- matlab绘图答案,专题四 MATLAB绘图--专题测验【含答案】
- 腾讯地图手把手教你实现微信小程序路线规划
- tensor之维度转换
- 会议OA(会议排座送审)
- 不得不了解的HTTP协议
- java gui界面设计qq_Java swing界面开发(仿QQ登录界面)
- Oracle EBS中分类账和法人实体 的关系(有sql语句实例)
- shell一键自动化批量安装服务
- chrome浏览器被360流氓捆绑,如何解决?
- 京东数科商用智能机器人首次亮相2019CES
- 如何下载国家标准分幅影像地图
- 安装SQLnbsp;SERVERnbsp;2000最后提示“安装…
- 手写板比较(可能不该发到这里)
- hdu 3509 Buge's Fibonacci Number Problem