- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
uClinux在S3C4510上的启动分析
uClinux在S3C4510上的启动分析(以前的工作总结) 作了一年的Linux+ARM了,整理了一些东西上来,希望对大家能有点用,欢迎批评指正!
uClinux的执行过程
uCinux的启动主要经历三个阶段。首先,必须完成CPU和存储器的硬件初始化,在系统RAM中建立程序堆栈和数据段,建立程序的运行时的环境。初始化完成之后,uClinux内核就取得了CPU的控制权,开始操作系统自身的初始化,这包括建立RAM中断矢量表、加载设备驱动程序、内存管理模块等等。这一切完成后,uClinux启动一个最初的init线程,进入到第三阶段,这时内核已经正常运行,外围模块也都就绪,开始执行一些脚本文件(如/etc/rc脚本文件)。
一.kernel代码段之前的系统初始化
1. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S
开发板从上电开始,最开始执行的程序放在
uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S中.
(1) 切换模式,关闭中断. (line 96 )
(2) 首先程序要先给SYSCFG,EXTDBWTH,ROMCON0等一系列系统控制寄存器赋值,此时flash地址在 0X0,DRAM地址在0X1000000.(line 141 )
(3) 点亮I/O口的指示灯. (line 152 )
(4) 把在flash上的image复制到DRAM上.(line 161 )
(5) 执行remap,把flash地址映射为0X1000000,DRAM地址映射为0.(line 172 )
(6) 打开cache和write buffer.(line 196 )
(7) 设置好64K堆栈.(line 204 )
(8) 跳转到decompress_kernel函数(line 217 ),此处的跳转为带返回的跳转,以便于执行完此函数跳转回来.
2. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/misc.c
此时的函数decompress_kernel是用C语言写的,line 297 .
(1) makecrc();进行crc校验.
(2) puts(Uncompressing Linux...); 输出linux起动后的第一句话.
(3) gunzip();解压缩kernel.
(4) puts( done, booting the kernel.\n);
3. uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed/head.S
执行完decompress_kernel函数后,kernel又跳转回head.S中,因为此时我们还要检验解压缩之后的kernel起始地址是否紧接着kernel image,如果是,beq call_kernel(line 220),执行解压后的kernel.
如果解压缩之后的kernel起始地址不是紧接着kernel image,执行relocate(line 236),将其拷贝到紧接着kernel image的地方,然后跳转,执行解压后的kernel.
二.kernel执行
1.uClinux-dist/linux-2.4.x/init/main.c中的start_kernel() (line 352)
系统启动过程到此,转入体系结构无关的通用C代码中,start_kernel() 中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。
(1) 输出Linux版本信息(printk(linux_banner))
(2) 设置与体系结构相关的环境(setup_arch())
(3) parse_options(command_line);解析command_line,将其转化为环境变量.
(4) 初始化系统IRQ(init_IRQ())
(5) 核心进程调度器初始化(sched_init())
(6) 软中段初始化softirq_init();
(7) 时间、定时器初始化(包括估测主频、初始化定时器中断等,time_init())
(8) 控制台初始化console_init();
(9) 核心CACHE初始化kmem_cache_init();
(10)延迟校准calibrate_delay();
(11)内存初始化(设置内存上下界和页表项初始值,mem_init())
(12)文件,目录,块设备读写缓冲区初始化
(13)检查体系结构漏洞(check_bugs())
(14)启动init过程(
文档评论(0)