想学习linux,又不知道从哪里下手,体系太大,哪块内容都很多,无奈下选择了linux0.11作为入口,本系列将是学习笔记,希望能坚持下去吧
环境配置
- 这里使用win10+bochs2.7
安装bochs
- 官网:https://bochs.sourceforge.io,需要使用oldlinux提供的bochs linux0.11编译环境的话就安装2.1版本,这里安装了2.7(不兼容)
- 安装目录新建个环境变量
BXSHARE
,并且也把该目录添加到环境变量Path
中,文件定位和命令行工具用
编译环境
安装nasm
- 官网:https://nasm.us
- 安装目录添加到环境变量
Path
中,到此可以做些汇编实验了
安装cygwin64
- 官网:https://www.cygwin.com
- 选择从互联网安装,下载站点随意,找到
make
和gcc
工具,安装后把bin目录添加到环境变量,这里均选择了最新版本 - 因为能编译gcc的原版本太低了,好像是1.4,也有用3.4的,冒出来个大胆的想法,看是否能够移植到最新的gcc11上来(可能不行,但肯定也能学到不少东西),,,
- 也有现成的boch编译环境可以用,需要安装boch2.1版本(和2.7不兼容),这里oldlinux.org下载链接提供一个bochs2.1的搭建好的linu0.11环境,也包含安装包,安装bochs后把其他文件都拷贝到安装目录就可以用了。里面已经移植了gcc1.4,里面也提供了linux0.11源码,做少量改动就可以编译,使用参考博文链接, 做的工作基本是把
/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、/linux/kernel/Makefile、/linux/kernel/math/Makefile、/linux/kernel/blk_drv/Makefile、/linux/kernel/chr_drv/Makefile
中的mstring-insns
字段删除,并把/usr/local/bin
中的ar
改名为gar
其他资源
- https://ftp.gnu.org/gnu/gcc/,gnu软件镜像站,可以找到老版本gcc
- https://gitee.com/flythecoder/linux0.11, gitee上一个linux0.11源码仓库,配套<<linux内核0.11完全注释V3.0>>
hello world程序
- 在自己的工作目录新建软盘
bximage
- 在自己的工作目录新建一个boot.asm文件
org 07C00h ; 告诉编译器程序加载到07C00处
mov ax, cs
mov ds, ax
mov es, ax
call DispStr ; 调用显示字符串例程
jmp $ ; 无限循环
DispStr:
mov ax, BootMessage
mov bp, ax ; es:bp = 串地址
mov cx, 16 ; cx = 串长度
mov ax, 01301h ; ah = 13, al = 01h
mov bx, 000Ch ; 页号为0(bh = 0) 黑底红字 (bl = 0Ch,高亮)
mov dl, 0
int 10h ; 10h号中断
ret
BootMessage: db "Hello,OS world!"
times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55
- 编译
nasm boot.asm -o boot.bin
- 写入软盘镜像,
dd
命令用于数据拷贝,if
指定输入文件,of
指定输出文件,bs
指定每次速去和写入的数据块大小,count
指定需要拷贝的数据块数量,conv=notrunc
表示在写入输出文件时不覆盖(不截断)原有其他数据,即只覆盖写入的部分
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
打开a.img可以看到boot.bin被写入了最前面
- 编写bochs配置文件
test.bxrc
,这里用到了上面配置的环境变量$BXSHARE
# how much memorythe emulated machine will have
megs: 32
# filename of ROMimages
romimage:file=$BXSHARE/BIOS-bochs-latest
vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
# what disk imageswill be used
floppya:1_44=a.img, status=inserted
# choose the bootdisk.
boot: floppy
# where do we sendlog messages?
log: bochsout.txt
# disable themouse
mouse: enabled=0
# enable keymapping, using Us layout as default
keyboard:keymap=$BXSHARE/keymaps/x11-pc-us.map
- 启动bochs
可以看到hello world已经输出
参考1:https://www.cnblogs.com/oasisyang/archive/2021/09/30/15358137.html,bochs一个hello world示例