leevis.com
leevis.com copied to clipboard
Macbook OSX 安装bochs并运行
安装bochs
- 安装bochs的图形界面:
brew install sdl
. - 从 https://sourceforge.net/projects/bochs/files/bochs/ 地址选择一个版本的源码下载。
- 运行configure生成makefile,并安装。如果编译过成有错误,需要修复一下。
./configure --enable-ne2000 \ --enable-all-optimizations \ --enable-cpu-level=6 \ --enable-x86-64 \ --enable-vmx=2 \ --enable-pci \ --enable-usb \ --enable-usb-ohci \ --enable-e1000 \ --enable-debugger \ --enable-disasm \ --disable-debugger-gui \ --with-sdl \ --prefix=/usr/local/bochs make && make install
至此,bochs就安装成功了。
运行
在安装目录的share/doc/bochs/bochsrc-sample.txt
是配置文件的模版,参考编写一个命名为bochsrc
megs: 32
romimage: file=share/bochs/BIOS-bochs-latest
vgaromimage: file=share/bochs/VGABIOS-lgpl-latest
mouse: enabled=0
# keyboard: keymap=share/bochs/keymaps/sdl-pc-us.map
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="./conf/hd60m.img", mode=flat, cylinders=121, heads=16, spt=63
#gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
# disk, floppy
boot: disk
log: log/bochs.out
虚拟磁盘需要用到bochs安装目录下./bin/bximage
, 直接运行按照提示生成一个盘。
生成好了,会提示配置到bochsrc文件中,上面给的配置文件已经配置好了。
运行: bin/bochs -f conf/bochsrc
brew install bochs
直接安装运行不起来。
模拟从磁盘加载系统
;主引导程序
;------------------------------------------------------------
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
; 清屏利用 0x06 号功能,上卷全部行,则可清屏。
; -----------------------------------------------------------
;INT 0x10 功能号:0x06 功能描述:上卷窗口
;------------------------------------------------------
;输入:
;AH 功能号= 0x06
;AL = 上卷的行数(如果为 0,表示全部)
;BH = 上卷行属性
;(CL,CH) = 窗口左上角的(X,Y)位置
;(DL,DH) = 窗口右下角的(X,Y)位置
;无返回值:
mov ax, 0x600
mov bx, 0x700
mov cx, 0 ; 左上角: (0, 0)
mov dx, 0x184f ; 右下角: (80,25),
; VGA 文本模式中,一行只能容纳 80 个字符,共 25 行。
; 下标从 0 开始,所以 0x18=24,0x4f=79
int 0x10 ; int 0x10
;;;;;;;;; 下面这三行代码获取光标位置 ;;;;;;;;;
;.get_cursor 获取当前光标位置,在光标位置处打印字符。
mov ah, 3 ; 输入: 3 号子功能是获取光标位置,需要存入 ah 寄存器
mov bh, 0 ; bh 寄存器存储的是待获取光标的页号
int 0x10 ; 输出: ch=光标开始行,cl=光标结束行
; dh=光标所在行号,dl=光标所在列号
;;;;;;;;; 获取光标位置结束 ;;;;;;;;;;;;;;;;
;;;;;;;;; 打印字符串 ;;;;;;;;;;;
;还是用 10h 中断,不过这次调用 13 号子功能打印字符串
mov ax, message
mov bp, ax ; es:bp 为串首地址,es 此时同 cs 一致,
; 开头时已经为 sreg 初始化
; 光标位置要用到 dx 寄存器中内容,cx 中的光标位置可忽略
mov cx, 0xb ; cx 为串长度,不包括结束符 0 的字符个数
mov ax, 0x1301 ;子功能号 13 显示字符及属性,要存入 ah 寄存器,
; al 设置写字符方式 ah=01: 显示字符串,光标跟随移动
mov bx, 0x2 ; bh 存储要显示的页号,此处是第 0 页,
; bl 中是字符属性,属性黑底绿字(bl = 02h)
int 0x10 ; 执行 BIOS 0x10 号中断
;;;;;;;;; 打字字符串结束 ;;;;;;;;;;;;;;;
jmp $ ; 使程序悬停在此
message db "hello world"
; $是当前行地址,$$ 是当前 section 起始地址,($ - $$) 计算出前面的偏移,并去除最后 2 字节,将剩余部分填充为 0
times 510-($-$$) db 0
;最后 2 字节,固定为 0x55,0xaa
db 0x55,0xaa
另一个hello world 程序。
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ah, 03h
xor bh, bh
int 10h
add dh, 01h
mov ax, Str
mov bp, ax
mov cx, 0x17
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
Str: db "Hello world! by vislee."
times 510-($-$$) db 0
dw 0xaa55
保存上述文件,编译为可执行文件,用dd写到上述生成的虚拟磁盘。
nasm -o helloworld helloworld.S
# 注意hd60m.img 是上面用bximage生成的虚拟盘
dd if=../src/helloworld of=hd60m.img bs=512 count=1 conv=notrunc
再次运行 ./bin/bochs -f ./conf/bochsrc
看到下面的提示就启动成功了。
You can also start bochs with the -q option to skip these menus.
1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit now
Please choose one: [6]
回车后键入c,就会启动bochs模拟器,在终端输出了 hello world。
运行linux0.12
从 http://oldlinux.org/Linux.old/bochs/ 下载 linux-0.12-080324.zip 包。解压后,
linux-0.12-080324
├── Bochs-2.3.6.exe
├── SYSTEM.MAP
├── bochs-2.3.6-1.i586.rpm
├── bochsout.txt
├── bochsrc-0.12-fd.bxrc
├── bochsrc-0.12-hd.bxrc
├── bochsrc-sample.txt
├── bootimage-0.12-fd
├── bootimage-0.12-hd
├── copy.txt
├── debug.bat
├── diska.img
├── diskb.img
├── linux-0.12-README
├── rootimage-0.12-fd
├── rootimage-0.12-hd
└── snapshot.txt
0 directories, 17 files
修改 bochsrc-0.12-hd.bxrc 文件中的,romimage 和 vgaromimage,改为安装的bochs目录下share下的对应文件。
romimage: file=~/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=~/bochs/share/bochs/VGABIOS-lgpl-latest
按照上述步骤运行:
~/bochs/bin/bochs -f ./bochsrc-0.12-hd.bxrc
就会启动一个linux-0.12版本的系统。 用户名为root,进去后还有个hello.c 文件,用gcc编译可以运行。
你好👋,你的mac是m1芯片的吗