打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux内核裁剪与移植
第4章  Linux内核裁剪与移植
  内核,即操作系统。它为底层的可编程部件提供服务,为上层应用程序提供执行环境。内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。不同的硬件平台对内核要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。操作系统从一个平台过渡到另一个平台称为移植。Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。本章将详细讲解内核裁剪与移植的各项技术。
4.1 Linux内核结构
  Linux内核采用模块化设计,并且各个模块源码以文件目录的形式存放,在对内核的裁剪和编译时非常方便。下面介绍内核的主要部分及其文件目录。
4.1.1 内核的主要组成部分
  在第1章中已经介绍了Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系统移植的时候,它们是内核的基本元素,这5个部分之间的关系,如图4.1所示。

图4.1 Linux内核子系统及其之间的关系
  进程调度部分负责控制进程对CPU的访问。内存管理允许多个进程安全地共享主内存区域。内存管理从逻辑上分为硬件无关部分和硬件相关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟接口。虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,VFS提供了十多种不同类型的文件系统。网络接口提供了对各种网络标准的存取和各种网络硬件的支持。进程通信部分用于支持进程间各种不同的通信机制。进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢复过程。
* 进程调度与内存管理之间的关系:这两个子系统为互相依赖关系。在多道程序环境下,程序要运行必须为之创建进程,而创建进程首先就是要将程序和数据装入内存。另外,内存管理子系统也存在进程的挂起和恢复过程。
* 进程间通信与内存管理之间的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,通过对共同的内存区域进行操作来达到通信的目的。
* 虚拟文件系统与网络接口之间的关系:虚拟文件系统通过依赖网络接口支持网络文件系统(NFS),也通过依赖内存管理支持RAMDISK设备。
* 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理将会向文件系统发出请求,同时,挂起当前正在运行的进程。
  除了上面5个主要部分,下面将介绍Linux代码的整体分区结构。
4.1.2 内核源码目录介绍
  Linux内核代码以源码树的形式存放,如果在安装系统的时候已经安装了源码树,其源码树就在/usr/src/linux下,源码树结构如图4.2所示。

图4.2 Linux内核源码树结构
  下面分别针对图4.2中各个部分进行介绍,各个目录的主要的功能分别如下。
  1.arch目录
  arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如arm子目录是关于ARM平台下各种芯片兼容的代码。
  2.include目录
  include子目录包括内核编译时所需要的大部分头文件。与平台无关的头文件在include/linux子目录下,include/scsi目录则是有关scsi设备的头文件目录,与arm相关的头文件在include/asm-arm子目录下。
  3.drivers目录
  drivers子目录放置系统所有的设备驱动程序。有些驱动是与硬件无关的,而有些驱动是与硬件平台相关。例如,在USB驱动中,主机控制器有3种规格:
* OHCI主要为非PC系统上及带有SiShe ALi芯片组的PC主板上的USB芯片,嵌入式系统一般使用该驱动。
* UHCI大多为Intel和Via主板上的USB控制器芯片。相对OHCI而言UHCI的硬件电路比较简单,同时其成本也比较低,但驱动复杂,但它们都是在USB 1.1规范同时提出的。
* EHCI由USB 2.0规范所提出,它兼容OHCI和UHCI。
  4.fs目录
  fs子目录列出了Linux支持的所有文件系统,目前Linux支持ext2、vfat、ntfs、yaffs2、ramfs、cramfs和romfs等多种文件系统。在嵌入式系统中常用的闪存设备的文件系统有cramfs、romfs、ramfs、jffs2、yaffs等文件系统。
  5.init目录
  init子目录包含核心的初始化代码(注意,不是系统的引导代码)。它包含两个文件main.c和version.c,这是研究核心如何工作的一个非常好的起点。
  6.ipc目录
  ipc子目录包含核心进程间的通信代码。Linux下进程间通信机制主要包括管道、信号、消息队列、共享内存、信号量、套接口。
  7.kernel目录
  kernel子目录包含内核管理的核心代码。与处理器结构相关代码都放在arch/*/kernel目录下。
  8.net目录
  net子目录里是核心的网络部分代码,其每个子目录存放一个具体的网络协议或者网络模型代码。
  9.mm目录
  mm子目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。
  10.scripts目录
  scripts子目录包含用于配置核心的脚本文件。
  11.lib目录
  lib子目录包含了核心的库代码,与处理器结构相关的库代码被放在arch/*/lib/目录下。
4.2 内核配置选项
  内核配置通常是对内核支持的各个功能进行取舍配置,将配置的方案保存到configure文件中。在编译内核的时候,就会根据此配置对内核进行取舍编译。在源码目录下通过make menuconfig命令进入内核的配置界面,如图4.3所示。在对内核功能进行配置时,使用键盘的方向键移动光标位置,使用Enter键选择菜单,使用空格键修改配置选项。

