- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核及移植
Linux内核
内核是所有linux系统的中心软件组件。嵌入式领域所说的linux,一般是指linux内核。移植也是指的移植linux内核到目标平台。
Linux的版本号:以2.6.24为例,其中,2是主版本号,6是次版本号,24是修订版本号。如果次版本号是偶数,说明是稳定版本。如果次版本号是奇数,则是开发版本。我们一般使用稳定版本。
Linux内核源代码目录结构:
arch
包含和硬件体系结构相关的代码,每种平台占一个相应的目录。如arm、avr32、blackfin、mips等。
●block
块设备驱动程序的IO调度。
●crypto
常用的加密和离散算法,还有一些压缩和CRC校验算法
●Documentation
内核的说明文档。
●drivers
设备驱动程序,其下细分为不同种类的设备。如block、char、mtd、net、usb、video等等。
●fs
内核支持的文件系统的实现,如ext2、ext3、cramfs、jffs2、nfs等。
●include
头文件。与系统相关的头文件放在include/linux下,与ARM体系结构相关的头文件放在include/asm-arm下。
●init
内核初始化代码。
●ipc
进程间通信代码。
●kernel
内核的核心代码,包括进程调度、定时器等。和arm平台相关的核心代码在arch/arm/kernel目录下。
●lib
库文件代码
●mm
内存管理代码,和arm平台相关的内核管理代码在arch/arm/mm目录下。
●net
网络相关的代码,实现了各种常见的网络协议。
●scripts
包含用于配置内核的各种脚本文件。只在配置时是有意义的。
●sound
音频设备驱动的通用代码和硬件驱动代码都在这个文件件下面。
Linux内核有两种映像:非压缩内核Image和压缩内核zImage。
由于嵌入式系统存储容量有限,因此通常选择压缩内核zImage。要使用压缩内核zImage,需要在映像开头加入解压缩代码,将zImage解压后,才可以执行。这个加入解压缩代码的工作由UBOOT完成。
内核编译完成后,会在arch/arm/boot目录下生成zImage文件。zImage文件的由下面3个部分组成:
pggy.o:压缩后的内核文件
head.o:系统初级初始化代码文件
misc.o:解压缩代码文件
Linux内核启动简析(汇编部分)
对于ARM处理器来讲,Linux内核zImage的第一段代码入口位于arch/arm/boot/compressed/head.S文件中。它依次完成如下功能:
初始化Cache、Mmu等设置
跳转到C语言内核解压函数decompress_kernel中,指令:bl decompress_kernel
跳转到非压缩内核启动汇编段,指令:b call_kernel
arch/arm/boot/compressed/head.S的内容:
start:
……………………………………
1: mov r7, r1 @保存machine id
mov r8, r2 @保存参数地址
……………………………………
mrs r2, cpsr @确定不是在USER模式下
tst r2, #3
bne not_angel
……………………………………
not_angel:
mrs r2, cpsr @强制转换到SVC模式
orr r2, r2, #0xc0
msr cpsr_c, r2
Bss段清零:
not_relocated: mov r0, #0
1: str r0, [r2], #4 @R2,BSS开始
str r0, [r2], #4
str r0, [r2], #4
str r0, [r2], #4
cmp r2, r3 @R3,BSS结束
blo 1b
跳转到C语言实现的解压内核代码:
mov r5, r2 @ decompress after alloc space
mov r0, r5
mov r3, r7
bl decompress_kernel
实现代码在arch/arm/boot/compressed/misc.c中
解压代码:
ulg decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulgfree_mem_ptr_end_p, int arch_id)
{
output_data = (uch *)output_start;
free_mem_ptr = free_mem_ptr_p;
free_mem_ptr_end = free_mem_ptr_end_p;
__machine_arch_type = a
文档评论(0)