转眼间训练营都结束了,这里大致总结一下我的第三阶段。
我第三阶段选择的课题是跨内核驱动开发,具体的要求,就是实现一个驱动,其能够在arceos和linux上运行,且其纯驱动代码部分不必修改。
一个设备在操作系统看来无非就是一些寄存器的集合,根据设备手册,我们可以知道如何通过修改和读取寄存器来控制和了解设备状态,对任何一个操作系统来说,都是如此,这也是纯驱动(也就是直接操作寄存器)代码不必修改的原因。
但是,对不同的内核,我们还需要不同的驱动适配器,比如,在linux中,我们需要向内核注册这一个设备(比如注册成杂项设备),并将设备抽象成一个文件,实现抽象的read和write方法。
此外,不同的内核地址映射的方法可能不同,在适配器中我们需要调用各自内核映射地址的接口,得到对应寄存器的地址,然后就可以使用纯驱动部分代码了。
在这个阶段里,我实现了一个GPIO点灯驱动,并在linux和arceos里成功运行,在这个过程中,知道了如何为linux编写驱动,rust是如何与kernel相配合的,以及在开发过程中由于踩各种坑被迫学习了一些关于linux kernel是如何编译的知识。
训练营结束之际,想感谢各位老师的帮助,各位同学的陪伴,也想感谢坚持到最后的自己。