图4.3 内核配置界面
  Linux配置选项的基本分类和涵义如下。
4.2.1 一般选项
  菜单选项(General setup)的子菜单中包含一些内核通用配置选项,如表4.1所示。在一般配置选项中如果对系统没有特殊要求,可以只选择System V IPC配置。
表4.1 一般选项
选 项 名
说 明
Automatically append version information to the version string
自动在版本后添加版本信息,编译时需要有perl及git仓库支持,通常可以不选
Support for paging of anonymous memory (swap)
支持交换内存,通常选择
System V IPC
进程间通信,通常需要配置
POSIX Message Queues
POSIX消息队列,通常需要配置
BSD Process Accounting
可以将行程资料记录下来,通常建议配置
Export task/process statistics through netlink
通过netlink接口向用户空间导出任务/进程的统计 信息
Auditing support
审计支持,某些内核模块(例如SELinux)需要配置
RCU subsystem
同步机制
Kernel .config support
提供.config配置文件支持
Kernel log buffer size (16=>64KB, 17=>128KB)
内核日志缓冲区大小(16代表64KB,17代表128KB)
Group CPU scheduler
CPU组调度
Control Group support
控制组支持
Create deprecated sysfs layout for older userspace tools
为旧的用户空间工具创建过时的文件系统风格
Kernel->user space relay support (formerly
relayfs)
在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口
Namespace support
命名空间支持
Initial RAM filesystem and RAM disk (initramfs/initrd) support
初始化RAM文件系统的源文件。initramfs可以将根文件系统直接编译进内核,一般是cipo文件。对嵌入式系统有用
Optimize for size
代码优化。如果不了解编译器,建议不选
Configure standard kernel features (for small systems)
为特殊环境准备的内核选项,通常不需要这些非标准内核
Disable heap randomization
禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它的实现方式有多种,可以由OS实现,也可以由运行库实现,也可以在一个栈中来实现一个堆)
Choose SLAB allocator
选择内存分配管理器,建议选择
Profiling support
支持系统评测,建议不选
Kprobes
探测工具,开发人员可以选择,建议不选

4.2.2 内核模块加载方式支持选项
  菜单选项(Loadable module support)的子菜单中包含一些内核模块加载方式选项,如表4.2所示。如果对模块的加载方式有特殊要求,如可以强制卸载正在使用的模块的要求,那么可以配置相关的模块加载方式。
表4.2 内核模块加载方式
选 项 名
说 明
  Forced module loading
 允许强制加载模块驱动
  Module unloading
 允许卸载已经加载的模块,建议选择
  Forced module unloading
 允许强制卸载正在运行的模块,该功能危险,建议不选
  Module versioning support
 允许使用其他内核版本的模块,建议不选
  Source checksum for all modules
 为所有的模块校验源码,可以不选

4.2.3 系统调用、类型、特性、启动相关选项
  菜单选项(Block layer)的子菜单中包含一些系统调用方式选项,如表4.3所示。在配置内核时可以不选该菜单选项。
表4.3 系统调用方式
选 项 名
说 明
Support for Large Block Devices and files
使用大容量块设备时选择
Support for tracing block io actions
支持块队列I/O跟踪
Block layer SG support v4
支持通用scsi块设备第4版
Block layer data integrity support
支持块设备数据完整性
IO Schedulers
I/O调度器

  菜单选项(System Type)的子菜单中包含一些系统类型选项,在配置内核时直接选择对应的芯片类型即可。对特定的平台选择相应的支持类型。
  菜单选项(Kernel Features)的子菜单中包含一些系统特性选项,如表4.4所示。在嵌入式系统中,一般不对这些选项进行配置。
表4.4 系统特性
选 项 名
说 明
Preemptible Kernel
抢占式内核。建议采用
Use the ARM EABI to compile the kernel
使用ARM EABI编写内核
Allow old ABI binaries to run with this kernel
使内核支持旧版本的ABI程序
Memory model
只有Flat Memory供选择
Add LRU list to track non-evictable pages
对没有使用的页采用最近最少使用算法,建议选择

  菜单选项(Boot Options)的子菜单中包含一些系统启动选项,如表4.5所示。
表4.5 系统启动
选 项 名
说 明
(0)Compressed ROM boot loader base address
xImage存放的基地址
(0)Compressed ROM boot loader BSS address
BSS地址
()Default Kernel command string
内核启动参数
Kernel Execute-In-Place from ROM
从ROM中直接运行内核,该内核使用make xipImage编译
(0x00080000)XIP Kernel Physical Location
选择XIP后,内核存放的物理地址
Kexec system call
Kexec系统呼叫
4.2.4 网络协议支持相关选项
  菜单选项(Networking Support)的子菜单中包含一些网络协议支持的选项,如表4.6所示。基本只需要在Networking options子菜单中选择具体所需的网络协议即可。
