你知道Embeded linux的内核流程是怎样的?

嵌入式技术

1368人已加入

描述

前提知识点:

内核最初启动的时候,没有启动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 = atags or dtb pointer,全部符合才跳转到以下入口

arch/arm/kernel/head.S

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

一、CPU确认:

/arch/arm/kernel/head-common.S

Embeded 8

Embeded 8

Embeded 8

Embeded 8

IMX6为ARMv7架构,所以定义文件在/arch/arm/mm/proc-v7.S

Embeded 8

地址转换过程:

因为在判定CPU架构时未开启系统的MMU功能,所以均使用物理地址,

而内核代码在连接时是以虚拟地址来实现的,因此要想用proc_info_list 结构,该结构表示的是内核所支持的CPU架构

__lookup_processor_type使用该元素的前两个字段cpuid和mask来匹配当前CPUID,如果满足CPUID & mask == cpuid,则找到当前cpu的定义并返回

二、内核启动参数确认

Embeded 8

Embeded 8

三、SMP调整

Embeded 8

Embeded 8

四、页表(16K一级初始页表、内核Image、atags、串口地址重定位)

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

五、MMU使能

Embeded 8

Embeded 8

协处理器介绍:

Embeded 8

Embeded 8

Embeded 8

六、映射(数据、bss、入口需求)

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

arch/arm/kernel/setup_arch.c

Embeded 8

内核2.6.39.rc1之前的__lookup_machine_type被改为setup_machine_tags       

Embeded 8

Embeded 8

Embeded 8

/arch/arm/include/asm/mach/arch.h 

Embeded 8

/arch/arm/kernel/vmlinux.lds

Embeded 8

/arch/arm/include/asm/mach/arch.h

Embeded 8

/arch/arm/mach-mx6/board-mx6q_sabresd.c

Embeded 8

include/generated/mach-types.h +1109

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8

Embeded 8



 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分