欢迎来到天天文库
浏览记录
ID:27678811
大小:284.18 KB
页数:20页
时间:2018-12-05
《内核启动过程分析(自解压后到startkernel)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、内核启动过程分析在学习过程中“行走的流云”的博文给了我很大的帮助,我也复制了很多他的总结,在这里感谢他!本文件的代码主要是讲内核开始工作前的准备工作,其工作主要有一下几点:1.进入管理模式,判断处理器ID是否匹配,判断机器ID是否匹配,判断atags指针是否合法。2.建立页表,实现虚拟地址和物理地址的映射。3.关闭Icache、Dcache、清空writebuffer、使TLB无效4.使能MMU、使能cache跳转到startkernel开始真正的内核运行。对于经过压缩的内核(zlmage),先运行解压缩decompress_
2、kernel,然后还盂要笊定位,然后调用内核,就象跳到未压缩的内核中的开始处,内核的startup在arch/arm/kernel/head.S屮,进行页表初始化和处理器缓存初始化等工作,然后跳到C代码init/main.c中的start_kernel,接下來的事情就是大众化工作了,在这.1,我们继续分析解压缩后的工作,即是arch/arm/kernel/head.S的工作内容。首先先说下内核的启动条件:1.CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断都是禁止的;2.MMU(内存管理单元)必须是关闭
3、的,此时虚拟地址对物理地址;3.数掘cache(Datacache)必须足关闭的4.指令cache(lnstructioncache)可以是打开的,也可以足关闭的,这个没宥强制要求;5.CPU通用寄存器0(rO)必须是0;6.CPU通用寄存器1(r1)必须是ARMLinuxmachinetype7.CPU通用寄存器2(r2)必须是kernelparameterlist的物理地址/**linux/arch/arm/kernel/head.S*Copyright(C)1994-2002RussellKing*Copyright(c
4、)2003ARMLimited*AllRightsReserved*Thisprogramisfreesoftware;youcanredistributeitand/ormodify*itunderthetermsoftheGNUGeneralPublicLicenseversion2as*publishedbytheFreeSoftwareFoundation.*Kernelstartupcodeforall32-bitCPUs#include#include#
5、include#include#include#include#include#include#include#if(PHYS—OFFSET&OxOOlfffff)#error*PHYS_OFFSETmustbeataneven2MiBboundary!"//boundary(分界线)#endif#defi
6、neKERNEL_RAM_VADDR(PAGE.OFFSET+TEXT_OFFSET)#defineKERNEL_RAM_PADDR(PHYS.OFFSET+TEXT_OFFSET)*swapper_pg_diristhevirtualaddressoftheinitialpage*Weplacethepagetables16KbelowKERNEL_RAM_VADDR.Therefore,wemust*makesurethatKERNEL_RAM_VADDRiscorrectlyset.Currently,weexpect*
7、theleastsignificant16bitstobe0x8000,butwecouldprobably*relaxthisrestrictiontoKERNELRAMVADDR>=PAGEOFFSET+0x4000.*/swapper_pg_dir是初始页表的虚拟地址.我们将页表放在KERNEL_RAM_VADDR以下16K的空间中.因此我们必须保证KERNEL_RAM_VADDR已经被正常设置.当前,我们期望的是这个地址的最后16bits为0x8000,但我们或许可以放宽这项限制到KERNEL_RAM_VADDR〉=P
8、AGEOFFSET+0x4000.#if(KERNEL_RAM_VADDR&Oxffff)!=0x8000#errorKERNEL_RAM_VADDRmuststartatOxXXXXSOOO//内核的起始地址必须是32k对齐#endif•globlswapper_pg_di
此文档下载收益归作者所有