表4.6 网络协议
选 项 名
说 明
Networking options
该菜单的子菜单包含支持的各种具体网络协议,在开发中可以根据需要进行配置
Amateur Radio support
业余无线电支持,一般不选
CAN bus subsystem support
CAN总线子系统支持
IrDA (infrared) subsystem support
红外线支持
Bluetooth subsystem support
蓝牙支持
RxRPC session sockets
RxRPC会话套接字支持
Phonet protocols family
Phonet协议族支持
Wireless
无线电协议支持
WiMAX Wireless Broadband support
WiMAX无线宽带支持
RF switch subsystem support
RF交换子系统支持
Plan 9 Resource Sharing Support (9P2000)
9计划资源共享支持

4.2.5 设备驱动支持相关选项
  菜单选项(Device drivers)的子菜单中包含一些设备驱动的选项,如表4.7所示。重点说明了MTD设备相关的驱动。需要支持设备驱动时可以配置相关的选项。
表4.7 设备驱动
选 项 名
说 明
Connector - unified userspace <-> kernelspace linker
用户空间和内核空间的统一连接器
Memory Technology Devices (MTD) support
MTD设备支持,嵌入式系统使用
->Debugging
调试功能
->MTD concatenating support
连接多个MTD设备,例如使用JFFS2文件系统管理多片Flash的情形。只有一片Flash时不选
->MTD partitioning support
Flash分区支持,建议选择
->MTD tests support
MTD测试支持
->RedBoot partition table parsing
使用RedBoot解析Flash分区表,如果需要读取这个分区表的信息,选择此项
->Command line partition table parsing
允许通过内核命令行传递MTD分区表信息
->ARM Firmware Suite partition parsing
使用AFS分区信息
->TI AR7 partitioning support
AR7分区支持
->Direct char device access to MTD devices
将系统中的MTD设备看作字符设备进行读/写
  续表
选 项 名
说 明
->Caching block device access to MTD devices
文件系统挂载后,模拟块设备进行访问。常用于只读文件系统。如果是DiskOnChip使用NFTL方式
->FTL (Flash Translation Layer) support
提供对Flash翻译层支持,可以不选
->NFTL (NAND Flash Translation Layer) support
NAND Flash翻译层支持,可以不选
-> INFTL (Inverse NAND Flash Translation Layer) support
提供INFTL支持,DiskOnChip使用
-> Resident Flash Disk (Flash Translation Layer)
support
提供RFD支持,为嵌入式系统提供类似BIOS 功能
-> NAND SSFDC (SmartMedia) read only translation layer
NAND SSFDC只读翻译层
-> Log panic/oops to an MTD buffer
MTD缓冲区日志
-> RAM/ROM/Flash chip drivers
RAM/ROM/Flash芯片驱动
->Mapping drivers for chip access
为芯片的访问方式选择Mapping驱动
-> Self-contained MTD device drivers
自身包含MTD设备驱动,一般不选
->NAND Device Support
NAND Flash支持
->OneNAND Device Support
One NAND相关驱动
->LPDDR flash memory drivers
LPDDR Flash内存驱动
->UBI - Unsorted block images
只提供UBI支持
Parallel port support
并口支持
Block devices
红外线支持
Bluetooth subsystem support
蓝牙支持
RxRPC session sockets
RxRPC会话套接字支持
Phonet protocols family
Phonet协议族支持
Wireless
无线电协议支持
WiMAX Wireless Broadband support
WiMAX无线宽带支持
RF switch subsystem support
RF交换子系统支持
Plan 9 Resource Sharing Support (9P2000)
9计划资源共享支持

4.2.6 文件系统类型支持相关选项
  菜单选项(File Systems)的子菜单中包含一些文件系统配置的选项,如表4.8所示。内核移植完成后,通常需要制作文件系统,可以在此部分选择内核支持的文件系统格式。
表4.8 文件系统
选 项 名
说 明
Second extended fs support
Ext2文件系统支持
Ext3 journalling file system support
Ext3文件系统支持
The Extended 4 (ext4) filesystem
Ext4文件系统支持
Reiserfs support
Reiserfs文件系统支持
  续表
