前提知识点:
内核最初启动的时候,没有启动mmu,这样导致cpu只认物理地址(又称运行地址),不认虚拟地址(又称链接地址)。
所以,地址操作在内核汇编中普遍存在,基于内核编译时,是用链接脚本进行定位的。基于无mmu的cpu运行时,是依据pc地址进行定位的。所以,运行内核时,需要将虚拟地址转为物理地址以供运行。
最常见的方法即是,adr获取物理地址,ldr获取虚拟地址,两者相减得偏移值,后续虚拟地址加偏移得物理地址。
分析依据:
1.硬件imx6
2.内核3.0.35
大纲:
1.汇编部分:
1.1svc模式、禁止中断
1.2.获取cpu架构id,匹配cpu架构信息(协处理器读取)
1.3.内核启动参数确认
1.4.创建页表(16k一级初始页表区、内核镜像、atag)
1.5.icache/dcache
1.6.mmu启动(协处理器设置)
1.7.映射(数据、bss、内核接口需求)
2.c语言部分
2.1初始化系统(时钟等)
2.2匹配cpu芯片并初始化
....
uboot引导过后,经过判断mmu=off,d-cache=off,i-cache=dont care,r0=0,*r1=machine nr,r2=atagsordtb pointer,全部符合才跳转到以下入口
arch/arm/kernel/head.s
一、cpu确认:
/arch/arm/kernel/head-common.s
imx6为armv7架构,所以定义文件在/arch/arm/mm/proc-v7.s
地址转换过程:
因为在判定cpu架构时未开启系统的mmu功能,所以均使用物理地址,
而内核代码在连接时是以虚拟地址来实现的,因此要想用proc_info_list 结构,该结构表示的是内核所支持的cpu架构
__lookup_processor_type使用该元素的前两个字段cpuid和mask来匹配当前cpuid,如果满足cpuid & mask == cpuid,则找到当前cpu的定义并返回
二、内核启动参数确认
三、smp调整
四、页表(16k一级初始页表、内核image、atags、串口地址重定位)
五、mmu使能
协处理器介绍:
六、映射(数据、bss、入口需求)
arch/arm/kernel/setup_arch.c
内核2.6.39.rc1之前的__lookup_machine_type被改为setup_machine_tags
/arch/arm/include/asm/mach/arch.h
/arch/arm/kernel/vmlinux.lds
/arch/arm/include/asm/mach/arch.h
/arch/arm/mach-mx6/board-mx6q_sabresd.c
include/generated/mach-types.h +1109
9家LED上市公司扎堆发布了2021年第一季度业绩报告
LED产业发展的“广东经验”解读
颗粒物扬尘在线监测设备的应用
“芯”系门头沟丨芯盾时代向门头沟区捐赠防汛救灾物资
逆天音质“Hi”个够 华为nova 2系列带你玩纯正嘻哈
你知道Embeded linux的内核流程是怎样的?
工业+互联网,阿里云如何打造中国标准?
智慧城市的建设本质上是由什么技术提供
hdi生产工艺流程
新华三集团助力兴业数金产品全生命周期测试管理能力提升
盘点2019年物联网发展趋势与预测
linux中删除文件的命令
电位器的种类、特点及作用
苹果or特斯拉 谁将重新定义智能汽车
具负载断接功能的转换器LT1617
为快充而生的650V/4A & 650V/6A SiC二极管
5分钟掌握设计诀窍!超经典的工程师经验谈
eeprom是什么意思_eeprom使用
条形码和二维码的前世今生
智慧城市依赖移动数据分析 比如减少二氧化碳排放