我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛
注:本系列文章以虚构的兔子世界为素材。博君一笑,请勿当真。如有雷同,实属巧合~从本期开始,进入操作系统的世界!
书接上回。
初识只觉理论枯燥
为了让突突和达达快速入门操作系统,湘湘(黑箱兔的真名)拿着一本《现代操作系统》,找了块小黑板和笔,摇头晃脑地念了起来。 “进程是操作系统中最核心的概念,是对正在运行中的程序的一种抽象......”
不知过了多久,等它再一抬头时,发现突突和达达已经睡得香甜。
湘湘用笔敲了敲桌子,嗯哼了一声,两只兔子惊醒了。
湘湘叹了口气,看来还是要讲究实战呀!
于是它说起自己最近正在闯一个关于 陷入 (trap)的关卡,但是没什么头绪,希望两只兔子能给它当当助手。
湘湘带它们通过一个入口进入了一个神秘空间。
笔者注:大家可以理解为是平时做实验登录Linux服务器实例或者虚拟机,并进入了某个操作系统的源代码文件夹,这里指的是xv6。
“发明操作系统的大神创造了很多抽象的概念,但在我看来,这些抽象的概念最终也是由代码描述和实现的。在计算机的世界里,一切都是代码,而归根结底都是01。”
“就比如,刚刚跟你们提到的用户态和内核态”,说着,它作出了 ls 指令,一道道大门出现在三兔面前。
笔者注:大家可以理解为进入下一个文件夹就是进入所在的“门”,所以在当前文件夹下兔子可以看到很多“门”。
“其实分别就是这两道门里面的东西”。它边说边指着写有"user" 和"kernel"的门。
“这道门背后的空间虽然各自独立,但它们却以某种神秘的方式联系在一起。而玄机就在于某些文件中定义的一些规则。”
汇编指令初尝试
两只兔子按照关卡任务要求,进入到了"user"的call.asm里。
然而它们代码没看几行,就直接傻眼了。
比如这个“addi”,倒还好说,从字面上看是add,相加的意思;那sd又是什么呢?ld又是什么东东?
这时,达达想起来湘湘说过有个参考手册,里面是各种可能用到的资料:
突突将RISC-V下的两个指令手册翻了翻,发现这两个手册中都有提及sd,一时半会不知道该参考哪一个。它感觉自己头都要大了。
一旁的达达分析说,“咱们可以先缩小搜索范围。现在我们在user里,也就是用户态,前面讲理论的时候提到用户态下的是非特权指令。所以咱们只需要找那本"riscv-spec"”。
“第二步,咱们要抓住重点。比如,这是个指令,咱们要找直接性的定义语句;如果找不到,就看它怎么用,从而反推它的含义。”
从上图它们得知,原来SD指的是从低位寄存器存取64位的值到内存中。
达达和突突一来一往,继续它们的讨论:
“噢~那就好记啦!
- SB就是store byte,因为一个byte是8bits;
- SH中的H代表16位,因为Hexadecimal是十六进制的意思,
- SW就是store word,而32位系统对应的1word是4bytes。
- 至于SD,因为目前64位系统应用最为广泛,可以简单理解为是store data,也可以记D为double,表示word再翻一倍”。
笔者注:这也是我个人的记法,还没有考证过是否正确,仅用于记忆。
“这里显示了SD的位组成,”
“果然,指令归根结底是01呀!如果可以的话,咱们也可以自己设计指令,只要遵循一些原则、不与其他指令冲突、还能满足要求。”
.......
后面它们才发现自己跑题了,搞了这么久还没有开始回答关卡的问题呢!
那么它们能否搞明白这些问题呢?
欲知后事如何,请听下回分解!