【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
有一本书叫《一步一步写嵌入式操作系统——ARM编程方法与实践》。这本书很薄,大约有250-300多页的样子。虽然不是很厚,但是内容还是很实在的。特别是它依赖于skyeye和toolchain,可以单凭一台pc就可以完成大部分的嵌入式操作系统开发工作,这本身还是值得肯定的。当然,用它开发出来的os不可以作为工业使用,但是它对我们了解toolchain、soc、print、mmu、interupt、fs、进程调度、系统调用这些功能的实现,还是非常有用的。
当然,对我自己来说,最喜欢的还是关于MMU的部分。因为本书中虽然关于MMU描述的内容很多,但是真正涉及的代码不多,有兴趣的同学可以看看这个链接https://github.com/feixiaoxing/skyeye_ucos2/blob/master/mmu.c。
只要大家耐着性子将这个mmu.c代码读一下,就会发现被大家讨论很多的MMU其实不过如此。阅读之后,大家也会得出自己的一些结论。比如,
1,一开始soc上电后是没有开始MMU的
2,刚开始执行的pc地址就是物理地址
3,MMU本身依赖的其实就是一张表,cpu要知道的就是这张表的基地址
4,image版本大部分都是根据virtual address编译的
5,TLB就是MMU table的缓存
6, MMU中除了说明基地址,还要进行读、写、执行、cache、优先级权限的设置
7,一般IMMU和DMMU是分开的
8,设置MMU后,一般就不再关闭
9,IO地址也可以MMU
10,cpu只认virtual address,但是bus只认physical address
11,kernel中的pc address其实也是virtual address
12,MMU中不同的virtual address 其实可以对应同一块physical address
13,MMU中table基地址肯定是physical address
14,DMA永远需要的是physical address,不过为了方便user使用,还要是uncacheable的
上面的认知只是我个人的想法,特别是学习了openrisc cpu的代码,并且结合arm的mmu汇编代码之后,自己对mmu、icache、dcachhe的认知就更加深刻了。