OS-Lab0

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有什么用了,但说实话我也不知道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 vmlinuxImage的关系和区别是什么?

内核链接的时候先生成vmlinux这个文件,vmlinux是内含符号的。之后经过处理,再由vmllinux生成镜像文件Image

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值