许多学习OS的小伙伴最终也只是停留在买一本翻了一半的《操作系统原理》、 一个下下来没看几眼的Linux源码,和一个甚至都没怎么跑起来过的Qemu。
关于OS最有名的课程就是MIT的6.828 Operating System Engineering课程, 课程讲解xv6,并附有一个难度颇高的JOS操作系统实验。 即使是一个专业的计算机学生、全程跟着上这门课在做这门Lab的时候也会 遇到遇到非常多的困难和阻力,操作系统本身的高难度门槛、不便的调试环境、 和狭窄的就业方向使得有兴趣的小伙伴也往往绊倒在学习的路上。
本系列博客旨在从0构建一个用于我演示各种Demo的小小小OS: Alice OS; 由于x86硬件的复杂性,为了简化,我会从arm,使用Qemu去构建Alice OS。
希望能对OS的一些概念进行一些解释,辅助小伙伴们的学习,也是对自己 在ARM的近两年开发进行一些点滴总结。若有本人理解不对的地方,欢迎指摘。
Environment
首先安装我们所需的工具链和qemu:
Linux:
sudo apt install binutils-arm-none-eabi
sudo apt install gcc-arm-none-eabi
sudo apt install qemu
MacOS:
brew tap PX4/homebrew-px4
brew install gcc-arm-none-eabi
brew install qemu
安装完后,就可以查看一下有没有:
1 | alice@MacAlice : ~/Codes/temp |
Manuals
刚开始构建的时候,与其说是OS,不如说更像是一个bare-metal的app, 所以可以参考一下ARM上 Bare-metal的写法:
JOS和MIT 6.828课程相关的链接:
后续开发需要用的一些手册:
- ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition
- ARM® Developer Suite Version 1.2
- CortexTM-A9 MPCore® Technical Reference Manual
- Versatile Express motherboard Address Map on QEMU
由于我们默认使用的Cortex-A9的核是ARMv7的,所以需要相关手册; QEMU模拟的Vexpress板子的文档直接看qemu的代码就行, 在编写过程中会用到一些ARM汇编,所以备一本汇编手册。
Start
那么首先我们先搞个工程出来吧:
这个是最开始的小工程,下一篇我们看一下Makefile和link script, 这次先说一下我们调试的方式:
进到git clone下来的代码仓,切到9d021c0
这个commit之后执行 make qemu-telnet
1 | alice@MacAlice ‹ 9d021c0 › : ~/Codes/alice-os |
再开个shell, 通过telnet 连上去,并使用info registers 查看寄存器信息:
1 | alice@MacAlice ‹ 9d021c0 › : ~/Codes/alice-os |
可以看到 R0里面是 0x233, 这个是一开始写进去的值,至此我们非常简易的Alice OS启动啦! 开始我推荐的调试方式就是让代码hang住,并通过qemu的monitor进行查看, 等到后面我们会改成用GDB的方式来调。