选 项 名
说 明
JFS filesystem support
JFS文件系统支持
XFS filesystem support
XFS文件系统支持
OCFS2 file system support
OCFS2文件系统支持
Btrfs filesystem (EXPERIMENTAL)
Unstable disk format
Btrfs文件系统,不稳定,建议不选择
Dnotify support
文件系统变化通知机制支持
Inotify file change notification support
Inotify是Dnotify的替代者,在高版内核中默认支持
Quota support
磁盘限额支持
Kernel automounter support
自动挂载远程文件系统,如NFS
Kernel automounter version 4 support
(also supports v3)
自动挂载远程文件系统,对版本4和版本3都支持
FUSE (Filesystem in Userspace) support
在用户空间挂载文件系统,建议选择
CD-ROM/DVD Filesystems
ISO 9660,UDF等文件系统支持
DOS/FAT/NT Filesystems
FAT/NTFS文件系统支持。如果用于访问存储设备,并且包含像Windows文件时选上该选项
Pseudo filesystems
伪操作系统,多指内存中的操作系统
Miscellaneous filesystems
杂项文件系统,包括ADFS,BFS,BeFS,HPFS等,比较少用,建议不选
Network File Systems
网络文件系统。其中只有NFS在产品开发过程中用。在开发过程可以选用
Partition Types
分区类型。该菜单下提供很多中类型,但在嵌入式产品中很少用,建议不选
Distributed Lock Manager (DLM)
分布式锁管理器

4.2.7 安全相关选项
  菜单选项(Security options)的子菜单中包含一些安全配置选项。很少用,建议不选。菜单选项(Kernel hacking)的子菜单中包含内核黑客配置选项。建议不选。菜单选项(Cryptographic API)的子菜单中包含内核加密算法配置选项。很少用,建议不选。
4.2.8 其他选项
  菜单选项(Bus Support)的子菜单中包含一些总线接口支持,嵌入式系统可以不选。菜单选项(CUP Power Management)的子菜单中包含电源管理选项,嵌入式系统可以不选。菜单选项(Floating)的子菜单中包含一些总线接口支持,嵌入式系统可以不选。菜单选项(Library routines)的子菜单中包含一些库配置选项,主要提供CRC支持,在开发通信类产品时可以选择对应的CRC。
4.3 内核裁剪及编译
  经过对内核的认识和对裁剪配置项的了解,接下来实际操作。针对S3C2440开发板进行裁剪Linux内核。
4.3.1 安装内核源代码
  在前面章节中已经介绍了建立交叉编译环境。如果还没有建立编译环境,请参考相关章节。获得源码可以直接从网上下载开发板对应的源码。该源码相比Linux基本内核源码增加了对应平台相关的内容。将源代码压缩包复制到/usr/local/arm目录下,使用tar命令解压源码。

tar –zxvf linux-2.6.29-HY2440.tgz

  tar命令带上zxvf参数可以看到详细的解压过程,如图4.4所示。

图4.4 内核解压过程
4.3.2 检查编译环境设置
  源代码解压完成后,进入linux-2.6.29目录下,然后使用VI命令编辑Mackfile。确定编译环境为arm交叉编译工具与本机安装的路径和一致。

ARCH = arm
CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-

