本次写博客之前,先看了看其他已经交了的同学的博客,顿时觉得自己对本章内容理解还不到位,于是又回去重新整理了一遍,将本章内容汇总如下:
基于Linux内核源代码构造一个简单的操作系统MenuOS。
- 存储程序计算机
- 函数调用堆栈
- 中断
- 中断上下文:保存现场和恢复现场
- 进程上下文
Linux内核源码的目录结构如下图所示:
net:存放与网络相关代码,如TCP/IP协议栈等。
在构建MenuOS系统时,我选择使用自己的linux系统来构建。
建立一个LinuxKernel文件夹,键入以下指令:
cd ~/LinuxKernel/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
下载源代码
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make
运行内核源代码
此处make时会出现找不到compiler-gcc6.h和compiler-gcc7.h文件的错误,查找资料即可发现,compiler-gcc6与compiler-gcc7内容基本相同,所以即可以下载下compiler-gcc6之后复制重命名为compiler-gcc7,再将其放入include/linux目录下即可。
返回上级目录,键入如下命令:
mkdir rootfs
创建目录用于存放文件系统
git clone https://github.com/mengning/menu.git
从GitHub上克隆menu
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
将init复制到rootfs下,因为系统启动时默认先启动init
find . | cpio -o -Hnewc | gzip -9 > ../rootfs.img
把当前rootfs下的所有文件打包成一个镜像文件
运行结果如图:
init是第一个用户态进程,是1号进程。把init复制到rootfs目录下边,使用cpio的方式把当前rootfs下的所有文件打包成一个镜像文件,这时一个简单的根文件系统的镜像就制作好了。
键入如下命令:
make menuconfig
kernel hacking
-> Compile-time checks and compiler options
[*]compile the kernel with debug info
make
在make menuconfig
时找不到curses.h文件,通过键入命令sudo apt-get install libncurses5-dev
即可解决。
原文:https://www.cnblogs.com/zisong/p/9904253.html