os-bochs
ddatsh
效果
更新下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