内核启动流程可以分为2步骤(非官方):
启动(汇编)
rtthread_startup函数(C函数)
从rt-smart\kernel\libcpu\arm\cortex-a\vector_gcc.S开始阅读代码,它是向量表。
板子启动后执行reset向量,即b _reset。
_reset在rt-smart\kernel\libcpu\arm\cortex-a\start_gcc.S中定义,流程如下:
rtthread_startup函数在这个文件里rt-smart\kernel\src\components.c,
流程如下:
移植内核时,涉及地址映射、中断控制器、串口驱动、Timer驱动。
rt-smart\kernel\libcpu\arm\cortex-a\start_gcc.Srtthread_startup
rt_hw_board_init
rt_hw_interrupt_init
rt_components_board_init // 调用某个段里的所有函数
rt_hw_uart_init // 它被放在某个段里
rt_hw_timer_init // 它被放在某个段里
下面是个索引,后续课程在深入讲解。
学有余力的同学可以根据索引自行学习。
代码:rt-smart\kernel\libcpu\arm\cortex-a\mmu.c:
#ifdef RT_USING_USERSPACE
void init_mm_setup(unsigned int *mtbl, unsigned int size, unsigned int pv_off) {
unsigned int va;
for (va = 0; va < 0x1000; va++) {
unsigned int vaddr = (va << 20);
if (vaddr >= KERNEL_VADDR_START && vaddr - KERNEL_VADDR_START < size) {
mtbl[va] = ((va << 20) + pv_off) | NORMAL_MEM;
} else if (vaddr >= (KERNEL_VADDR_START + pv_off) && vaddr - (KERNEL_VADDR_START + pv_off) < size) {
mtbl[va] = (va << 20) | NORMAL_MEM;
} else {
mtbl[va] = 0;
}
}
}
#endif
代码:rt-smart\kernel\libcpu\arm\cortex-a\start_gcc.S:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9bqyKkF-1660549067247)(pic/04_添加一个单板/01_map_whole_mem.png)]](https://1000bd.com/contentImg/2022/08/17/185028253.png)
数组位于:rt-smart\kernel\bsp\qemu-vexpress-a9\drivers\board.c
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubPPPjHe-1660549067250)(pic/04_添加一个单板/02_array_for_mem_map.png)]](https://1000bd.com/contentImg/2022/08/17/185028360.png)
调用过程:
rtthread_startup
rt_hw_board_init
rt_hw_interrupt_init
代码:rt-smart\kernel\bsp\qemu-vexpress-a9\drivers\serial.c
调用过程:
rtthread_startup
rt_hw_board_init
rt_components_board_init // 调用某个段里的所有函数
rt_hw_uart_init // 它被放在某个段里
代码在kernel\bsp\qemu-vexpress-a9\drivers\drv_timer.c
调用过程:
rtthread_startup
rt_hw_board_init
rt_components_board_init // 调用某个段里的所有函数
rt_hw_timer_init // 它被放在某个段里