用户故事 yiyang:我的上机实验“爬坑指南” 你好,我是yiyang。

先简单说说我自己吧,我是一名编程爱好者,这个爱好从小学就已经播下了种子。我从求学到就业,有过很多次机会接触计算机方面的学习和相关工作,可是一直没有真正动手编程。这次能接触到LMOS老师的《操作系统实战45课》,让我眼前一亮,当时就报名了这门课。

都说编程需要能掌握一些基础的编程语言,但在这门编写操作系统的这门面前,我属于“三零基础”:Linux是零基础、汇编语言是零基础,C语言也是零基础。但这一点也没有影响我学习这门课的热情,因为我从报名那一刻,就站在了LMOS老师的肩膀上;-)

我的学习思路简单粗暴,就是先跟着老师的整个课程跑一遍,拿下整体框架。我自己也清楚,看不懂代码是我目前的一大劣势,而这不是三天两天能速成的,那我就不纠结在这方面,先跟着老师的每节课的讲解把大概意思给硬啃下来。

至于代码部分,老师在教学辅助石墨文档里已经给大家推荐了非常好的学习资料。因为明白自己当前的情况,也明确了自己的目标,所以并没有出现计划容易落地难的问题,我也一直是按计划学习的。在时间安排上,我是每天安排一课,跟着老师课程里的语音,同步看文字、插图及配套的代码。

这里有一个关键点,那就是每节课后都有编程大神们的精选留言,这些是已经学完课程的同学留下的宝贵学习经验。对于正在学习的我们,也可以用来辅助参考,这是我每节课必看的内容。

专栏里大部分内容都可以实际上机体验,LMOS老师都把配套的课程代码链接传到了Gitee上。我在学完每节课之后,一定会亲自上机运行一遍老师的代码。虽然我目前还写不出这些代码,但每次遇到有代码的课都自己跑一遍,也能更直观感受到当前这节课最终可以实现出什么样的结果。以我目前的实操能力,现在就能把这件事做到

就从第一次上机运行的经验开始说起吧,也就是第二课“几行代码几行C,实现一个最简单的内核”。先说结果:我印象里,开始动手是夜里11点半,一直搞到了凌晨3、4点才最终完成。虽然只是运行了老师写的代码,但把自己的运行结果晒到打卡群时,内心还是感受到满满的成就感。

我在这将近4个小时的折腾里,因为这样那样的问题,不断掉坑、爬坑。那我究竟是如何解决,最终才完成了第2课的 Hello OS 呢?

兵马未动,配置先行

之前在介绍里给自己的标签是“三无基础”,所以上机实践的每一步都是新的尝试和探索。运行课程代码前,自然要先搞定运行环境,主要分两个部分:安装Ubuntu和各种编译连接工具。

虽说是第一次安装Ubuntu,经过学习石墨文档里每一条和我的运行环境相关的文档链接以及在百度里大致搜索了一些安装教程,基本就能搞定这一关,安装过程中除了自己指定安装路径,其余的安装设置基本上都是选择默认的选项。

安装中途遇到第一个大坑,估计大部分初次安装Ubuntu的同学都可能遇到过:初次安装时,系统会在线安装系统的一些升级程序,具体是哪些先不深究,这个环节我至少等了45分钟还多。相比之前安装Windows操作系统区别很大,毕竟虚拟机里安装Win10,安装程序基本上是直接从iOS系统安装压缩包里把需要安装的程序文件全部解压出来,感觉整个过程十几分钟就完成了。

后来再去百度搜了一些资料才知道,安装中最好关闭本机网络。其中的关键点就是,我们电脑主机或虚拟机在安装Ubuntu系统时,有一部分程序需要从服务器下载,而默认的下载服务器传输速度缓慢是这个坑的直接产生原因。这个不光会影响Ubuntu安装,后续使用时安装一些程序还会给我们带来困扰:你会发现,下载程序速度非常慢,甚至经常中断无法完成下载。

找到了原因,对症下药就能根治问题。办法就是安装Ubuntu时,记得要关闭网络或虚拟机的网络功能,然后在安装完成后,找一个Ubuntu大陆地区镜像站点,配置到Ubuntu的设置里

这里我推荐清华大学开源软件镜像站,超链接里有具体的使用帮助,选择跟你安装的ubuntu相同的版本,跟着帮助指导就能完成配置。重启后,再去下载和升级程序,你会发现下载速度就变得非常快了。

