问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

自制操作系统入门:环境搭建与"Hello World"实现

创作时间:
作者:
@小白创作中心

自制操作系统入门:环境搭建与"Hello World"实现

引用
CSDN
1.
https://m.blog.csdn.net/huihuiwuhui/article/details/138223500

操作系统开发是一个既复杂又充满挑战的领域,但通过一些基础的工具和简单的代码,我们也可以尝试制作一个最基础的操作系统。本文将带你从零开始搭建操作系统开发环境,并编写一个简单的"Hello World"程序。

工具准备

  • Bochs-win64-2.6.11:这是一个X86硬件模拟器,用于模拟计算机硬件环境。
  • nasm:这是一个汇编编译器,用于将汇编语言代码转换为机器代码。

Bochs安装

安装过程非常简单,只需按照默认设置进行即可。在安装过程中,建议勾选生成DLX Linux Demo选项,这将为你提供一个Linux操作系统的示例环境。

安装完成后,你会在目录中看到一个dlxlinux文件夹,这就是之前选择生成的Linux demo。

nasm安装

nasm的安装也非常简单,只需解压即可使用,整个安装包只有677kb大小。

编写操作系统代码

现在,让我们来编写一个最简单的操作系统代码,实现"Hello World"功能。

; cherry-os
ORG 0x7c00 ;ROM-BIOS 将读取硬盘主引导扇区的内容,将它加载到内存地址0x0000:0x7c00 处
;下面用于描述FAT12格式的软盘
JMP entry
DB 0x90
DB "CHRRYIPL" ;启动区的名称可以是任意的字符串,但长度必须是8字节
DW 512; 每一个扇区的大小,必须是512字节
DB 1 ;簇的大小(必须为1个扇区)
DW 1 ;FAT的起始位置(一般从第一个扇区开始)
DB 2 ;FAT的个数 必须是2
DW 224;根目录的大小 一般是224项
DW 2880; 该磁盘的大小 必须是2880扇区
DB 0xf0;磁盘的种类 必须是0xf0
DW 9;FAT的长度 必须是9扇区
DW 18;1个磁道(track) 有几个扇区 必须是18
DW 2; 磁头个数 必须是2
DD 0; 不使用分区,必须是0
DD 2880; 重写一次磁盘大小
DB 0,0,0x29 ;扩展引导标记 固定0x29
DD 0xffffffff ;卷列序号
DB "CHERRY-OS  " ;磁盘的名称(11个字节)
DB "FAT12   " ;磁盘的格式名称(8字节)
TIMES 18 DB 0; 先空出18字节 这里与原文写法不同
;程序核心
entry:
    MOV AX,0  ;初始化寄存器
    MOV SS,AX
    MOV SP,0x7c00
    MOV DS,AX
    MOV ES,AX
    MOV SI,msg
putloop:
    MOV AL,[SI]
    ADD SI,1
    CMP AL,0
    JE fin
    MOV AH,0x0e ;显示一个文字
    MOV BX,15 ;指定字符的颜色
    INT 0x10 ;调用显卡BIOS
    JMP putloop
fin:
    HLT ;CPU停止,等待指令
    JMP fin ;无限循环
msg:
    DB 0x0a , 0x0a ;换行两次
    DB "hello, cherryOS"
    DB 0x0a
    DB 0
    
    TIMES 0x1fe-($-$$) DB 0 ;填写0x00,直到0x001fe
    
    DB 0x55, 0xaa

这段代码定义了一个最简单的操作系统,它会在启动时显示"hello, cherryOS"。代码中包含了FAT12文件系统的相关参数,以及显示字符串的核心逻辑。

编译代码

使用nasm编译器将汇编代码编译成二进制镜像文件:

nasm hello.asm -o hello.img

这将生成一个512字节的镜像文件,可以作为操作系统的启动扇区。

运行程序

接下来,我们需要在Bochs中配置虚拟机环境来运行这个操作系统。打开dlxlinux文件夹中的bochsrc.bxrc文件,修改以下关键配置:

# 机器有多少内存
megs: 32
#设置对应真实机器的 BIOS 和 VGA BIOS 。
#对应两个关键字为 : romimage 和 vgaromimage
romimage: file=/home/ba/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/ba/bochs/share/bochs/VGABIOS-lgpl-latest
#选择启动盘符
boot: disk  #从硬盘启动
# 设置日志文件的输入位置
log: bochs.out
# 关闭鼠标,打开键盘
mouse: enabled=0
keyboard: keymap=/home/ba/bochs/share/bochs/keymaps/x11-pc-us.map
# 设置硬盘 path 设置成我们之前编译好的文件
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="helloos.img", cylinders=306, heads=4, spt=17

这些配置定义了虚拟机的内存大小、BIOS类型、启动设备以及硬盘映像文件的位置。

准备工作就绪

完成上述配置后,双击bochsrc.bxrc文件,Bochs将启动虚拟机并加载你的操作系统。如果一切正常,你应该能看到屏幕上显示"hello, cherryOS"。

总结

虽然这个操作系统非常简单,但它包含了操作系统开发的一些基本概念:

  • ROM-BIOS将读取硬盘主引导扇区的内容,加载到0x07c00处(规定)
  • 一个有效的主引导扇区,其最后两字节应当是0x55 和0xAA(规定)
  • 一段精心编写的主引导扇区代码将检测用来启动计算机的操作系统,并计算出它所在的硬盘位置。然后,它把操作系统的自举代码加载到内存,也用jmp 指令跳转到那里继续执行,直到操作系统完全启动。

屏幕如何显示文字

为了显示文字,通常需要两种硬件,一是显示器,二是显卡。显卡的职责是为显示器提供内容,并控制显示器的显示模式和状态,显示器的职责是将那些内容以视觉可见的方式呈现在屏幕上。

显卡控制显示器的最小单位是像素,黑色和白色只需要一个比特就能表示,显示更多的颜色需要更多比特,现在是用24个比特来对应一个像素。操作显存里的比特,使得屏幕上能显示出字符的形状,是非常麻烦、非常繁重的工作,因为你必须计算该字符所对应的比特位于显存里的什么位置,于是就有了ASCII码,用数字代表字符;如0X4c 代表“L”.

为了显示字符,处理器需要访问显存,把字符的ASCII码写进去。显存是在显卡上的,不能直接访问,为了直接访问显存,直接将0XB8000~0XBFFFF这段物理地址空间,留给显卡,由显卡来提供,用来显示文本。

待完善

目前的实现还比较基础,接下来可以尝试创建一块虚拟硬盘,将操作系统写入虚拟硬盘后再执行,这样可以支持更复杂的功能和更大的文件系统。

疑问

有人将asm文件编译成.bin 格式,然后再转成img,与这样直接编译成.img的区别是啥呢?

实际上,.bin和.img格式的主要区别在于它们的用途和兼容性:

  • .bin:通常用于存储纯二进制数据,没有额外的文件系统信息。在某些情况下,.bin文件可以直接写入磁盘或闪存设备,但需要确保目标设备的分区和格式与.bin文件的内容相匹配。
  • .img:通常包含完整的磁盘映像,包括分区表和文件系统信息。这种格式更灵活,可以包含多个分区和文件系统,适合用于创建完整的虚拟磁盘。

在本例中,我们直接将汇编代码编译成.img格式,这样可以确保生成的镜像文件包含了所有必要的启动信息和文件系统结构。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号