工作需要,公司做的soc芯片换处理器核,本人负责对linux kernel完成跨处理器的移植(arm到powerpc),是小端处理器到大端处理器的移植。因公司soc涉及的模块较多,kernel移植我要完成kernel稳定启动,并且能正常进入console,只有串口驱动。剩余的驱动模块交由各个模块驱动开发人员来完成移植工作。
做了3周左右,代码部分已经根据powerpc的kernel框架修改了原来针对arm的板级支持包,换核后的soc处于FPGA验证阶段,现在kernel已经可以进入console,但是发现核的cache部分有问题,console还不能正常使用(用户空间是cached)。待IC工程师修复cache问题后,问题应该就不大了。
这个移植工作,有很多比方都是值得总结的,如kernel移植思路,大小端移植问题等。
今天就对于移植kernel的思路来总结下,这里总结不涉及具体代码,而只是说说保证kernel能进入console稳定运行这样一个最小系统,我们需要完成哪些部分的移植呢。
根据这次移植我的思路,需要以下几个方面的移植:
cpu core初始化,内存管理子系统(mmu),硬件时钟系统,早期调试打印机制,异常中断子系统,时间子系统(timer),串口驱动
1 cpu core初始化
cpu core的初始化主要指cpu的工作模式,通用寄存器初始化,cache初始化,异常入口初始化,mmu初始化等。也就是cpu core内部各个单元模块的初始化。
这部分针对主流cpu core的各个系列,kernel中都有支持,一般在arch/xxx(处理器类型)/kernel/head_xx.S中,需要我们改动的部分很少,但了解其过程对于解决一些奇怪问题还是有帮助的。
如处于仿真验证阶段的soc,我遇到的cache读写有问题