环境vmware+ubuntu22.04.1
安装依赖
sudo apt install build-essential
sudo apt-get install libghc-x11-dev
sudo apt-get install xorg-dev
下载Bochs并解压到相应的目录下
Bochs-2.6.8
创建一个空目录
mkdir bochs
进入解压后的bochs-2.6.8文件夹
配置bochs的config文件,编译安装
sudo ./configure \
--prefix=/home/llh/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11
make
make install
这个时候在进入到你创建的bochs目录你会看到俩个文件夹一个bin和share表示安装成功
配置bochs
创建**bochsrc.disk
**文件
# Bochs配置文件
# 机器内存: 32MB
megs: 32
# 启动方式
boot: disk
# 关闭鼠标,打开键盘
mouse: enabled=0
keyboard:keymap=/home/llh/bochs/share/bochs/keymaps/x11-pc-us.map
# BIOS VGA
romimage:file=/home/llh/bochs/share/bochs/BIOS-bochs-latest
# 如 romimage:file=/home/zzz/bochs/share/bochs/BIOS-bochs-latest
vgaromimage:file=/home/llh/bochs/share/bochs/VGABIOS-lgpl-latest
# 输出日志
log:bochsout.txt
# 硬盘设置
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
# 这一行就是上一个步骤输出的
ata0-master: type=disk, path="hd60M.img", mode=flat
创建启动磁盘
bin/bximage
然后依次在输入框依次输以下
1
hd
flat
60
hd60M.img
编写主引导块记录
;主引导程序
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
mov ax,0x600
mov bx,0x700
mov cx,0
int 0x10
mov ah,3
mov bh,0
int 0x10
mov ax,message
mov bp,ax
mov cx,5
mov ax,0x1301
mov bx,0x2
int 0x10
jmp $
message db "hello"
times 510-($-$$) db 0
db 0x55,0xaa
编译汇编代码并写入hd60M.img硬盘
nasm -o mbr.bin mbr.s
dd if=/home/llh/bochs/mbr.bin of=/home/llh/bochs/hd60M.img bs=512 count=1 conv=notrunc
启动bochs
bin/bochs -f bochsrc.disk
关于内存结构的一些知识:
c/c++:
-
代码段(text):就是C程序编译后的机器指令,也就是我们常见的汇编代码。
-
数据段(data):用来存放显式初始化的全局变量或者静态(全局)变量,常量数据。
-
BSS段(Block Started by Symbol): 存储未初始化的全局变量或者静态(全局)变量。编译器给处理成0;
-
栈段(stack):存放函数调用相关的参数、局部变量的值,以及在任务切换的上下文信息。栈区是由操作系统分配和管理的区域。
-
堆段(heap): 动态内存分配的区域,也就是malloc申请的内存区,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。
汇编:
- 可读可写的数据区:.text
- 只读代码区:.data
- 可读可写且没有初始化的数据区:.bss