Lab 0
编号是直接根据TA的实验指导来的,所以让我们直接从4.1开始
4.1 安装docker
折腾了半天VMware Tools也没能成功让主机和虚拟机直接互通,最后还是开了个共享文件夹。
第一步就直接遭到拒绝
原来是权限不够😅
切了root模式进,结果变成了虽然安了docker但是执行不了docker操作的尴尬局面,一种蜘蛛侠互指属于是
最后通过sudo docker import - oslab:2021
终于成功了,用root给账号加了docker组也还是不能直接用docker命令,估计我这机子这辈子docker
都和sudo
相伴了
之后几步还挺顺利的,一直到挂载本地目录。
又进行一波查,我超,原来已经启动的docker容器不能直接挂载目录,那这条命令到底有啥用呢?仔细一想,不如说是我连docker到底有啥用都不知道,忍俊不禁了,查的内容从“已经启动的容器如何挂载”变成“挂载有什么用”到最后变成“docker有什么用”
查了十分钟,好像是懂了docker有什么用了,但说实话我也不知道docker在我们这个实验里有什么用,总之先挂载试试看。属于是一种福至心灵,才想起来反正之前那个容器创建了以后也啥都没干啊,直接创死,新建了一个容器进行一个载的挂
谢谢你,泰罗,我终于挂载成功了,虽然不知道有什么用
4.2 下载linux源码&编译准备
看到要git clone仓库的时候还挺紧张的,生怕虚拟机上又要再痛苦安装一遍git,没想到善良的ubuntu只需一个指令就能安装。虽然之前被命令行折磨得不成人形,但时至今日我也终于开始为ubuntu心动了,就像是相亲会上突然发现了相亲对象的一点美好。
4.3 编译linux源码
终于到了编译Linux内核这一步了,满怀期待解压了linux源码然后准备编译
(暴躁之下关闭了当时运行的终端所以没有图了,总之是一连串报错和找不到,可以想象一下)
立 判 死 刑( ^ ^)
那还能怎么办,开始从第一个报错信息一个一个查?怀着悲痛的心我问了bing一个非常根源的问题:在ubuntu条件下编译Linux报错
谢谢你,善良的网络邻居,我发现电脑上连gcc都没有当然编译个锤子了
这个问题已经不想再去试图理解了,总之先重启一下吧
重启果然包治百病!顺利安装上了gcc,那么再让我们来编译一次……
哥,说好了环境都配置好了呢
谢谢你,我急了,开始回头检查docker环境。聪明的读者看到这里一定也急了,在我终于找到解决方法以后我也急了。
我他妈根本没在docker环境里,乐了!😅世上竟有如此铸币就是说,包括之前在半知半解情况下用命令行操作docker还漏掉了非常重要的cat oslab.tar
。干脆就把之前的container和image全删了从头再来,docker exec -it oslab bash
以后回到这个美丽的连入container的界面。(插播:在懂了但是没完全懂得过程中我甚至又在连入之后原地git clone了一个仓库😅😅😅脑子是怎么长的)
ls
了一下终于搞清楚这个迷宫入口长啥样了,看到这个have-fun-debugging
文件夹的时候也终于理解挂载是个什么了。本地下载好的linux源码还有配置文件都是放在/home
的,挂载了之后就直接同步到container上了,那么我们要做的其实是在连上docker以后的这个环境里开始编译。
谢天谢地这次终于正常完成了编译🙌
4.4 使用QEMU运行内核
这里遇到了一个找不到4.2里clone下来的rootfs.img
的问题,因为刚刚一直在linux路径里没出来,这个rootfs.img
在上一级的lab0里面。(其实另外还遇到一个换行前忘了打空格的弱智问题)
4.5 思考题
4.5.1 使用riscv-unknown-elf-gcc编译单个.c文件
经过一连串手忙脚乱很不优雅的操作后,成功在lab0文件夹里整了个输出helloworld的lab0-single-file.c
成功编译后多出来了一个file
,这个就是编译产物
4.5.2 使用riscv64-unknown-elf-objdump反汇编1中的编译产物
输了个riscv64-unknown-elf-objdump -d file
,反汇编了一长串,狠狠地看不懂了,那就这样吧,👨看得很开,从不留念ex,move on
4.5.3 调试Linux
大的要来了,哼哼、哼啊啊啊啊啊啊
首先进行一个远程调试的准备
可以看见我真的是输错了很多次😅
在gdb这边的终端通过端口脸上过后,另一个终端会出现以下欢迎信息
-
查看汇编代码
layout asm
可以打开查看汇编代码的窗口
就看看,ctrl+x+a
退出 -
在0x80000000下断点并查看所有已下断点
其实我不理解为什么0x80000000访问不了,好像0xffffffff80000000是一个映射过去的虚拟地址……
-
在0x8020000下断点并删除0x8000000的断点
(continue打错了) -
继续运行并触发0x80200000的断点
我不理解,为什么continue就跑不动了,一直在跟linux的console较劲
-
单步调试后退出qemu
一款我不理解和摆烂,甚至没法ctrl+D
,因为只是一种console的休眠状态,于是直接进行一个机的关
4.5.4 使用 make
工具清除 Linux 的构建产物
整个实验中最轻松的一步,make clean
4.5.4 vmlinux
和 Image
的关系和区别是什么?
内核链接的时候先生成vmlinux
这个文件,vmlinux
是内含符号的。之后经过处理,再由vmllinux
生成镜像文件Image
。