只有一个内核跑linux,第一步,用qemu启动linux内核,从跑个Helloworld开始

老生长谈的内容了,就是自己编译内核,然后制作initramfs,在用qemu跑

起来。不过在这之前先跑个helloworld玩玩。

顺便我在学校写博客的笔记本系统是ubuntu16.04,在实习单位玩的时候用的系统是centos7,两个不同的地方我会尽量说明,当然有些地方我自己也不是很清楚就是了。

编译内核

#  建一个目录

$  mkdir build

# 首先當然是去下一個linux內核,地址, 我这里选的版本是3.10.104

$ wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.10.104.tar.xz

#  解压

$ tar xvf linux-3.10.104.tar.xz

$ cd linux-3.10.104

$ make menuconfig

进行内核选项配置,其中的内容非常多,我也没看完,但是由于这次我们什么都用不到,也不用编译模块,可以把Device Driver里绝大部分和一些不常用的东西都勾选掉.具体配置自己参照网上吧,也可以直接用别人配好的设置直接覆盖.  为了方便务必把debug info 勾选上.

# -j8的选项是为了让编译更快点,一般这数字选择为cpu核数*2.

$ make -j8

# ls -la linux-3.10.104/arch/x86_64/boot/bzImage

lrwxrwxrwx 1 seijia seijia 22 12月 17 23:52 linux-3.10.104/arch/x86_64/boot/bzImage -> ../../x86/boot/bzImage

$ cp linux-3.10.104/arch/x86_64/boot/bzImage ..

#  安装qemu,可以自己去下源码安装,我比较懒直接用apt-get安装了

$   sudo apt-get install qemu

制作initrd

/*hello.c*/

#include void main()

{

printf("Hello World\n");

printf("Hello World\n");

printf("Hello World\n");

/*强制刷新输出,不然可能打印不出来*/

fflush(stdout);

while(1);

}

initrd吧,全称是initial ramdisk,在内核启动的时候会先去加载的一种文件系统.

$ cd ..

# 使用静态编译链接.

$ gcc -static -o helloworld hello.c

# 将helloworld制作成cpio

$ echo helloworld | cpio -o --format=newc > rootfs

1776 blocks

$ ls -la rootfs

-rw-rw-r-- 1 seijia seijia 909312 12月 21 13:15 rootfs

# 使用qemu进行启动

$ qemu-system-x86_64 \

-kernel ./bzImage \

-initrd ./rootfs \

-append "root=/dev/ram rdinit=/helloworld"

qemu的-kernel 和-initrd能够绕过bootload直接对指定的kernel和ramdisk进行加载.用-append进行额外的选项配置,在这里我们把根目录直接设置成内存,启动的init程序设置成放进去的helloworld.

a870390ef7a72f02d05922eb1629f66a.png

最后结果,因为while(1),启动会一直停在这里.

当然只有helloworld我们是什么都做不了的.这时候就需要busybox了,用它启动之后就能使用绝大多数的linux命令了.如果有不对的地方欢迎指出,不过我这么一个小博客也没人看吧(敲打

第一次这个编辑器花了很久才会用,第一次写格式全崩了...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值