公司动态

OS 开发(一)

📅 2026/7/17 5:37:19
OS 开发(一)
1. 配置开发环境安装 nasm 和 bochssudo pacman -S nasmsudo pacman -S bochsbochs 的安装在新版的archlinux中不一定能成功 参考一下直接从官网下载 bochs bochs官网编译安装tar -zxvf bochs-*.tar.gz cd bochs-* ./configure --enable-debugger --enable-disasm make sudo make install2. 测试1boot.asm编写简单的 boot.asm 来[org 0x7c00] ; 设置屏幕模式为文本清楚屏幕 mov ax, 3 int 0x10 ; 设置段寄存器 mov ax, 0x0000 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7c00 ; 设置文本显示器的内存区域 mov ax, 0xb800 mov ds, ax mov byte [0x0000], H ; 阻塞 jmp $ ; 设置填充0填充512字节 times 510 - ($ - $$) db 0 ; 主引导扇区的最后两个字节必须是 0x55 和 0xaa以便 BIOS 能够识别它为有效的引导扇区 db 0x55, 0xaa编译nasm -f bin boot.asm -o boot.bin(2) 创建硬盘镜像创建硬盘镜像[dandan src]$ bximage -q -hd16 -funccreate -sectsize512 -imgmodeflat master.img bximage Disk Image Creation / Conversion / Resize and Commit Tool for Bochs $Id$ Creating hard disk image master.img with CHS32/16/63 (sector size 512) The following line should appear in your bochsrc: ata0-master: typedisk, pathmaster.img, modeflat解释这个命令和屏幕输出把电脑硬盘想象为一个空白的笔记本bximage 这是一个专门制造“空白笔记本”的工具-hd16 这个笔记本一共16MB-sectsize512 每1MB会被分成很多个小分每次只能写512字符-imgmodeflat 这个笔记本用原始平铺的方式装订的也就是普通的二进制文件没有压缩、没有加密统一标准master.img: 给这个笔记本起名为master.img屏幕输出CHS32/16/63 这是这个笔记本的三维坐标C32 柱面H16 磁头 S63扇区ata0-master: typedisk, pathmaster.img, modeflat模拟器启动时 要在第一个插槽ata0-master上插上这块硬盘 文件路径是 master.img,3 将 boot.bin 写入主引导扇区dd ifboot.bin ofmaster.img bs512 count1 convnotrunc将 boot.bin 文件的前 512 字节数据 写入到 master.img 磁盘镜像文件的开头位置 并且保留 master.img 文件的原有大小和其他数据通常用于安装操作系统的引导扇区 MBR, 即主引导记录dd linux下数据复制与转换工具ifboot.bin 输入文件从这个文件中读取数据ofmaster.img 输出文件将数据写入到这个目标文件bs512 块大小每次读写512字节count1 复制数量只复制1个块所以只会写入512个字节的数据 在磁盘结构中 512字节正好是一个传统硬盘的一个扇区大小核心关键 convnotrunc(不截断) 意思是不截断输出文件没有这个参数dd 会在写入之前把 master.img 文件截断清空为0字节 然后写入512字节 结果就是 master.img 回变成只有 512 字节的小文件 磁盘镜像中原有的分区表文件系统数据回全丢失加上这个参数 dd只会覆盖master.img开头的前512字节 后面的原有的原封不动 这帮正了镜像文件的大小不变且后续文件系统数据不受影响。结果显示[dandan src]$ ls -l total 16 -rw-r--r-- 1 dan dan 460 Jul 14 03:06 boot.asm -rw-r--r-- 1 dan dan 512 Jul 14 06:10 boot.bin -rw-r----- 1 dan dan 16515072 Jul 16 06:45 master.img4配置 bochs键入 bochs 之后输入以下操作这一系列操作 本质上是模拟计算机完整启动过程 —— 扮演 BIOS固件 和 硬盘制造者 的角色 把汇编代码变为 虚拟硬盘上 CPU 能识别的第一行指令。boot.asm 这是 CPU 上电后执行的第一段逻辑[org 0x7c00] BIOS规定 它从硬盘读取引导扇区后 必须把 512 字节数据原封不动的记载到内存的 0x7c00 地址。这句话告诉编译器 后面所有的内存地址计算都要从 0x7c00 开始编译 nasm boot.asm -o boot.bin 翻译为 CPU 执行的语言创建硬盘镜像 bximage 制作虚拟的空白硬盘在linux系统中创建一个名为 master.img 的普通文件 但是把这个文件模拟成一块容量为 16 MB 虚拟硬盘真实的硬盘有成千上万个扇区 BIOS启动时只读第一个扇区(MBR 主引导扇区) 但后续操作系统还要读取后面的扇区 但是必须要有一个符合硬盘扇区尺寸 512字节/扇区的容器不能直接把 boot.bin 当硬盘用 因为单独一个boot.bin 没有容量概念。写入主引导扇区 dd 把代码放到硬盘开头master.img 现在是一个 16MB 的全0文件 使用dd 把编译好的512字节的boot.bin 覆盖写入到master.img 开头的512 字节处。最终 使用 Bochs 加载 master.img 启动