基于mykernel2.0编写一个操作系统内核
------------恢复内容开始------------
基于mykernel 2.0编写一个操作系统内核
- 按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译;
- 基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码
- 简要分析操作系统内核核心功能及运行工作机制
打开链接转到github(本人的物理机为Ubuntu20.04),实验步骤如下所示:

(个人建议使用aria2下载可能要快一点,但这不是重点。其次第一个网址可能下载不了,建议打开github复制链接,然后粘贴到对应下载命令后面)
执行到打补丁步骤时出现错误如下:

不清楚具体是什么原因,跳过该步继续往下面执行。
具体到make -j$(nproc) 这一步,可以有两个另外的方法:
1. make -j 后面带着的是处理器的逻辑cpu个数,在编译的时候直接使用$(nproc)的确方便一点,如果想具体了解核心数
可以在命令行输入:echo $(nproc) 将显示出来的数字填入即可,我的操作结果如下图所示:

2.知道了nproc的具体含义之后就可以通过proc文件系统查看cpu具体信息了,命令行输入以下命令也可以得出具体结果:

最后编译内核,安装qemu,运行命令,结果如下图所:

在这里我比较迷惑的是arch目录下面的x86_64和x86目录,qemu命令启动的时候我就比较好奇万一敲错了目录怎么办,也不知道这两个目录有啥区别,所以我就试了一下。所以不出意料的出现错误如下所示:

所以我就好奇地打开了x86_64目录,如下:

也就是说该目录下的压缩镜像文件是x86目录下面的镜像文件的符号连接。转到x86目录下,但是该镜像文件没有可执行权限,修改权限,就可以使用该镜像文件启动qemu了。如下所示:

可以看到内核也启动了,按照道理两个内核应该启动的结果应该一样,但是明显看出时间较第一个长,而且内核的偏移也不一样。不清楚具体原因,能力有限无法深究。
其次对于老师的问题我上网查了一下:make allnoconfig : 除必须的选项外, 其它选项一律不选. (常用于嵌入式系统)。网上的相关信息实在匮乏,所以我自己试着使用allnoconfig配置编译一下。结果如下所示:

退出qemu后终端显示:

不是很清楚。所以对比一下两种方式配置的内核:

---------------------------------------------------------------------------------------------------此处分割线(我也不知道自己为什么用白底)

可以看出默认配置比全非配置出来的系统大了一个数量级不止。看终端的输出信息可以得出是镜像的格式问题。怎么样的问题呢?去看配置文件不就可以了么?
打开顶层目录的.config文件:首先是make allnoconfig生成的配置信息部分如下:

再看make defconfig的配置文件对应部分信息如下:

这样一对照就可以看出问题来了。全非配置生成的镜像文件格式为i386格式的,用现在x86_64的启动程序应该会出现启动错误。啊啊啊,到此为止了,问题应该都扩展的差不多了。希望老师可以采纳我的意见。
最后简要的分析操作系统内核核心功能及运行工作机制就是完成对计算机资源的调度分配。具体如下:
* 设备管理
完成设备的请求或释放,以及设备启动等功能
* 文件管理
完成文件的读、写、创建、删除等功能
* 进程控制
完成进程的创建、撤销、阻塞及唤醒等功能
* 进程通信
完后进程之间消息的传递或信息传递功能
* 内存管理
完成内存的分配、回收、以及获取作业占用内存区大小以及始址等功能。
------------恢复内容结束------------
浙公网安备 33010602011771号