1、,LINUX内核移植,Linux内核的版本号,2.6.24 其中,2是主版本号,6是次版本号,24是修订版本号。 如果次版本号是偶数,说明是稳定版本。 如果次版本号是奇数,则是开发版本。 我们一般使用稳定版本。,Linux系统结构层次,Linux内核源代码目录结构,arch 包含和硬件体系结构相关的代码,每种平台占一个相应 的目录。如arm、avr32、blackfin、mips等。 block 块设备驱动程序的IO调度。 crypto 常用的加密和离散算法,还有一些压缩和CRC校验算法,Linux内核源代码目录结构,Documentation 内核的说明文档。 drivers 设备驱动程序,
2、其下细分为不同种类的设备。如 block、char、mtd、net、usb、video等等。 fs 内核支持的文件系统的实现,如 ext2、ext3、cramfs、jffs2、nfs等。,Linux内核源代码目录结构,include 头文件。与系统相关的头文件放在include/linux下, 与ARM体系结构相关的头文件放在include/asm-arm下。 init 内核初始化代码。 ipc 进程间通信代码。,Linux内核源代码目录结构,kernel 内核的核心代码,包括进程调度、定时器等。和arm平 台相关的核心代码在arch/arm/kernel目录下。 lib 库文件代码 mm 内
3、存管理代码,和arm平台相关的内核管理代码在 arch/arm/mm目录下。,Linux内核源代码目录结构,net 网络相关的代码,实现了各种常见的网络协议。 scripts 包含用于配置内核的各种脚本文件。只在配置时是有意义的。 sound 音频设备驱动的通用代码和硬件驱动代码都在这个文件件下面。,Linux内核启动方案,Linux内核有两种映像: 非压缩内核Image 压缩内核zImage 嵌入式系统存储容量有限,因此通常选择压缩内核zImage.要使用压缩内核zImage,需要在映像开头加入解压缩代码,将zImage解压后,才可以执行。,zImage的构成,内核编译完成后,会在arch/
4、arm/boot目录下 生成zImage文件。 zImage文件的组成: pggy.o :压缩后的内核文件 head.o :系统初级初始化代码文件 misc.o :解压缩代码文件,Linux内核启动简析(汇编部分),对于ARM处理器来讲,Linux内核zImage第一段代码入口位于 arch/arm/boot/compressed/head.S文件中。 它依次完成如下功能: 初始化Cache、Mem等设置 跳转到C语言内核解压函数中 bl decompress_kernel 跳转到非压缩内核启动汇编段 b call_kernel,Linux内核启动简析(汇编部分),lookup_process
5、or_type 作用是从硬件中读出CPU的ID,与编译内核时选择的CPU的ID进行比较。如果不一样,则不能成功启动。 比如,如果在arm920t的CPU上运行为其他CPU编译的内核,这里就通不过。,Linux内核启动简析(汇编部分),lookup_machine_type 将R1的内容(machine ID)与编译内核时选择的machine ID比较,如果不同,则内核不能成功启动。 vet_atags检查tag(内核的启动参数)的合法性。,Linux内核启动简析(c语言部分),C语言入口在init/main.c中: asmlinkage void _init start_kernel(void
6、) early_boot_irqs_off(); page_address_init(); printk(KERN_NOTICE); printk(linux_banner); setup_command_line(command_line); printk(KERN_NOTICE Kernel command line: %sn, boot_command_line); init_IRQ(); mem_init(); rest_init(); ,Linux内核的配置(1/6),.config文件 这是linux编译时所依赖的文件。我们在配置内核时所做的任何修改,最终都会在这个文件中体现出来。
7、它是Makefile对内核进行处理的重要依据。 一般来说,内核提供了芯片公司demo板的.config文件,我们一般找一个近似的进行修改。如S3C2410平台上可以选择s3c2410_deconfig这个文件。,Linux内核的配置(2/6),三种配置方式 make config 基于文本对话的配置方式,比较细致,但是浪费时间。对专业的内核开发人员比较合适。 make xconfig 基于图形界面的配置方式。非常直观,但是需要特殊的软件支持,一般不推荐。 make menuconfig 推荐的内核配置方式,采用目录的方式,直观,容易使用。,Linux内核的配置(3/6),关于Kconfig 在
8、进行make menuconfig时,目录的生成依赖于Kconfig文件。一般来说,每个源代码目录下都有一个Kconfig文件。 config DM9000 tristate DM9000 support depends on ARM | BLACKFIN | MIPS select CRC32 select MII -help- Support for DM9000 chipset. To compile this driver as a module, choose M here. The module will be called dm9000.,Linux内核的配置(4/6),Kcon
9、fig对.config文件的影响: CONFIG_DM9000=y make menuconfig对内核配置所做的修改最终反应在.config文件中。如上所示,在.config文件中CONFIG_DM9000=y被定义为y。,Linux内核的配置(5/6),Kconfig对Makefile的影响: . obj-$(CONFIG_DM9000) += dm9000.o CONFIG_DM9000是tristate类型,有三个可能取值: y:编译进内核 m:编译成模块 n:不进行编译 若是bool类型,则只有两种可能,y或者n。,Linux内核的配置(6/6),关于Makefile Linux内核
10、源码的每个目录下都有一个Makefile,由该 Makefile对源代码的编译、链接等操作进行控制。 编译完成后,每个源代码目录下都会生成一个名叫 built-in.o的文件。这个文件由源代码目录下的所以源文件编译后的目标文件链接而成;而不同的built-in.o又被上层目录中的Makefile链接成更大的builtin. o,直到最后链接成为一个内核vmlinux.o。,Linux内核移植交叉编译,关于交叉编译 由于我们的目标平台是ARM,而在x86平台上进行开发,故必须进行交叉编译。 修改内核的顶层Makefile: . ARCH ?= arm CROSS_COMPILE ?= arm-l
11、inux- 表示我们的目标平台是ARM构架的,而使用的交叉编译器的前缀是arm-linux,Linux内核移植.config,获得.config文件 前面提到,.config是内核编译时所依赖的重要文件,与具体的硬件构架和开发板类型相关。我们选择内核提供的s3c2410_defconfig进行修改。 cp arch/arm/configs/s3c2410_defconfig .config,Linux内核移植NAND,经典2410的NAND Flash 经典2410平台上配置一片K9F1208U NAND Flash,容量 大小为64M。为了使内核能正常使用NAND Flash,需要 在内核中
12、正确地配置NAND Flash驱动支持。,Linux内核移植NAND,添加NAND Flash支持在arch/arm/plat-s3c24xx/common-smdk.c中: static struct mtd_partition smdk_default_nand_part = 0 = .name = Bootloader, .size = 0 x80000, / 512KB .offset = 0, ,1 = .name = Linux Kernel, .offset = 0 x80000, .size = 0 x200000, / 2MB ,2 = .name = Root File S
13、ystem, .offset = 0 x280000, .size = 0 x400000, / 4MB ,3 = .name = User Space, .offset = 0 x680000, .size = 0 x3980000, / 57.5MB , ;,典型的Flash存储空间分配图,bootloader,启动参数,内核,根文件系统,Linux内核移植NAND,将NAND驱动加入初始化列表 struct platform_device s3c_device_nand = .name = s3c2410-nand, .id = -1, .num_resources = ARRAY_SI
14、ZE(s3c_nand_resource), .resource = s3c_nand_resource, ; static struct platform_device _initdata *smdk_devs = ,Linux内核移植LCD,添加LCD支持 经典2410平台上配置了一个640*480的lcd,需要在内核中对LCD进行正确的配置,才能使用LCD。 配置LCD需要涉及到2410的lcd控制器、IO引脚功能配置,根据LCD的具体参数对lcd控制器进行配置。,Linux内核移植LCD,填充display结构体: static struct s3c2410fb_display up2
15、410_fb _initdata = .lcdcon5 = (112)|(111)|(19)|(18)|(10), .type = (3 * SMDK2410/A9M2410 这样说明我们的配置是基于smdk2410开发板所做的,可以大大减少工作量。,inux内核移植配置,选择NAND Flash驱动支持 Device Drivers - Memory Technology Device (MTD) support - NAND Device Support - NAND Flash support for S3C2410/S3C2440 SoC 这样我们前面对NAND Flash的配置才会生
16、效。,Linux内核移植配置,添加LCD支持 Device Drivers - Graphics support - Support for frame buffer devices - S3C2410 LCD framebuffer support,Linux内核移植,添加DM9000A网卡支持 Device Drivers - * Network device support - * Ethernet (10 or 100Mbit) - DM9000 support,Linux内核移植配置,添加文件系统支持 File systems - Miscellaneous filesystems
17、- YAFFS2 file system support Compressed ROM file system support (cramfs),Linux内核移植编译,编译内核 运行make、make zImage等命令可以编译内核。 编译完成后,在arch/arm/boot目录下生成zImage文件,就是压缩格式的内核。 zImage经mkimage工具处理后,生成uImage,可供uboot引导,以启动内核。,内核镜像的制作,mkimage A arm T kernel C none O linux a 0 x30008000 e 0 x30008040 d zImage n linux
18、-2.6.24 uImage -A arm 目标平台是ARM构架的-T kernel 要处理的是内核 -C none 不采用任何压缩方式-O linux 要处理的Linux内核 -a 0 x30008000 加载地址,包括mkimage工具给内核添加的头信息 -e 0 x30008040 真正的内核入口地址,不包括添加的0 x40长度的头信息 -d zImage 使用的源文件是编译Linux内核得到的zImage -n linux-2.6.24 生成的内核镜像的名字uImage 生成的供U-Boot启动的二进制内核镜像,用U-Boot启动Linux内核,1、下载u-boot.bin到SDRAM的0 x30008000处 tftp 0 x30008000 uImage 2、擦除 nand erase 0 x80000 0 x200000 3、写入 nand write 0 x30008000 0 x80000 0 x200000 4、启动 reset,