课程列表

基本问题

开源资源

好好学习天天向上

联大大纲—通信电子 ;教师介绍; 单片机课程学习经验- 学习路线图; 1.概述 -应用 -定义 -特点 -构成; 2.嵌入式处理器 —DIY CPU处理器ARM处理器Cortex-A8S5PV210讨论; 3.汇编语言 -作业 4.Bootloader -作业 5.Linux内核移植 6.嵌入式Linux程序设计 7.图形用户接口QT 8.其他框架介绍; 9.嵌入式物联网应用系统设计

Linux内核配置和编译

Linux源代码

基于CBT平台的内核源代码压缩包:Linux-2.6.35.7.tar.bz2

将linux-2.6.35.7.tar.bz2复制到/JY-CBT/目录。在终端窗口进入到/JY-CBT/目录下输入解压命令,完成内核源码文件的解压过程。在/JY-CBT/目录下建立Linux-2.6.35.7文件夹,内含内核源码文件。

 

将/JY-CBT/Linux-2.6.35.7/目录称为内核源码根目录。

[root@/jy-cbt]# tar -jxvf Linux-2.6.35.7.tar.bz2                       

[root@/jy-cbt]# ls                                                     

Linux-2.6.34.14  Linux-2.6.35.7  yaffs2

序 号

目 录 名

描               述

1

arch

与体系结构相关的代码全部放在这里,我们使用的是其中的 arm 目录。

2

Documentation

这里存放着内核的所有开发文档,其中的文件会随版本的演变发生变化。通过阅读这里的文件可获得内核最新的开发资料。

3

Drivers

包括所有驱动程序,下面又含多个子目录,分别存放各个分类驱动程序源代码。

4

Drivers/char

包含大量与驱动程序有关代码。如:通用 tty 层,console.c 定义了 Linux 终端类型,vt.c中定义了虚拟控制台等等。第6章中所用到的一些驱动程序源码也放在该目录下。

5

Driver/block

其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。

6

Drives/ide

专门存放针对IDE设备的驱动。

7

Drivers/scsi

存放 SCSI 设备的驱动程序,当前的 cd 刻录机、扫描仪、U 盘等设备都依赖这个 SCSI 的通用设备。

8

Drivers/net

存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协议,这部分在顶层目录的 net 目录中实现。

9

Drivers/video

保存了所有帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设备驱动。

10

Drivers/video

针对无线电和视频输入设备的代码,如目前流行的 usb 摄像头。

11

ipc

system V 的进程间通信的原语实现,包括信号量、共享内存。

12

kernel

存放了除网络、文件系统、内存管理之外的所有其他基础设施,包括进程调度 sched.c,进程建立 fork.c,定时器的管理 timer.c,中断处理,信号处理等。

13

lib

包括一些通用支持函数,类似于标准 C 的库函数。如:vsprintf 等函数。

14

mm

内存管理代码,包括所有与内存管理相关的数据结构的实现代码。

15

net

包含了套接字抽象和网络协议的实现,每一种协议都建立了一个对应目录。

16

fs

所支持的的文件系统源文件,随后将使用yaffs2文件系统

17

script

存放脚本文件,主要用于配置内核。

内核配置

Linux 内核的裁剪过程即配置内核参数的过程,通过对配置内容菜单的选择完成。内核存放于宿主机Linux环境的/JY-CBT/Linux-2.6.35.7/目录。

在该目录下运行以下三个命令中的任一个,可生成相应配置文件(.config)。

(1)make config    //以命令行,逐行完成配置过程。

(2)make menuconfig   //通过menuconfig菜单,完成配置过程。

(3)make xconfig    //2.6.X 以上,基于内核用QT 图形库。

 

方便起见,先使用附带的配置文件CBT210-20121115_deconfig_3g_zc301.config

make menuconfig 命令默认打开当前目录下的.config配置文件,所以在终端窗口中执行cp命令,将已配置好的文件复制到.config文件。

 

[root@/jy-cbt/Linux-2.6.35.7]# cp                                      

 cbt210_20121115_deconfig_3g_zc301 ./.config                            

