欢迎访问个人博客,阅读此文http://www.yandong.org/archives/266
L4ka:pistachio是一种微内核,关于微内核的一些情况曾经介绍过一些,看这里。
本文使用的虚拟机是:bochs
不过如果你使用qemu的话也可以,而且也不用写配置文件了,直接输入命令就可以了
qemu-system-i386 -fda l4.img
准备工作
1.最好新建一个工作文件夹,如l4ka_demo,并cd到该文件夹
2.下载这个,这是官方给出的一个用于演示而且已经编译封装好的内核。解压缩,会得到一个bin文件。
动手啦:
第一步: 使用bximg创建一张软盘镜像l4ka_floppy_demo.img
第二步: 将bin文件写入img镜像文件中去。
dd if=***.bin of=l4ka_floppy_demo.img bs=512
第三步: 写bochs的配置文件bochsrc,
其内容大致如下:
config_interface: textconfig romimage: file=/opt/bochs-2.5.1/bios/BIOS-bochs-latest megs: 32 vgaromimage: file=/opt/bochs-2.5.1/bios/VGABIOS-lgpl-latest # what disk images will be used floppya: 1_44=l4ka_floppy_demo.img, status=inserted boot: floppy log:bochsout.txt mouse: enabled=0 keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
注意:我的bochs是我自己编译安装在/opt下面的,注意更改你们的路径
第四步:运行
bochs -f bochsrc
第五步:运行结果大致如下图
bochs+软盘镜像(img)+自己编译的内核
准备工作:
1.新建一个一个文件夹
2.下载l4ka的源代码,在这里。
3.编译需要这几个东西gcc(2.95.2)、 g++、 build-essential 、binutils(2.9.*) ,记得安装它们
可以动手了
第一步:编译内核(kernel)
解压缩代码,会发现目录中大致有五个文件夹,需要关心的是其中的 kernel和user。
cd path/l4ka-pistachio-29d455c/kernel
你会看到下面的内容
Aieeee, this is the SOURCE directory! ------------------------------------- 1. Run make BUILDDIR=<absolute path of nonexisting directory> 2. Chdir to the build directory! 3. Verify the settings in Makeconf.local! 4. Run make menuconfig or make xconfig! 5. Run make again!
按照这个做就行了。需要注意的是在第4步中,主要是一些选项,如果你只是急于看到内核跑起来是什么样子的,默认就行了。而且,你勾选的太多会使内核变得很大。
第二步:编译用户工具(user)
除了内核之外,还需要一些user-level的工具,编译之。主要是下面几步:
1.mkdir l4ka-pistachio/x86-x32-user-build 2.cd l4ka-pistachio/x86-x32-user-build 3.../user/configure 4.make 5.make install
编译过内核的都知道,源代码和编译的结果不会放在一个文件夹下面,否则会很乱。所以都会新建一个目录,用来存放编译的结果。上面的意思是首先新建一个目录,然后cd到这个目录,最后调用源代码文件(../user)的congfigure,接着make,make install。
这里第一个需要注意的地方是,如果阅读user文件夹中的README和INSTALL就会了解,在congfigure之前,要cd到源代码目录(../user),执行下面两个命令 autoheader 和 autoconf。如果没有这两个工具,安装之。 为了省去一行行输入gcc或g++进行编译的麻烦,我们常把一些编译命令和配置写在makefile文件中,然后执行make命令,但makefile的编写,也是很蛋疼的,所以就有了关于makefile的自动工具。。。
第二个需要注意的地方是configure的参数 ,建议如此写 path/user/configure –prefix=/absolute path/user-install –with-kerneldir=../x86-kernel-build。 其中–prefix的作用是把你编译生成的一些可运行程序都放在user-install 目录,要不然,嘿嘿你就蛋疼地要一个一个找它们出来。 –with-kerneldir:你的user-level工具是基于l4ka内核的,必然需要知道l4ka放在什么位置,才好编译通过。
第三步:汇总
你主要得到了这么几个程序
kickstart — 这是一个功能比较丰富的引导程序,将内核的其他部分load进来,初始化kernel interface page等等。
sigma0 — 负责初始化address space
pingpong — 一个测试IPC的程序
以及x86-kernel ,grabmem,l4test等
第四步:创建软盘镜像
使用bximg创建一个floppy.img。在命令行输入bximg,看提示输入即可。
第五步:挂在img
losetup /dev/loop0 floppy.img mke2fs /dev/loop0 mkdir /mnt/l4ka chmod 777 /mnt/l4ka mount /dev/loop0 /mnt/l4ka
第六步:拷贝内核文件
把编译内核的那些程序统统拷到 /mnt/l4ka下面。至少要包括 kickstart,x86-kernel ,sigma0,pingpong。
第七步:使用grub引导
内核要是想跑起来,需要有个引导程序,不妨使用grub吧。
首先,拷贝grub使用的一些策略文件:
mkdir -p /mnt/boot/grub cp /boot/grub/stage1 /mnt/boot/grub cp /boot/grub/stage2 /mnt/boot/grub cp /boot/grub/e2fs_stage1_5 /mnt/boot/grub (不是必须的)
接着,在/mnt/l4ka/boot/grub下创建menu.list,其中的内容如下
timeout 5 title l4ka kernel /kickstart module /x86-kernel module /sigma0 module /pingpong boot
最后,要把grub写进软盘(即img),大家应该知道引导程序(boot strapper)一般在第一个扇区(512字节),所以要想能让floppy.img 是一个可以启动的磁盘,那么就应该在它的第你一个扇区写点东西。当然grub能做更复杂的事情,但是这不用你纠结,你只需要敲这么结果命令就Ok了
sudo grub --device-map=/dev/null 进入grub交换界面 grub> device (fd0) /dev/loop0 把loop0映射成fd0,即一个软盘 grub>root (fd0) 识别硬盘和文件格式,学会使用tab自动补全 grub>setup (fd0) 安装grub到制定地方
如果你想看看到底发生了什么,使用下面的命令
dd if=floppy.img of=check.img bs=512 count=1
截取floppy也即软盘fd0,第一个扇区的内容以供查看,要不然原文太大。
vim -b check.img
使用16进制查看,如果没有显示16进制,在vim的命令模式输入%!xxd,稍等片刻便会看到。
我们这是要看什么呢,有什么好看的?我们要看它的第一扇区(512字节)里面前后的变化,特别是最后两个字节(510,511处),如果引导程序设置成功,最后两个字节应该是55aa。这是规定,如果不是,那么你用虚拟机启动定会看到”no bootable device”
第八步:写bochs配置文件bochsrc
config_interface: textconfig romimage: file=/opt/bochs-2.5.1/bios/BIOS-bochs-latest megs: 32 vgaromimage: file=/opt/bochs-2.5.1/bios/VGABIOS-lgpl-latest # what disk images will be used floppya: 1_44=floppy.img, status=inserted boot: floppy log:bochsout.txt mouse: enabled=0 keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
注意:我的bochs是我自己编译安装在/opt下面的,注意更改你们的路径
第九步:运行
bochs -f bochsrc
如果成功运行会看到下面截图中的内容
注:使用虚拟机的时候按下ctrl+alt+3或者其他的快捷键,才会输入下面的内容。