其实镜像站还有很多,你可以自己搜一搜,比如还有阿里云的镜像站,有兴趣的可以多找一些备用,使用和配置方法都是相似的,只要学会配置一个,其他的也都差不多。唯一不同的就是镜像站的链接网址这方面的区别。

解决了Ubuntu的下载问题,接下来就是安装课程里需要用到的代码编译等程序,把它们安装或升级到最新版本。

接下来我们就安装编译链接等工具:nasm、gcc、make。具体操作时,在Ubuntu系统里,进入终端 Terminal,在命令行中输入下面这条指令: sudo apt install nasm gcc make

输入指令后,系统就会帮我们下载并安装这几个编译链接工具。完成安装后,第二课配套代码的程序编译环境我们就搭建好了。

上机运行的“爬坑指南”

第二课的上机经验

第二课的上机代码,老师已经帮我们写好了,我们只需要下载到Ubuntu里,然后进入终端Terminal ,在lesson02/HelloOS目录下,运行下面这条指令: make -f Makefile

经过上述流程,我们就会得到 HelloOS.bin 文件。当然,这条指令的执行过程中,整个过程里生成了好几个文件,这几个文件生成的具体流程和介绍,专栏里都有详细说明,这里我们主要是讲如何运行代码,需要的就是最终生成的这个HelloOS.bin文件。

得到HelloOS.bin后,我们需要手动修改两个地方,手动选择启动项,还有把 Hello OS 添加进GRUB开机启动菜单。

手动修改第一关

首先,我们要修改/etc/default/grub,把GRUB启动菜单配置改成启动时“显示”,可以让我们手动选择启动项

这里我额外分享一个我的技巧,在对这类系统文件进行任何改动前,建议都先做一个备份,这样备份后,即使修改发生了错误后,还能用这个备份文件还原恢复。修改grub的具体操作是,在Ubuntu系统的终端 Terminal里,进入 /etc/default/ 目录,使用指令修改grub配置文件,代码如下: sudo gedit grub

输入之上述指令后,编辑器里会显示grub配置文件,大约33行左右。

首先我们要用/#号注销掉hidden行。我这个Ubuntu版本是在第7行,只需要在前面加上/#号,也就是“/#GRUB_TIMEOUT_STYLE=hidden”。

有的Ubuntu版本里是第7和第8行里都有hidden,那就把这两行前面都加上/#号注释掉。为啥要注释掉呢?hidden的作用是启动时不显示GRUB启动菜单,而我们需要在启动时显示GRUB菜单选项,所以需要用/#号注释掉。如果实验后你不需要显示GRUB启动菜单,逆向操作设置即可。

接下来,需要设置GRUB启动菜单的默认等待时间。代码如下: GRUB_TIMEOUT=30

这里的参数30表示Ubuntu启动,进入GRUB启动菜单后,倒计时30秒,如果没有任何手动操作,就会直接进入第一个默认的启动选项系统。

接着,我们需要把GRUB_CMDLINE_LINUX_DEFAUL设置为text,也就是打开启动菜单时默认使用文本模式,代码如下: GRUB_CMDLINE_LINUX_DEFAULT=”text”

图片

完成grub文件的这三处修改,记得按右上角的Save保存,然后关闭grub文件。

grub文件并不是修改后就完事了,还需要提示系统,我们已经更新了grub文件。操作也很简单,只需要在命令行输入如下指令: sudo update-grub

这样,grub文件的配置修改我们就搞定了。

手动修改第二关

接下来我们看看添加 Hello OS 的操作 。老师在课里“安装 Hello OS”这部分提到: 经过上述流程,我们就会得到 Hello OS.bin 文件,但是我们还要让 GRUB 能够找到它,才能在计算机启动时加载它。这个过程我们称为安装,不过这里没有写安装程序,得我们手动来做。 经研究发现, GRUB 在启动时会加载一个 grub.cfg 的文本文件,根据其中的内容执行相应的操作,其中一部分内容就是启动项。- GRUB 首先会显示启动项到屏幕,然后让我们选择启动项,最后 GRUB 根据启动项对应的信息,加载 OS 文件到内存。- 结合课程讲解可以看到,grub.cfg这个文件的路径是在:/boot/grub/grub.cfg。