4.3.3 配置内核
  使用make menuconfig命令进入内核配置界面,如图4.3所示。注意在linux-2.6.29目录下,执行make menuconfig命令才能正确进入配置界面。下面给出一个内核的基本配置。
  (1)在一般General setup配置项中选择子项System V IPC。由于要支持处理器在程序之间同步和交换信息,如果不选这项,很多程序将运行不起来,所以选择General setup配置项中的子项System V IPC,其他可以不选,如图4.5所示。在此配置界面中还有一个选项[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support在制作Ramdisk文件系统时,应该选上该选项,如图4.6所示。

图4.5 配置System V IPC

图4.6 配置RAM disk支持
  (2)在模块加载方式中,只选择子项Module unloading,其他可以不选。因为Force module loading和Force module unloading会造成安全隐患,所以一般不选。Module unloading支持动态卸载模块,减少内核占用的资源。如图4.7所示模块加载方式选项配置。

图4.7 模块加载方式选项配置
  (3)如果系统没有对磁盘调度方式有特殊的要求,对block layer可以不作任何配置。
  (4)在系统类型中选择S3C3410 DMA support和Force UART FIFO on during boot process,选DMA support选项是为了支持2440直接内存访问。选UART FIFO可以支持一般的串口通信协议。如图4.8所示为系统类型选项配置。

图4.8 系统类型选项配置
  选择S3C2440 Machines进入S3C2440 Machines的配置界面,选择对应开发板类型的支持,笔者的开发板为Mini2440,则对应的配置如图4.9所示。
  (5)对于总线支持Bus support配置,一般情况下该选项可以不作配置,除非在开发对应的驱动时。

图4.9 选择对应的开发板类型
  (6)在对系统特性选项进行配置时,建议对选项Use the ARM EABI to compile the kernel和选项Allow old ABI binaries to run with this kernel(EXPERIMENTAL)(NEW)进行配置,如图4.10所示。如果交叉编译工具的版本为arm-linux-gcc4.3.2时,没有对这两个选项进行配置,就会在烧写完文件系统后出现系统无法启动的错误,错误提示为Kernel panic - not syncing: Attempted to kill init!

图4.10 系统类型选项配置
注意:ARM EABI有许多革新之处,其中最突出的改进就是Float Point Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及浮点运算程序的运算速度。如果编译内核的编译器支持EABI,则在内核中也应该选择对该项的支持。
  (7)对启动参数的配置,Bootloader启动后会将板子的信息、Ramdisk大小、命令行字符串等信息传递给内核,然后开始启动内核,文件系统为Ramdisk时一般要配置该选项,对选项的具体地址和参数应该根据具体板子、内核大小、文件系统大小来定,该配置界面如图4.11所示。

图4.11 启动参数配置
  (8)选项CPU Power Management一般不作配置。
  (9)选项Floating point emulation一般不作配置。
  (10)选项Userspace binary formats,配置Kernel support for ELF binaries,如图4.12 所示。
  (11)对于电源管理选项一般不作配置。

图4.12 配置Kernel support for ELF binaries选项
  (12)对于网络选项的支持,配置Networking options中的TCP/IP networking和Unix domain sockets,配置如图4.13所示。在Networking support下的其他选项,在开发对应的驱动时将对应的选项选上。

图4.13 配置Networking options
  (13)设备驱动选择,设备驱动选项是最复杂也是用得最多的配置选项,特别是在开发驱动和系统移植的时候。
  在设备驱动选项中添加MTD支持,配置MTD partitioning support和Direct char device access to MTDdevices。配置MTD partitioning support是支持对Flash?分区的支持,配置Direct char device access to MTDdevices是支持将系统中的MTD设备看作字符设备进行读/写,如图4.14所示为驱动选项配置。

图4.14 驱动选项配置
  在网路设备驱动配置窗口中,为了使开发板支持网卡驱动选择Ethernet(10 or 100Mbit),如果希望支持ppp拨号还可以选择对ppp协议的支持等,可以根据具体的开发进行配置,如图4.15所示,进入Ethernet(10 or 100Mbit)配置中选择对应的网卡驱动,如图4.16所示。

图4.15 配置网络协议的支持

图4.16 配置对DM9000支持
  在音频设备驱动时,应该配置Sound card support,在该配置窗口下有OSS驱动框架和ALSA驱动框架,其配置界面如图4.17所示。

图4.17 配置声卡驱动的支持
  在对驱动框架Advanced Linux Sound Architecture进行配置时,如果音频应用程序需要支持数字音频接口、混音接口,则需要配置OSS Mixer API和OSS PCM(digital audio)API,如图4.18所示。另外还要对开发板具体的芯片支持,如Mini2440采用的UDA134x,则还要对具体的芯片驱动进行配置,如图4.19所示。当然在配置具体音频驱动支持前应该先在内核代码中添加相应的驱动。

图4.18 对数字音频接口和混音接口支持

图4.19 对具体芯片和驱动的支持
  USB设备驱动,也是应该要用到的内核配置选项,在开发USB主机驱动时应该配置OHCI HCD support选项,在开发USB存储设备驱动时配置USB Mass Storage support选项,如图4.20所示。

图4.20 USB设备驱动配置
  在开发键盘、鼠标等输入设备驱动时,应该配置HID Devices选项。在开发SD卡驱动时应该配置MMC/SD/SDIO card support选项。
  (14)文件系统选择也是比较重要的部分,在文件系统配置选项时,应该根据所用的文件系统来添加对应的文件系统支持。笔者用到了网络文件系统和YAFFS2文件系统,在内核中添加对NFS和YAFFS2文件系统的支持,如图4.21和图4.22所示。

图4.21 对NFS的支持

图4.22 对YAFFS2的支持
  如果开发板在挂载其他存储设备时,这些存储设备还包含中文时,为了正确挂载这些设备,则应该在Native language support中添加对字符编码的设置,如图4.23所示为支持简体中文的配置。

图4.23 对字符编码的支持
  (15)剩下的内核选项一般不作配置,退出内核的配置界面并保存配置。
4.3.4 编译内核
  如果是第一次编译内核就不用清理以前的映像文件。否则可以使用make clean命令清理以前编译的结果。在linux-2.6.29目录下使用make dep和make zImage命令生成内核映像文件,编译的过程如图4.24所示。

make clean
make dep
make zImage

注意:make dep是当程序之间有依赖关系的时候,程序发生更新时,依赖的程序会自动更新。
  如果编译成功,最后会打印生成内核映像文件zImage及其目录。

OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready


图4.24 编译过程
4.4 内核映像文件移植到ARM板
  4.3节中,介绍了编译内核映像文件。本节中介绍将映像文件下载到S3C2440开发板上。如果开发板没有烧写Bootloader,或者上位机没有安装下载映像文件工具DNW,请参考前面的相关章节。在这里依然可以暂时使用厂家自带的文件系统。等后面讲定制文件系统后,就可以使用自制的文件系统。
4.4.1 移植准备
  将4.3节生成的映像文件复制到Windows目录下,将要下载的文件系统放映像文件、内核映像文件放在一起,便于下载。
  (1)将开发板与上位机正确连接,确定开发板电源已经插上,且开发板处于关闭状态;串口线已经正确连接;USB线未连接。运行DNW工具,此时DNW的COM和USB状态如图4.25所示。
  (2)确定上位机与开发板相连的串口编号。这里用的是笔记本,没有串口,采用USB转串口。在Windows设备管理器下可以看到与开发板相连的串口为COM4,如图4.26 所示。
  (3)选择Configuration | Options命令,进入串口配置界面,将波特率设置为115200,COM Port为设置COM4,下载地址设置为0x32000000,如图4.27所示。配置完成后单击OK按钮保存配置。

图4.25 未连接前DNW状态 图4.26 确定与开发板相连的串口
  (4)选择Serial Port | connect命令,DNW状态应该变成如图4.28所示的状态。

图4.27 确定与开发板相连的串口 图4.28 串口配置正确后状态
  (5)确定以上步骤正确后,通过USB线将上位机和开发板连接起来。按住上位机的空格键,启动开发板。如果是第一次采用USB下载系统将会提示安装驱动。根据提示安装完驱动之后,DNW将进入vivi模式。此时USB状态为OK,在DNW显示正确的vivi信息,如图4.29所示。

图4.29 进入vivi模式
4.4.2 烧写系统
  烧写Linux系统的整个过程包括格式化Nand Flash、烧写Bootloader、烧写内核映像文件和烧写文件系统映像文件。下面具体介绍每个步骤的详细过程。
  1.分区格式化Flash
  在vivi模式下输入:bon part 0 192k 1216k,将Nand Flash分成三个区。三个区的大小如下所示。
* 0~192k:大小为192k;
* 192k~1216k:大小为1M;
* 1216k~64M:大小为63M。
  执行分区命令后,会在屏幕上打印下列信息:

FriendlyARM> bon part 0 192k 1216k
doing partition
size = 0
size = 196608
size = 1245184

  以上信息显示分区的起始地址。

check bad block
part = 0 end = 196608
part = 1 end = 1245184
part = 2 end = 67108864
part0:
offset = 0
size = 196608
bad_block = 0
part1:
offset = 196608
size = 1048576
bad_block = 0
part2:
offset = 1245184
size = 65847296
bad_block = 0

  以上信息详细打印了分区大小、坏区大小和分区的起始地址等信息。
注意:分区后不能掉电或者关电,因为此时Nand Flash中已经被清空。否则需要按照第3章介绍的方法使用H-JTAG重新烧写Bootloader。
  2.烧写Bootloader
  在vivi模式下输入load flash vivi u命令。DNW进入等待下载状态后,选择DNW菜单栏的USB Post | Transmit命令,选择vivi.bin文件。烧写完成后会打印如下信息。

FriendlyARM> load flash vivi u
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:30000000h,TOTAL:105154]
RECEIVED FILE SIZE: 105154 (102KB/S, 1S)
Downloaded file at 0x30000000, size = 105144 bytes
Found block size = 0x0001c000
Erasing... ... done
Writing... ... done
Written 105144 bytes

  如果烧写成功,就会打印Writing… …done。
