关注v-x-公-众-号:【嵌入式基地】
后-台-回-复:【电赛】 即可获资料
回复【编程】即可获取
包括有:C、C++、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料
通常,Linux内核都是经过gzip加载过之后的映像文件。
/arch/arm/boot/compressed/vmlinux.lds 该文件为编译器指定link顺序。
ENTRY(_start) 压缩内核从.start段开始执行。
在/arch/arm/boot/compressed/head.S中执行以下爱操作:
(1)检测系统空间。
(2)初始化C代码空间。
(3)跳转到C代码decompress_kernel,
arch/arm/boot/compressed/misc.c中。
1、入口在arch/arm/kernel/head-armv.S
2、查找处理器类型
__lookup_processor_type
__lookup_architecture_type
3、初始化页表:__creat_page_tables
4、初始化C代码空间
5、跳转到C代码中,start_kernel
MMU:内存管理单元
作用:
MMU支持基于节或者页的存储器访问。
存在主存储器内的转换页表有两个级别:
__create_page_tables:
pgtbl r4 @ page table address 0x30008000-0x4000
mov r0, r4 @r0=0x30004000
mov r3, #0
add r2, r0, #0x4000
1: str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r2
bne 1b
把一级页表0x30004000-0xa0080000清空
krnladr r2, r4 @ start of kernel
r4=0xa0004000,r2 = 内核起始地址所在1MB对齐空间,0x30000000
add r3, r8, r2 @ flags + kernel base
r8 为从处理器信息中得到的MMU 页表标志,r8=0xc0e, r3=0x30000c0e
str r3, [r4, r2, lsr #18]@ identity mapping
地址:0x300068000, value:0x30000c0e
add r0, r4, #(TEXTADDR & 0xff000000) >> 18
@ start of kernel
bic r2, r3, #0x00f00000
str r2, [r0] @ PAGE_OFFSET + 0MB
add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
str r3, [r0], #4 @ KERNEL + 0MB
init/main.c中的start_kernel函数,进入到了Linux内核代码中。