cp: overwrite `./.config'? y                                           

[root@/jy-cbt/Linux-2.6.35.7]# make menuconfig

在Kernel的配置选项过程中,具有‘[*]’前缀的选项,其对应功能代码将被编译进内核,最终内核将支持该功能,由于该代码的加入,内核代码尺寸将变大。

将无用的选项去掉的过程,也称为内核的裁剪过程

在Kernel的配置选项过程中,针对内核功能代码的添加和裁剪过程被称为内核的定制过程

 

主要包括两部分:

--板级设备的管理和使用。

--应用系统应具有的功能,以及为应用程序提供的运行环境。

1.内核配置选项主菜单

2.General setup(通用配置选项)

3.Enable loadable module support(允许加载模块支持选项)

4.Enable the block layer(允许大块设备和文件)

5.System Type(系统类型)

6.FIQ Mode Serial Debugger(基于FIQ模式串口调试  默认不选)

7.Bus support(总线定制,默认不选)

8.Kernel Features(内核特性)

9. Boot options --->(内核引导操作)

10.CPU Power Management --->(CPU电源管理)

11.Floating point emulation --->(浮点操作模拟)

12.Userspace binary formats --->(支持文件类型:ELF,MISC)

13.Power management options --->(电源管理操作)

14.Networking support --->(网络支持)

15.Device Drivers(设备驱动)

16.File systems --->(文件系统)

17.Kernel hacking --->(内核黑客设置选项)

18.Security options --->(安全选项)

19.Cryptographic API --->(密码编译机制)

20.Library routines --->(库例程)

Kconfig 和Makefile 文件

Kconfig文件分布在2.6 内核源码根目录下的多个子目录中。通过Kconfig文件可以将内核配置菜单中的选项和其对应的源文件相互关联。

使用make menuconfig 会打开依赖于Kconfig文件的内核配置菜单,随后完成内核参数选项配置过程,结束时将配置参数保存到.config(隐藏文件,存放于内核源码根目录下)中。

在内核编译时,内核源码根目录下的主Makefile调用这个.config,了解内核的配置情况,通过Kconfig访问到配置选项对应的源文件存放目录,依照当前目录下Makefile文件定义规则将源文件编译链接到内核,使内核能够支持该功能选项。

例子:

内核中添加ADC 驱动程序

开机画面的logo文件

内核编译(uImage)

1.生成内核镜像文件zImage

Linux在 2.6 之后的内核中只需使用 make命令,即可完成内核的编译,最终在内核源码根目录的/arch/arm/boot 目录下生成内核的镜像文件zImage。

[root@localhost Linux-2.6.35.7]# make                                  

[root@localhost Linux-2.6.35.7]# ls arch/arm/boot/zImage               

arch/arm/boot/zImage                                                   

[root@localhost Linux-2.6.35.7]#

2.生成 uImage 格式的内核镜像

在第4章中介绍到了ARM平台bootloader使用的是 U-Boot,U-Boot默认引导内核文件格式为 uImage。因此内核编译过程结束且生成zImage格式的内核文件后,还需使用U-Boot提供的工具mkimage将zImage内核文件转化为uImage格式。

(1)mkimage命令格式。工具软件mkimage的使用方法和配置参数的注释可参见第4章的4.4.4一节。使用如下命令完成格式转化,在内核源码根目录下生成uImage格式的内核镜像uImage内核文件。

[root@localhost Linux-2.6.35.7]# ./mkimage -A arm -T kernel -C none -O linux -a 0x21000000 -e 0x21000040 -d arch/arm/boot/zImage -n 'Linux-2.6.35.7 ' uImage

Image Name:           

Linux-2.6.35.7        

Created:               

Wed Jul 11 20:42:41 2012                  

Image Type:           

ARM Linux Kernel Image (uncompressed)                                 

Data Size:           

4313468 Bytes = 4212.37 kB = 4.11 MB                   

Load Address: 21000000                    

Entry Point:               

21000040               

[root@localhost Linux-2.6.35.7]# 

-A:指定嵌入式操作系统运行的CPU架构arm微处理器。

-T:指定被压缩文件zImage为操作系统内核文件(kernel)。

-C:指定不对zImage压缩。

-O:指定操作系统类型为linux。

-a:指定压缩后的uImage在SDRAM中的加载地址为0x21000000。

-e:指定内核运行地址为0x21000040。这个地址就是-a参数指定的值加上0x40。(这之间的0x40个字节是mkimage添加的文件头信息,信息格式参见相关文件资料了)。

-d:指定制作映象的源文件为arch/arm/boot/zImage。

-n:指定运行mkimage后生成的映象文件名 为uImage。