注意:在打印USB host is connected. Waiting a download信息后,单击DNW菜单栏的USB Post|Transmit命令。出现选择文件对话框,选择文件后开始烧写Bootloader。
  3.下载Linux内核文件
  在vivi模式下输入load flash kernel u命令,DNW进入等待下载状态后,单击DNW菜单栏的USB Post | Transmit命令,选择4.4.1节生成的内核文件zImage,如图4.30所示。下载内核的过程如图4.31所示。

图4.30 选择内核文件

图4.31 下载内核过程
  正确下载内核完成信息如下:

FriendlyARM> load flash kernel u
USB host is connected. Waiting a download.

Now, Downloading [ADDRESS:30000000h,TOTAL:1852554]
RECEIVED FILE SIZE: 1852554 (904KB/S, 2S)
Downloaded file at 0x30000000, size = 1852544 bytes
Found block size = 0x001c8000
Erasing... ... done
Writing... ... done
Written 1852544 bytes

注意:在打印USB host is connected. Waiting a download信息后,单击DNW菜单栏的USB Post | Transmit命令。
  4.安装文件系统
  接上一步操作,输入命令loadyaffs root u安装文件系统,暂时使用开发板厂家提供的示例文件系统。选择文件系统映像文件root_qtopia_dm9000A43.img,如图4.32所示。安装文件系统过程如图4.33所示。

