一直想好好学学linux,又不知道该从哪入手,看了很多书,也都是过目即往,总感觉眼高手低,看什么都似曾相识,做起来完全找不到北。
下定决心从代码看起,最新的代码太长太多,根据各位大神推荐,决定从0.11的代码开始学习。
从代码学起当然不只是看代码,重点在于实验,希望本次学习可以从零开始构建起一个可以运行的系统,这个系列也以实验为主。
首先,配置开发环境,不建议一次配出完整的开发环境,既然是一系列的实验,不妨且做且配,根据需要不断的完善开发环境,也避免一次进行过长的枯燥无味的配置。linux启动的第一阶段是从as86汇编开始(除去bios阶段),所以首先配置汇编的开发环境,我用的是linux mint进行开发的,这里软广一下这个发行版,是我至今用过的最好用的linux,配置过程很简单:sudo apt-get install bin86,包括了汇编器as86和链接器ld86,一句话搞定。
前边说了,这段代码包含着linux启动的秘密,从名字上看这个boot文件也像是一个启动文件,那么怎么用这个文件启动电脑呢,方法很简单,需要两件东西:1、一个可以跑起来的电脑,2、一个包含boot文件的启动盘。
1、一个可以跑起来的电脑,我们都不是壕,没必要为了这么段小程序专门配一台测试机,使用虚拟机进行验证足以
2、一个启动盘,电脑都是虚拟机,启动盘当然也不会是真的软盘或光盘,用boot文件创建一个启动image文件即可
下面分别实现上边所说的两条:
1、安装虚拟机:
sudo apt-get install bochs 主程序
sudo apt-get install bochs-x x11插件
sudo apt-get install bochsbios 虚拟机bios
sudo apt-get install bximage 磁盘制作工具
2、制作磁盘
运行bximage,按照提示即可创建出所需要的磁盘,这里创建一个名为boot.img的软盘作为启动盘即可,然后运行dd bs=32 if=boot of=boot.img skip=1,将刚才生成的启动文件boot写入这个启动盘中,启动盘大小512k。
3、运行并配置虚拟机
运行sudo bochs即可开启虚拟机,虚拟机启动后需要加载配置文件(也可以配置好了直接加载,但是我喜欢手动加载),这里给出一个参考配置文件,其中的boot.img即为刚才创建的img文件,注意加载配置后需要手动输入continue,虚拟机才会继续执行:
下定决心从代码看起,最新的代码太长太多,根据各位大神推荐,决定从0.11的代码开始学习。
从代码学起当然不只是看代码,重点在于实验,希望本次学习可以从零开始构建起一个可以运行的系统,这个系列也以实验为主。
首先,配置开发环境,不建议一次配出完整的开发环境,既然是一系列的实验,不妨且做且配,根据需要不断的完善开发环境,也避免一次进行过长的枯燥无味的配置。linux启动的第一阶段是从as86汇编开始(除去bios阶段),所以首先配置汇编的开发环境,我用的是linux mint进行开发的,这里软广一下这个发行版,是我至今用过的最好用的linux,配置过程很简单:sudo apt-get install bin86,包括了汇编器as86和链接器ld86,一句话搞定。
配好开发环境当然要进行一些实验,下面这段代码虽然简单,却包含着linux启动的关键第一步,先来运行一下试试:
!
!test.s
!
.global begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x7c0
entry start
start:
jmpi go, BOOTSEG
go: mov ax, cs
mov ds, ax
mov es, ax
mov [msg1+17], ah
mov cx, #20
mov dx, #0x1004
mov bx, #0x000c
mov bp, #msg1
mov ax, #0x1301
int 0x10
loop1: jmp loop1
msg1: .ascii "Loading system ..."
.byte 13, 10
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
将上述代码保存为boot.s文件,运行as86 -0 -a -o boot.o boot.s进行编译,生成boot.o目标文件,运行ld86 -0 -s -o boot boot.o进行链接,得到可执行文件boot,文件大小为544k。
前边说了,这段代码包含着linux启动的秘密,从名字上看这个boot文件也像是一个启动文件,那么怎么用这个文件启动电脑呢,方法很简单,需要两件东西:1、一个可以跑起来的电脑,2、一个包含boot文件的启动盘。
1、一个可以跑起来的电脑,我们都不是壕,没必要为了这么段小程序专门配一台测试机,使用虚拟机进行验证足以
2、一个启动盘,电脑都是虚拟机,启动盘当然也不会是真的软盘或光盘,用boot文件创建一个启动image文件即可
下面分别实现上边所说的两条:
1、安装虚拟机:
sudo apt-get install bochs 主程序
sudo apt-get install bochs-x x11插件
sudo apt-get install bochsbios 虚拟机bios
sudo apt-get install bximage 磁盘制作工具
2、制作磁盘
运行bximage,按照提示即可创建出所需要的磁盘,这里创建一个名为boot.img的软盘作为启动盘即可,然后运行dd bs=32 if=boot of=boot.img skip=1,将刚才生成的启动文件boot写入这个启动盘中,启动盘大小512k。
3、运行并配置虚拟机
运行sudo bochs即可开启虚拟机,虚拟机启动后需要加载配置文件(也可以配置好了直接加载,但是我喜欢手动加载),这里给出一个参考配置文件,其中的boot.img即为刚才创建的img文件,注意加载配置后需要手动输入continue,虚拟机才会继续执行:
# configuration file generated by Bochs
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, gameport=1, iodebug=1
config_interface: textconfig
display_library: x
memory: host=32, guest=32
romimage: file="/usr/share/bochs/BIOS-bochs-latest"
vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest"
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="boot.img", status=inserted, write_protected=0
# no floppyb
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0
ata3: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
cpu: count=1, ips=4000000, model=bx_generic, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
cpuid: family=6, model=0x03, stepping=3, mmx=1, apic=xapic, sse=sse2, sse4a=0, sep=1, aes=0, xsave=0, xsaveopt=0, movbe=0, adx=0, smep=0, avx=0, avx_f16c=0, avx_fma=0, bmi=0, xop=0, tbm=0, fma4=0, vmx=1, x86_64=1, 1g_pages=0, pcid=0, fsgsbase=0, mwait=1
cpuid: vendor_string="GenuineIntel"
cpuid: brand_string=" Intel(R) Pentium(R) 4 CPU "
print_timestamps: enabled=0
debugger_log: -
magic_break: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
# no loader
log: test_log
logprefix: %t%e%d
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
keyboard: type=mf, serial_delay=250, paste_delay=100000, keymap=
user_shortcut: keys=none
mouse: enabled=1, type=ps2, toggle=ctrl+mbutton
parport1: enabled=1, file=""
parport2: enabled=0
com1: enabled=1, mode=null, dev=""
com2: enabled=0
com3: enabled=0
com4: enabled=0
通过上边这几步,已经可以成功的把一台虚拟机点亮,并在屏幕上输出红色的Loading system ...字样:
今天先到这里,做一个简单好玩的实验亲自启动一次系统,对开发调试环境有所认识,至于其中的原理,留待下次再说。