操作系统课程记录(2)————制作grub启动盘(1)

来源:互联网 发布:局域网时间同步软件 编辑:程序博客网 时间:2024/05/06 18:42

下载qemu模拟器

sudo apt-get install qemu

qemu是linux下的通用的,开放源码的机器模拟器和虚拟器。可以模拟多种架构下的系统。一般qemu命令不能直接使用,需要指定需要模拟的架构。这里我们使用qemu-system-i386

下载linux内核

linux内核在https://www.kernel.org/就可以下载到。国内的服务的话,中科大的镜像站很丰富的软件资源。当然,搜索厦门大学镜像站,清华大学镜像站什么的(不一定有,我没试过),都可以搜索到。中科大的下载地址在
http://mirrors.ustc.edu.cn/kernel.org/linux/kernel/
可以下载到。在里面选择自己的想要的版本就行了。我用的是linux-3.10.98,操作系统是Ubuntu16.10,32位版本的。(下面有些操作在64位下会出现问题,当然也不是不能解决)。
下载之后通过

tar -xzvf fileName.tar.gz

解压得到源码目录
下面就来编译linux源码,假设解压得到的linux的源码目录是~/Downloads/linux-3.10.98,于是采用i386的缺省编译:

  cd  ~/Downloads/linux-3.10.98  make i386_defconfig  make

make的过程可能会比较久。(据说make加上 -j num,其中num是你电脑的内核数目,会比较快。然而我下载了一个linux-4的源码,make跟make -j num没什么区别。)

准备一个应用程序

为什么需要准备应用程序以及接下来的操作是为什么,等以后我再补充吧,因为我也不是很懂。选择你喜欢的文本编辑器写一个helloworld.c程序在~目录下。

#include <stdio.h>int main(){    printf("hello world!\n");    while(1);    return 0;}

然后编译,注意gcc 的参数:

cd ~gcc -static -m32 helloworld.c -o hello

如果你是32位的系统,理应是没有问题的。如果你是64位的系统,可能因为-m32的缘故导致编译出错,在gcc之前你需要下载编译32位程序需要的库:

sudo apt-get install build-essential module-assistant  sudo apt-get install gcc-multilib g++-multilib  

然后你在~目录下就得到了一个hello可执行程序。

准备文件

cdmkdir rootfsmkdir rootfs/devsudo mknod rootfs/dev/console c 5 1sudo mknod rootfs/dev/ram d 1 0cp hello rootfs

生成映像

cd rootfsfind .| cpio -o --format=newc > ../rootfs.img

运行内核

cdqemu-system-i386 -kernel ./Downloads/linux-3.10.98/arch/x86/boot/bzImage -initrd rootfs.img -append "root=/dev/ram rdinit=/hello"

运行的结果应该是这样的:
这里写图片描述

无限输出是因为那一句while(1)语句。当然也可以不加,最后只会输出一句helloworld语句并且报attemp to kill init,which is...,是可以理解的。

0 0