图4.32 选择文件系统映像文件
  正确安装文件系统后显示载入yaffs文件系统成功及文件系统的大小,打印如下信息。

Load yaffs OK:
Blocks scanned: 3947, Blocks erased: 3947, Blocks are bad: 0
RECEIVED and Writed FILE SIZE:45779722 (363KB/S, 123S)

  5.启动系统
  在vivi模式下输入boot启动系统,正确进入系统后显示如图4.34所示。或者直接重启开发板进入Linux系统。

图4.33 安装文件系统过程

图4.34 正确进入系统信息
4.5 内 核 升 级
  系统移植还包括内核升级。当开发板提供的内核和编译器版本太低,不能兼容很多新的驱动和功能时,此时就要着手考虑升级内核。本节将以at91rm9200为例,介绍为开发板移植高版本的内核。
4.5.1 准备升级内核文件
  开发板自带的内核版本为Linux-2.4.27,编译器版本为2.95.3。在开发一些新的应用程序和驱动时,编译器和内核不支持新的功能。准备将内核升级到2.6版本,编译器选择的版本为3.4.1。需要准备的资源文件列表如下所示。
* 内核:linux-2.6.10.tar.gz;
* 针对at91的内核补丁:2.6.10-at91.patch.gz;
* 交叉编译器:cross-3.4.1.tar.bz2。
4.5.2 移植过程
  下面详细介绍一下移植过程。
  (1)将所有文件复制到工作目录下,然后解压内核文件和编译器文件。
  (2)为内核打补丁。

#cd linu-2.6.10
#patch -p1< 2.6.10-at91.patch.gz

  (3)修改Makefile,修改编译环境。

ARCH = arm
CROSS_COMPILE =/usr/local/arm/3.4.1/bin/arm-linux-

  (4)修改machine ID。如果这一步省略,会在移植到开发板后Bootloader引导时出现机器ID错误的现象。出错的ID号将以十六进制给出,将其转化为十进制,替换mach-types文件中的对应项。这里移植后报的错误是0xFB,即对应十进制251。

#vi /usr/local/arm/linux-2.6.10/arch/arm/tools/mach-types

  找到

at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262

  将其修改为:

at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 251

  (5)制作uImage文件。在内核目录下建议一个名为mkimage的文件,其内容如下:

/usr/local/arm/3.4.1/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin
gzip -v9 linux.bin
./mkimage -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage

  (6)对内核进行配置。执行make at91rm9200dk_defconfig实际上就是完成对内核的 配置。

#make at91rm9200dk_defconfig

  其具体配置如下:

