Linux整体汇编启动流程分析

汇编启动流程先从整体分析汇编做的事情,有个大体框架。
路径:arch/riscv/kernel/head.s,入口是entry(_start_kernel)
从entry(_start_kernel)开始进行启动前的一些初始化,建立页表前的主要工作:
关闭所有中断/* 关闭所有中断 */ csrw csr_ie, zero csrw csr_ip, zero加载全局指针gp/* 加载全局指针gp */.option push.option norelax la gp, __global_pointer$.option popdisable fpu/* 禁用 fpu 以检测内核空间中浮点的非法使用*/ li t0, sr_fs csrc csr_status, t0选择一个核启动/* 选择一个核启动 */ la a3, hart_lottery li a2, 1 amoadd.w a3, a2, (a3) bnez a3, .lsecondary_start清楚bss段/* 清除bss */ la a3, __bss_start la a4, __bss_stop ble a4, a3, clear_bss_done保存hart id和dtb地址/* 保存hatr id和dtb地址,hart id保存到a0,dtb地址保存到a1 */ mv s0, a0 mv s1, a1 la a2, boot_cpu_hartid设置sp指针la sp, init_thread_union + thread_size上述工作完成,会开始临时页表的创建,跳转到c函数setup_vm建立临时页表mv a0, s1 call setup_vm // 跳转到c函数setup_vm,setup_vm会创建临时页表重定向#ifdef config_mmu la a0, early_pg_dir call relocate //重定向,实际就是开启mmu#endif设置异常向量地址,重载c环境call setup_trap_vector/* 重载c环境 */ la tp, init_task sw zero, task_ti_cpu(tp) la sp, init_thread_union + thread_size最后跳转到c函数start_kernel,开始c语言部分初始化,汇编部分执行完毕tail start_kernel完整_start_kernel汇编代码:
entry(_start_kernel) /* 关闭所有中断 */ csrw csr_ie, zero csrw csr_ip, zero /* 在源码中,这里有一个m模式处理的宏,这里没有用到,直接跳过*/ /* 加载全局指针gp */.option push.option norelax la gp, __global_pointer$.option pop /* 禁用 fpu 以检测内核空间中浮点的非法使用*/ li t0, sr_fs csrc csr_status, t0#ifdef config_smp li t0, config_nr_cpus blt a0, t0, .lgood_cores tail .lsecondary_park.lgood_cores:#endif /* 选择一个核启动 */ la a3, hart_lottery li a2, 1 amoadd.w a3, a2, (a3) bnez a3, .lsecondary_start /* 清除bss */ la a3, __bss_start la a4, __bss_stop ble a4, a3, clear_bss_doneclear_bss: reg_s zero, (a3) add a3, a3, riscv_szptr blt a3, a4, clear_bssclear_bss_done: /* 保存hatr id和dtb地址,hart id保存到a0,dtb地址保存到a1 */ mv s0, a0 mv s1, a1 la a2, boot_cpu_hartid reg_s a0, (a2) /* 初始化页表,然后重定向到虚拟地址 */ la sp, init_thread_union + thread_size mv a0, s1 call setup_vm // 跳转到c函数setup_vm,setup_vm会创建临时页表#ifdef config_mmu la a0, early_pg_dir call relocate //重定向,实际就是开启mmu#endif /* config_mmu */ call setup_trap_vector /* 重载c环境 */ la tp, init_task sw zero, task_ti_cpu(tp) la sp, init_thread_union + thread_size#ifdef config_kasan call kasan_early_init#endif /* start the kernel */ call soc_early_init tail start_kernel //跳转到c函数start_kernel,开始c语言部分初始化汇编中非常重要的一个部分就是页表的创建,关乎着后面的程序能不能继续往下跑。setup_vm创建页表后就会开始执行relocate重定向,这个重定向主要开启mmu,下面分析relocate的汇编。

可控硅的基本工作原理及在调光器中的使用_可控硅设计经验总结
英飞凌牵手昆腾微电子,合作开发面向中国市场的安全控制芯片解决方案
简析开关电源如何降噪的
小米6:最强双摄+陶瓷3D机身+高通骁龙835 即将到来!
2021年智能手机行业迈入新的周期
Linux整体汇编启动流程分析
区块链未来的商业支付话语权意味着什么
MAX6613 低功耗、精密模拟输出温度传感器
基于工业3D打印的高温FDM塑料介绍
如何更改USB闪存驱动器图标
迅为RK3568核心板
DCDC输入电压的原因是什么?有何解决方法?
一种能将AR彩妆自然叠加在人脸上美妆滤镜可以模拟彩妆师化妆技巧
京东618荣耀9获得18日新品销量冠军,荣耀V9、畅玩6X、荣耀8青春版、畅玩5霸占单品销量TOP10
基于Cortex-M0的蓝牙SOC芯片及开发系统的介绍
基于J2ME的Sprite手机移动视频监控系统
电气接线图识读方法和步骤
锡膏厂家浅谈一下什么样的锡膏才是好的?
电线电缆过热导致火灾的原因都有哪些
双滤波器生成扫频正弦/余弦波形