微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 浅谈分析Arm linux 内核移植及系统初始化的过程一

浅谈分析Arm linux 内核移植及系统初始化的过程一

时间:11-09 来源:互联网 点击:
学习嵌入式ARMlinux,主要想必三个方向发展:

1、嵌入式linux应用软件开发
2、linux内核的剪裁和移植
3、嵌入式linux底层驱动的开发
主 要介绍内核移植过程中涉及文件的分布及其用途,以及简单介绍系统的初始化过程。整个armlinux内核的启动可分为三个阶段:第一阶段主要是进行 cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和 外部设备的初始化。了解系统的初始化过程,有益于更好地移植内核。
1. 内核移植

2. 涉及文件分布介绍
2.1. 内核移植

2.2. 涉及的头文件
/linux-2.6.18.8/include
[root@localhostinclude]#tree-L1
.
|--Kbuild
|--acpi
|--asm->asm-arm
|--asm-alpha
|--asm-arm------------------------------->(1)
|--asm-sparc
|--asm-sparc64
|--config
|--keys
|--linux ------------------------------->(2)
|--math-emu
|--media
|--mtd
|--net
|--pcmcia
|--rdma
|--rxrpc
|--scsi
|--sound
`--video
内核移植过程中涉及到的头文件包括处理器相关的头文件(1)和处理器无关的头文件(2)。
2.3. 内核移植2.4. 涉及的源文件
/linux-2.6.18.8/arch/arm
[root@localhostarm]#tree-L1
.
|--Kconfig
|--Kconfig-nommu
|--Kconfig.debug
|--Makefile
|--boot------------------------------->(2)
|--common
|--configs
|--kernel------------------------------->(3)
|--lib
|--mach-at91rm9200
……
|--mach-omap1
|--mach-omap2
|--mach-realview
|--mach-rpc
|--mach-s3c2410------------------------------->(4)
|--mach-sa1100
|--mach-versatile
|--mm------------------------------->(5)
|--nwfpe
|--oprofile
|--plat-omap
|--tools------------------------------->(1)
`--vfp
(1)
/linux-2.6.18.8/arch/arm/tools
[root@localhosttools]#tree-L1
.
|--Makefile
|--gen-mach-types
`--mach-types
Mach-types文件定义了不同系统平台的系统平台号。移植linux内核到新的平台上需要对新的平台登记系统平台号。
Mach-types文件格式如下:
#machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
s3c2410 ARCH_S3C2410 S3C2410 182
smdk2410 ARCH_SMDK2410 SMDK2410 193
之 所以需要这些信息,是因为脚本文件linux/arch/arm/tools/gen-mach-types需要linux/arch/tools /mach-types来产生linux/include/asm-arm/mach-types.h文件,该文件中设置了一些宏定义,需要这些宏定义来 为目标系统选择合适的代码。
(2)
linux-2.6.18.8/arch/arm/boot/compressed
[root@localhostcompressed]#tree-L1
.
|--Makefile
|--Makefile.debug
|--big-endian.S
|--head-at91rm9200.S

2浅谈分析Arm linux 内核移植及系统初始化的过程
|--head.S
|--ll_char_wr.S
|--misc.c
|--ofw-shark.c
|--piggy.S
`--vmlinux.lds.in
Head.s是 内核映像的入口代码,是自引导程序。自引导程序包含一些初始化程序,这些程序都是体系结构相关的。在对系统作完初始化设置工作后,调用misc.c文件中 的decompress_kernel()函数解压缩内核映像到指定的位置,然后跳转到kernel的入口地址。
Vmlinux.lds.in用来生成内核映像的内存配置文件。
(3)
linux-2.6.18.8/arch/arm/kernel
[root@localhostkernel]#tree-L1
.
|--Makefile
|--apm.c
|--armksyms.c
|--arthur.c
|--asm-offsets.c
|--bios32.c
|--calls.S
|--dma.c
|--ecard.c
|--entry-armv.S
|--entry-common.S
|--entry-header.S
|--fiq.c
|--head-common.S
|--head-nommu.S
|--head.S
|--init_task.c
|--io.c
|--irq.c
|--isa.c
|--module.c
|--process.c
|--ptrace.c
|--ptrace.h
|--semaphore.c
|--setup.c
|--smp.c
|--sys_arm.c
|--time.c
|--traps.c
`--vmlinux.lds.S
内核入口处也是由一段汇编语言实现的,由head.s和head-common.s两个文件组成。
Head.s是 内核的入口文件,在head.s的末尾处#i nclude"head-common.S"。经过一系列的初始化后,跳转到linux-2.6.18.8/init/main.c中的 start_kernel()函数中,开始内核的基本初始化过程。
/linux-2.6.18.8/init
[root@localhostinit]#tree
.
|--Kconfig
|--Makefile
|--calibrate.c
|--do_mounts.c
|--do_mounts.h
|--do_mounts_initrd.c
|--do_mounts_md.c
|--do_mounts_rd.c
|--initramfs.c
|--main.c
`--version.c
(4)
/linux-2.6.18.8/arch/arm/mach-s3c2410
[root@localhostmach-s3c2410]#tree-L1
.
|--Kconfig
|--Makefile
|--Makefile.boot
|--bast-irq.c
|--bast.h
|--clock.c
|--clock.h
|--common-smdk.c
|--common-smdk.h
|--cpu.c
|--cpu.h
|--devs.c
|--devs.h
|--dma.c
|--gpio.c
|--irq.c
|--irq.h
|--mach-anubis.c
|--mach-smdk2410.c
|--pm-simtec.c
|--pm.c
|--pm.h
|--s3c2400-gpio.c
|--s3c2400.h
|--s3c2410-clock.c
|--s3c2410-gpio.c
|--s3c2410.c
|--s3c2410.h
|--sleep.S
|--time.c
|--usb-simtec.c
`--usb-simtec.h
这个目录中的文件都是板级相关的,其中比较重要是如下几个:
linux/arch/arm/mach-s3c2410/cpu.c
linux/arch/arm/mach-s3c2410/common-smdk.c
linux/arch/arm/mach-s3c2410/devs.c
linux/arch/arm/mach-s3c2410/mach-smdk2410.c
linux/arch/arm/mach-s3c2410/Makefile.boot
linux/arch/arm/mach-s3c2410/s3c2410.c
3. 处理器和设备4.
这里主要介绍处理器和设备的描述和操作过程。设备描述在linux/arch/arm/mach-s3c2410/devs.c和linux/arch/arm/mach-s3c2410/common-smdk.c中实现。最后以nandflash为例具体介绍。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top