os-bochs

ddatsh

dev #asm asm

效果

更新下wsl和ubuntu

https://github.com/microsoft/WSL/releases

wsl -v
WSL 版本: 2.1.0.0
内核版本: 5.15.137.3-1
WSLg 版本: 1.0.59
MSRDC 版本: 1.2.4677
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.22621.3007

Bochs

Bochs 有一个内置调试器,可以用来调试系统内核,尤其调试系统内核未初始化内置调试之前的系统引导阶段代码逻辑

下载

https://sourceforge.net/projects/bochs/files/bochs/2.7

装依赖

apt-get install g++ libx11-dev xserver-xorg-dev xorg-dev libsdl1.2-dev bximage vgabios build-essential nasm libgtk2.0-dev libgtk-3-dev  libxpm-dev  libxrandr-dev

配置编译安装三步曲

./configure --with-x11 --with-wx --enable-debugger --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-plugins --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

make -j$(nproc)
make install

boot.asm

cat > boot.asm <<EOF
    ; 文件名 boot.asm

    org 7c00h                     ; BIOS读入MBR后,从固定的0x7c00h处开始执行。因此引导程序一定要放在这个位置才能执行。

    ; 下面部分和10h有关中断,10h中断用来显示字符
    ; 8086CPU 16位寄存器想用20位寻址,于是加了段寄存器。为了向后兼容,后来一直保留下来。
    mov ax, cs					  
    mov es, ax
    mov ax, msg
    mov bp, ax                    ; ES:BP表示显示字符串的地址
    mov cx, msgLen                ; CX存字符长度
    mov ax, 1301h                 ; AH=13h表示向TTY字符终端显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
    mov bx, 000Ch                 ; BH=00h表示页号第0页,BL=0ch表示颜色红色
    mov dl, 0                     ; 表示位于第0列
    int 10h						  ; 在上面这些固定的寄存器当中放好数据后,直接调用中断函数即可

    msg: db "Hello,OS World!"
    msgLen: equ $ - msg           ; 字符串长度
    times 510 - ($ - $$) db 0     ; 填充剩下的空间,使生成的二进制代码恰好为512字节
    dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR,即主引导记录(是装有Linux系统的硬盘的第一个扇区)
EOF
nasm boot.asm -o boot.bin

写入到mbr的二进制文件,不能是elf格式,只能使用nasm编译出来的纯bin格式

bximage -func=create -fd="1.44M" a.img -q
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

# 生成空白软盘镜像,1474560 这个大小是固定的,3条语句一样
dd if=/dev/zero of=floppy.img bs=1474560 count=1
dd if=/dev/zero of=floppy.img bs=512 count=2880
dd if=/dev/zero of=floppy.img bs=1024 count=1440
    
# 制作包含主引导记录 boot.bin 的启动镜像文件,512 字节的引导程序
dd if=boot.bin of=/mnt/d/tmp/myos.img bs=512 count=1
# 引导程序复制到软盘上。在 bin 生成的镜像文件后补上空白,成为合适大小
dd if=floppy.img of=/mnt/d/tmp/myos.img skip=1 seek=1 bs=512 count=2879
参数 说明
if=文件名 输入文件名,默认为标准输入。即指定源文件
of=文件名 输出文件名,默认为标准输出。即指定目的文件
ibs=bytes 一次读入bytes个字节,即指定一个块大小为bytes个字节
obs=bytes 一次输出bytes个字节,即指定一个块大小为bytes个字节
bs=bytes 同时设置读入/输出的块大小为bytes个字节
cbs=bytes 一次转换bytes个字节,即指定转换缓冲区大小
skip=blocks 从输入文件开头跳过blocks个块后再开始复制
seek=blocks 从输出文件开头跳过blocks个块后再开始复制
count=blocks 仅拷贝blocks个块,块大小等于ibs指定的字节数
conv=<关键字> 关键字可以有以下11种
关键字 说明
conversion 用指定的参数转换文件
ascii 转换ebcdic为ascii
ebcdic 转换ascii为ebcdic
ibm 转换ascii为alternate ebcdic
block 把每一行转换为长度为cbs,不足部分用空格填充
unblock 使每一行的长度都为cbs,不足部分用空格填充
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
swap 交换输入的每对字节
noerror 出错时不停止
notrunc 不截短输出文件
sync 将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
cat > bochsrc <<EOF
megs: 32  # 内存大小32M
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest, options=fastboot
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
floppya: 1_44=a.img, status=inserted
boot: floppy
log: bochsout.txt
mouse:enabled=0
EOF
bochs -f bochsrc

bochs 虚拟器调试中输入 info ivt 可以查看 BIOS中断向量表

GUI

display_library: x, options=“gui_debug”

Bochs 的字符调试界面使用起来效率很低。有Java 写了个调试界面,配合 Bochs 使用

https://code.google.com/archive/p/peter-bochs/downloads

ref

https://github.com/yifengyou/The-design-and-implementation-of-a-64-bit-os

https://cloud.tencent.com/developer/article/1773860

https://blog.csdn.net/puss0/article/details/127826603