* Plug and Play support
* Block devices
RAM disk support (BLK_DEV_RAM) [Y/n/m/?] y
Default number of RAM disks (BLK_DEV_RAM_COUNT) [16] 16
Default RAM disk size (kbytes) (BLK_DEV_RAM_SIZE) [8192] 8192
Initial RAM disk (initrd) support (BLK_DEV_INITRD) [Y/n/?] y
Source directory of cpio_list (INITRAMFS_SOURCE) []
Packet writing on CD/DVD media (CDROM_PKTCDVD) [N/m/y/?] n
* IO Schedulers
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] y
* Multi-device support (RAID and LVM)
* Networking support
Networking support (NET) [Y/n/?] y
* Networking options
Packet socket (PACKET) [Y/n/m/?] y
Unix domain sockets (UNIX) [Y/n/m/?] y
TCP/IP networking (INET) [Y/n/?] y
IP: kernel level autoconfiguration (IP_PNP) [Y/n/?] y
IP: BOOTP support (IP_PNP_BOOTP) [Y/n/?] y
IP: TCP socket monitoring interface (IP_TCPDIAG) [Y/n/m/?] y
* Network packet filtering (replaces ipchains)
* SCTP Configuration (EXPERIMENTAL)
* QoS and/or fair queueing
* Network testing
* Amateur Radio support
* IrDA (infrared) subsystem support
* Bluetooth subsystem support
Network device support (NETDEVICES) [Y/n/?] y
* Ethernet (10 or 100Mbit)
Ethernet (10 or 100Mbit) (NET_ETHERNET) [Y/n/?] y
Generic Media Independent Interface device support (MII) [Y/?] y
AT91RM9200 Ethernet support (ARM_AT91_ETHER) [Y/n/m/?] y
RMII interface (ARM_AT91_ETHER_RMII) [Y/n/?] y
* Ethernet (1000 Mbit)
* Ethernet (10000 Mbit)
* Token Ring devices
* Wireless LAN (non-hamradio)
* Wan interfaces
* SCSI device support
* Fusion MPT device support
* IEEE 1394 (FireWire) support
* I2O device support
* ISDN subsystem
* Input device support
* Userland interfaces
Mouse interface (INPUT_MOUSEDEV) [Y/?] (NEW) y
Horizontal screen resolution (INPUT_MOUSEDEV_SCREEN_X) [1024] 1024
Vertical screen resolution (INPUT_MOUSEDEV_SCREEN_Y) [768] 768
* Input I/O drivers
* Input Device Drivers
* Character devices
* Serial drivers
* Non-8250 serial port support
AT91RM9200 serial port support (SERIAL_AT91) [Y/n/m/?] y
Support for console on AT91RM9200 serial port (SERIAL_AT91_CONSOLE) [Y/n/?] y
Legacy (BSD) PTY support (LEGACY_PTYS) [Y/n/?] y
Maximum number of legacy PTY in use (LEGACY_PTY_COUNT) [256] 256
* IPMI
* Watchdog Cards
Watchdog Timer Support (WATCHDOG) [Y/n/?] y
Disable watchdog shutdown on close (WATCHDOG_NOWAYOUT) [Y/n/?] y
* Watchdog Device Drivers
AT91RM9200 watchdog (AT91_WATCHDOG) [Y/n/m/?] y
* USB-based Watchdog Cards
* Ftape, the floppy tape device driver
SPI driver for AT91 processors (AT91_SPI) [Y/n/?] y
SPI device interface for AT91 processors (AT91_SPIDEV) [Y/n/?] y
* I2C support
I2C support (I2C) [Y/n/m/?] y
I2C device interface (I2C_CHARDEV) [Y/n/m/?] y
* I2C Algorithms
* I2C Hardware Bus support
Atmel AT91RM9200 I2C Two-Wire interface (TWI) (I2C_AT91) [Y/n/m/?] y
* Hardware Sensors Chip support
* Other I2C Chip support
* Multimedia devices
* Digital Video Broadcasting Devices
* File systems
Second extended fs support (EXT2_FS) [Y/n/m/?] y
* CD-ROM/DVD Filesystems
* Pseudo filesystems
/proc file system support (PROC_FS) [Y/n/?] y
/dev file system support (OBSOLETE) (DEVFS_FS) [Y/n/?] y
Automatically mount at boot (DEVFS_MOUNT) [Y/n/?] y
Debug devfs (DEVFS_DEBUG) [N/y/?] n
Virtual memory file system support (former shm fs) (TMPFS) [Y/n/?] y
* Miscellaneous filesystems
Compressed ROM file system support (cramfs) (CRAMFS) [Y/n/m/?] y
* Network File Systems
* Partition Types
* Native Language Support
* Profiling support
* Graphics support
* Console display driver support
* Sound
* Misc devices
* USB support
Support for Host-side USB (USB) [Y/n/m/?] y
USB verbose debug messages (USB_DEBUG) [Y/n/?] y
* Miscellaneous USB options
* USB Host Controller Drivers
SL811HS HCD support (USB_SL811_HCD) [N/m/y/?] n
* USB Device Class drivers
USB Mass Storage support (USB_STORAGE) [N/m/y/?] n
* USB Input Devices
* USB HID Boot Protocol drivers
* USB Imaging devices
* USB Multimedia devices
* Video4Linux support is needed for USB Multimedia device support
* USB Network Adapters
* USB port drivers
* USB Serial Converter support
* USB Miscellaneous drivers
* USB ATM/DSL drivers
* USB Gadget Support
* MMC/SD Card support
* Kernel hacking
Kernel debugging (DEBUG_KERNEL) [Y/n/?] y
* Security options
* Cryptographic options
* Library routines
CRC32 functions (CRC32) [Y/?] y
  上面已经对内核做了详细的配置,考虑到内容比较多的情况,省略了没有配置的选项。可以通过make menuconfig去查看对System Type(系统类型)的修改情况以确认进行正确的配置,如图4.35所示。

图4.35 系统类型已经被设置为AT91RM9200
  (7)编译内核生成映像文件。

#make clean
#make dep
.#/mkimage

4.6 小 结
  本章主要讲解Linux内核的目录结构、Linux内核配置选项及裁剪内核、编译内核。最后结合实例讲解内核移植和内核升级的具体过程。在开始接触内核移植时,不提倡初学者拿到源码就直接进行裁剪配置,这样经常会由于忽略了某个选项导致移植的时候失败。最好的办法是首先导入内核自带的配置,在这些配置的基础上根据自己的需要进行裁剪。
第2篇 系统移植技术篇
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
4.3.3 配置内核(4)
【转】Linux内核裁剪的具体步骤 - 沉默 - ChinaUnix个人空间 - Powe...
redhat as 3.0 上精简并编译系统内核
linux menuconfig配置
一种创建小型化Linux系统的方法
S3C2440移植linux3.4.2内核之内核裁剪
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服