同样的,记得先给 grub.cfg 做个备份,然后我们就可以在终端 Terminal 里进入 /boot/grub 目录,执行下面这条指令来打开和配置 GRUB 启动选项:

sudo gedit grub.cfg

打开grub.cfg 文件后,可以看到这个大约299行的文本文件里,有很多用/#号开头的英文注释,基本上都是对这个cfg文件里的关键注释。对于我们要改动的这个文件,可以先观察和了解这些注释,这对后面的配置工作有很大帮助。

仔细观察grub.cfg文件的第287到第291行,我把它这部分内容粘贴到了后面: /#/#/#BEGIN /etc/grub.d/40_custom /#/#/#- /#This file provides an easy way to add custom menu entries. Simply type the- /#menu entries you want to add after this comment. Be careful not to change- /#the ‘exec tail’ line above.- /#/#/#END /etc/grub.d/40_custom /#/#/#

上面注释里提到,这个文件里给用户预留了可以添加自己启动项的地方,也就是用户可以把自己需要添加的启动项,紧跟着放在这段注释下面即可。

手动修改第三关

老师已经把我们HelloOS的启动项的程序代码写好了,我最初的做法就是直接复制老师课程里的代码进去。 menuentry ‘HelloOS’ {      insmod part_msdos /#GRUB加载分区模块识别分区      insmod ext2 /#GRUB加载ext文件系统模块识别ext文件系统      set root=’hd0,msdos4’ /#注意boot目录挂载的分区,这是我机器上的情况      multiboot2 /boot/HelloOS.bin /#GRUB以multiboot2协议加载HelloOS.bin      boot /#GRUB启动HelloOS.bin}

请注意这个环节,也就是老师的这段代码,如果我们只是无脑地直接复制进去,那大概率无法运行出想要的结果。第二课的上机运行里,这个地方是最大的一个“坑”,也是我在OS打卡群和操作系统群里,看到很多小伙伴都卡住的地方。

当然,这个坑当时也把我给难住了,期间整整折腾了一个多小时,才搞明白爬出了这个坑,事后看看,老师当时其实已经给了明确提示。 我们来仔细看下这个坑在哪里:- “set root=‘hd0,msdos4’ /#注意boot目录挂载的分区,这是我机器上的情况”- 对,就是/#号后的提示。

其实,这行代码的用途,是告诉操作系统GRUB,我们的boot目录挂载的分区。由于每个人电脑硬件环境有差异,这个参数得根据自己电脑的具体情况来填写,所以当你直接复制老师的这个代码时,除非电脑运行环境正好和老师的一模一样,否则是无法顺利执行下去的。

我的电脑运行环境也和老师的不同,所以这个地方一定要先确定我们自己电脑系统的这个参数,然后再填写进去,才能跑通这个运行结果。其实老师也给出了找参数的方法,在 Linux 系统的终端Terminal里,输入后面的命令,具体你可以对照第二课讲解回顾。 df /boot/

图片

以上截图是我 Vbox 虚拟机里 Ubuntu 系统里执行 df /boot/ 后,显示出的boot目录在硬盘设备挂载分区的信息,里面的 /dev/sda5 就是指硬盘的第五个分区,但是GRUB的menuentry中不能直接写 sda5,而是要写成“hd0,msdos5”。

另一个技巧是,我们可以观察grub.cfg里,上面系统自带的那几个menuentry开头的启动项里面,这个“set root=”后面的参数,看下它们的配置参数是怎样的,基本上你照抄即可。

图片

截图里红框圈出来的是我根据自己系统的参数,添加进grub.cfg的HelloOS启动项代码。

完成了上面这个步骤,后面还要把我们前面用make指令最终生成的HelloOS.bin文件,复制到 /boot/ 目录里。经过上面这些步骤的配置,我们就可以重启Ubuntu系统,重启后,你会看到弹出的GRUB启动菜单。

图片

在里面选择最后一项HelloOS,就能看到系统进入了我们的Hello OS操作系统界面,大功告成!

图片

虽然,屏幕上只显示了Hello OS!这几个字符,但这已经为后面我们搭建Cosmos系统打下了最初的基石。跟着以上的操作步骤,我们把代码运行起来,相信你内心也会升起小小的成就感。

后续上机实验要点

下面,我再把运行后续课程里遇到的几个比较典型的坑罗列出来,如果你也正好学习到这里,可以做个参考,也许对你有帮助。

第十一课 lmoskrlimg 命令执行

第十一课的上机运行代码部分,我再次卡住,扒拉了各个大神的避坑指南,再到百度里各种搜索,但依旧没能解决。

最后,实在是没辙了,只能硬着头皮去向LMOS(东哥)请教,东哥看到消息,简短的几句话就指出了要害,我跟着他指点的思路上机实操,果然问题立马就解决通关了。

这种非常基础的Linux应用问题,东哥也能这样耐心解答,我内心是有点小感动的。毕竟,从高度来讲,东哥在操作系统这个领域已经是非常高的段位,从这一次的提问中,能真切感受到东哥非常愿意分享他的经验,帮助我这样的新手。因为这份幸运,我觉得既然已经选择学习这门课程,真的要珍惜机会,好好学习,完成这门课程。

我来讲一下这个坑的特征,这个问题属于Linux的使用基础方面的问题,估计大部分像我一样刚开始使用Ubuntu或对Linux操作系统不是非常熟悉的同学,都可能在这里卡住。

对于没有配置过环境设置的外部程序 lmoskrlimg,

在运行该程序指令时,前面一定要加./。

图片

看到没?第一次执行,前面没有加 ./ ,系统就提示command not found。

第二次执行,前面加上了 ./ ,系统就能找到并执行,之后结果会提示:“需要在该指令后面加上相应参数”。

第十一课里,这个程序具体的完整指令如下: sudo ./lmoskrlimg -m k -lhf initldrimh.bin -o Cosmos.eki -f initldrkrl.bin initldrsve.bin

这节课的上机实操结果完成后,我复盘了一下,根据以前我对DOS的命令行的理解,这类外部第三方的程序,在DOS系统里,如果没有做环境配置,只需要直接进入到程序的目录里,输入程序名,即可直接执行该程序指令。

但是,对比Linux系统里,同样的事情,即使是进入了这个程序所在的目录,如果没有配置环境变量,那想要执行,那就一定要在该程序指令前加上路径 ./ ,要不然Ubuntu会报错,提示“文件找不到”。

如何配置环境变量,这个目前暂时还没有深入研究,先把程序能跑起来,有兴趣的同学可以继续深入探索。基本上解决这个程序指令的问题后,就能通关第十一课的代码运行了。

第十二课避坑示范

之后,第十二课里,也有一个小坑,但同样看了前人经验就能避开。而且第十二课的上机运行只要能通过,后面的课程,一直到第三十三课,都是同样的上机运行方法。

这里我就用第十二课来做一个避坑的示范,给同学们提供一些线索。我们用第十二课的代码执行后面的命令,即可得到 hd.vdi 虚拟硬盘映像文件。 sudo make vboxtest

我在打卡群里,看到有的同学运行到这一步时,后面的操作掉坑里了,我第一次跑第十二课代码时也一样遇到这个坑。

如果你跟我的运行环境一样的,是在Win10的实体机里,安装VBox虚拟机软件,在Vbox里安装Ubuntu的,通过上面的指令,拿到 hd.vdi 这个文件的时候,操作步骤应该是:在VBox虚拟机里,新建一个操作系统,命名 Cosmos(注意大小写),选择other + unkonwn 64位,内存1024M,虚拟硬盘选项记得一定要选:不添加虚拟硬盘,新建好后,检查一下硬件加速是否如下面截图里的三项都有打开。

图片

图片

从上面的截图里,我们可以看到,这个新建的名称叫 Cosmos 的空系统,它是与我们之前安装的Ubuntu操作系统是并列的,不是在Ubuntu操作系统里面去套娃。我在一开始也是尝试再Ubuntu操作系统里面去套娃,后来发现行不通。

当你建立好这个Cosmos 空系统后,把前面生成的 hd.vdi 这个文件,加载到这个Cosmos操作系统的硬盘,如下图所示:

图片

图片

图片

图片

图片

然后重新启动这个Cosmos,你就能看到你的Cosmos操作系统顺利启动了。

图片

跟着上面演示的步骤,这节课的上机运行也就能通关了。

魔改logo和背景图

记得我把第十二课的运行结果发到打卡群里时,LMOS老师说,能不能把这个Cosmos的启动Logo修改一下?之前一直都是复制老师的代码,对于这道附加挑战,我也是跃跃欲试。

我当时在下载第十二课的代码时,曾经进入每一个目录,了解过目录和文件的结构,看到过一个图像文件:logo.bmp。

这个文件的图片预览也是 Cosmos 的 Logo,我当时查看了这个文件的分辨率大小 340 /* 510,去百度里找了一个图案,修改成bmp文件格式并调整分辨率到 340 /* 510,尝试替换Cosmos系统的启动Logo图像文件。

这里请注意:替换前,记得先把原始的logo.bmp文件保存备份

换成你的logo.bmp图片文件后,记得要再次用sudo make vboxtest 生成一个新的 hd.vdi 文件。

然后把之前在vBox里建立的Cosmos系统删除(要选择‘删除所有文件’选项)。删除后,重新建立一个Cosmos的空系统,再加载这个新的 hd.vdi 文件,重新启动,就能看到开机界面的logo是你刚才自己新换的图片了。

图片

同理,在同一目录下还有一个background.bmp文件,这是后面课程里,操作系统进入界面后,桌面背景图案就是调用这个文件。你也可以换成自己喜欢的图片,记得留意一下分辨率1024/*768,选择分辨率大小一致的图片文件更换,那Cosmos的系统桌面背景就能由你自己做主了,是不是很酷?

图片

我的感悟

师傅领进门,修行在个人。在我的这趟学习旅程中,课后留言和课程群的讨论文档给我带来了很大的帮助和启发。我常常是从这些内容里不断扒拉,结合里面的参考信息,一点一滴找到我遇到上机实验问题的解决思路和方案,最终才把课程的代码跑起来。

只要你开始学习,耐心跟着课程一课一课推进,课程里有代码的,动手尝试运行,先把整个课程走一遍,把整体框架顺下来还是不难的。而且把握了思路,后面在编程方面遇到这类相关问题时,也比较容易知道在哪里可以找到解决方法。

其实每天学习一课、打卡一课的设计,也给我学习编程知识和其他学科带来了启发。学习其他科目的时候,我也尝试了“每日打卡”的方法。

具体就是用每天打卡的方法来推进学习计划,日拱一卒,每天花固定时间推进进度。相信我会完成从量变到质变的过程,不断拉近自己跟目标之间的距离。

在学习《操作系统实战45课》的期间,我用每日打卡的方法,用27天时间准备我的一个专业考试,然后在第28天下午连考2门,都已经通过,而且还拿到了合格证书。

图片

遇到一门好的课程,遇到一个好的老师,遇到一个好的群助教和编辑小姐姐,对于任何一个求学者来说,都是一次非常好的学习机会。这次学习过程,对我来说不只是学习和了解一下操作系统,可能这是一个杠杆,一个新的起点,让我的人生剧本有了一个新的开始

最后,感谢LMOS老师给了我这次分享机会。为了完成这次输出,我再一次复习了课程内容,进一步加深了理解。

课后,我会把王爽老师的汇编语言、还有C语言这两门编程语言重点学习,打好基础,二刷这门课的时候也能继续深入代码部分,深入探索操作系统的搭建、实现。那时我应该也可以在每一节课的留言区,留下更加深入的学习足迹。

1996年,我第一次听身边的电脑发烧友,说起Linux这个开源操作系统的传奇故事。当时听得热血沸腾,但自己最终却一动也没动。现在回想起来,如果当时有LMOS老师这样级别的大神,带来这样一门手把手带我们学习和实操的课程,加上我现在“一鼓作气”的学习劲头来学习,那在编程这个领域里,我可能会走得更高更远。

最近在学习打卡群和打卡小程序里,我看到很多同学坚持学习,打卡群大家也是互帮互助。关键的一些问题,老师也会出来解答,这样的学习机会可遇不可求。

我的分享先到这里,感谢LMOS老师,同时也祝选择学习这门课程的同学们,能在操作系统这方面大展身手。完成比完美更重要,而且,如果没有完成,那完美更不可能出现

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e5%ae%9e%e6%88%9845%e8%ae%b2/%e7%94%a8%e6%88%b7%e6%95%85%e4%ba%8b%20yiyang%ef%bc%9a%e6%88%91%e7%9a%84%e4%b8%8a%e6%9c%ba%e5%ae%9e%e9%aa%8c%e2%80%9c%e7%88%ac%e5%9d%91%e6%8c%87%e5%8d%97%e2%80%9d.md