2.6内核裁剪配置

2.6.13.4内核移植:
   内核移植的目标:尽可能多的支持开发板上的设备,(最大化,是全化)
   移植前的准备工作:
1.       安装交叉编译器,2.6内核需要3.0以上的编译器。
2.       设置PATH环境变量export PATH=/usr/local/arm/3.4.1(编译器版本)/bin:$PATH
3.       解压内核
4.       修改内核根目录下的Makefile文件(170行)会发现 SUBARCH :=$(shell uname –m | sed –e s/i.86/i386/ -e s/sun4u/sparc64/…)等三行代码,将170,171,172三行代码注释掉(前面加#)
5.       在内核根目录下的Makefile文件中指定要用到的编译器和架构(arch),方法:在第194行添加代码 ,将ARCH    ?=(SUBARCH) 改为,
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
6.       修改默认内核配置文件(./.config)拷贝
cp arch/arm/configs/smdk2410_defconfig ./.config
裁剪内核:make menuconfig
1.       检查系统类型是不是s3c2410 选项:System Type ,确定 S3C2410 DMA support被选中(此项不选在声卡驱动的加载是容易出错。)确定Support Thumb user binaries被选中。
2.       检查模块加载支持(系统是否允许自动加载模块),这一项很重要
Loadable module support-> 下,确保Enable loadable module support 和Automatic kernel module loading被选中。
3.       支持浮点运算,进入Floating point emulation -> 选中NWFPE math emulation被选中。
4.       对可执行文件进行支持 Userspace binary formats -> 确保Kernel support for ELF binaries 和Kernel support for a.out and ECOFF binaries 被选中。
5.       网络支持 Networking -> 选中 Networking support ,然后选择Networking options -> 下的 Unix domain sockets(支持unix网络) TCP/IP network
选中它下面的IP:Kernel level autoconfiguration 再选中它下面的IP:BOOTP support
6. 内存技术设备支持 Device Drivers -> Memory Technology Devices (MTD) ->
选中 Memory Technology Device (MTD) support 、MTD partitioning support(MTD分区支持) 、Command line partition table  parsing(命令行分区支持) 、 Direct char device access to MTD devices(允许以字符设备方式访问内存技术设备) 、 Caching block device access to MTD devices
7.   make   zImage 进行编译,将内核复制到开发板上会发现不能正常运行,因
为还没有配置文件系统,继续执行make menuconfig 选择File systems-> 去除这一项下面的 Second extended fs support (扩展分区支持)和 Rom file system support (ROM文件系统支持,我们这里使用nand flash)两项的选择。
7.       选择File systems -> Pseudo filesystems -> 下面的/dev file system support (OBSOLETE) 、Auto matically mount at root 、/proc file system support(支持内核镜像)、Virtual memory file system support (former shm fs) (虚拟内存文件系统)
8.       设备的支持  选择Device Drivers -> Memory Technology Devices (MTD) -> ARM/ROM/Flash chip drivers -> 下面的 Detect flash chips by Common Flash Interface (CFI) probe (flash通用芯片接口) 、Detect non-CFI AMD/JEDEC-compatible flash chips(非CFI接口芯片支持) 、Support for Intel/Sharp flash chips 、 Support for AMD/Fujitsu flash chips(富士通Flash芯片支持) 、Support for RAM chips in bus mapping (支持RAM芯片总线映射) 、Support for ROM chips in bus mapping(…ROM…)。
9.       支持 2410/2440 Nand flash 设备
Device Drivers -> NAND Flash Device Drivers -> 选中NAND Device Support 和 NAND Flash support for S3C2410/S3C2410/S3C2440 SoC
10.   支持块设备 Device Drivers -> Block devices -> 选择下面的 RAM disk support
选择Device Drivers -> Character devices -> 下的 Non-standard serial port support (支持非标准串口)、Legacy (BSD) PTY support(虚拟终端支持) 、S3C2410 RTC Driver(支持实时时钟)
11.   文件系统支持 File systems -> Miscellaneous filesystems -> 选中Compressed ROM file system support (cramfs)(cramfs支持)
12.   File systems -> Network File Systms -> 选中NFS file system support 、Provide NFSv3 client support 、Provide client support for the NFSv3 ACL protocol extension (NFS扩展) 、Root file system on NFS
13.   编译: make zImage 将生成的内核放到开发板上运行,会发现提示,找不到/dev文件系统,必须修改内核使它支持 /dev 文件系统才可以进行网络引导。
linux的内核目录结构:
1、    arch目录 硬件体系结构相关的核心代码 (arm)下 arch/arm
2、    include 核心头文件,每一个体系结构就会有一个对应的目录
3、    init 内核的核心启动代码
4、    ipc进程以及进程间通信相关代码
5、    mm内存管理部分的代码
6、    drivers 驱动程序目录(每个设备,在其中都有文件)
7、    modules 放置已经编译好的模块(可缷载模块)
8、    fs linux 文件系统支持代码
9、    kernel 主要核心代码(与处理器结构无关)
10、           arch/架构名/kernel 主要核心代码(与处理器结构相关)
11、           net 核心网络代码
12、           lib 核心库代码
13、           scripts内核配置脚本 (make menuconfig)
14、           Documentation
内核编译原理:
MakeFile 与 Kconfig : 刚开始配置内核的时候,就知道在内核的根目录下有一个Makefile文件,同样缺少一个 .config文件(需要从arch/arm/mach-s3c2410里面拷贝smdk2410-defconfig来代替)其实在每一级子目录下都有 Makefile和Kconfig两个文件,我们之所以每次用make menuconfig配置后都会将选择到的模块编入zImage中就是因为有Kconfig的存在,所有配置的菜单选项都保存在Kconfig中,每当我 们在配置中选择了某个模块后,将会生成.config文件,.config文件的作用就是传递Makefile信息,它会将配置信息传递给模块文件所在目 录的Makefile,在Makefile中会选择添加模块的文件。每次执行内核编译时,根目录下的Makefile将会检查各个子目录中的 Makefile,如果使用者做了修改,就会重新编译修改过的内容。这样我们往内核中添加自己编写的模块时(如,按键驱动,声卡驱动,led灯驱动)首先 要修改驱动存放目录下的Kconfig文件,添加菜单选项,然后make menuconfig,选中新添加的模块,还要修改驱动存放目录下的Makefile文件,添加模块编译的目录和依赖信息。

Kconfig的语法(菜单):
config 字符串(和宏名一样的命名规则,要求见名知意,如S3C2410_LEDS)
   bool “配置菜单名如s3c2410 leds driver”(全称为boolean <>可有编译到内核(*)编译成可缷载的模块(M) 不选三种情况)
       tristate “配置菜单名如s3c2410 leds driver”(含义 []可有编译到内核(*)不选二种情况。
depends on 宏名(与上面config中的命名规则一样,无“”号)” 含义:依赖,本菜单选项的选择依赖哪些其它的菜单选项。
help 后加此模块的说明,作用,功能,注意事项,出于什么目的,时间修改
将Kconfig与 .config 联系起来:
修改当前目录下的Makefile 文件, 仿照其它选项添加一行:obj-$(CONFIG_上面config后中的宏名,例如 CONFIG_S3C2410_LEDS)+=设备驱动模块名(如s3c2410_led.o)
然后再执行make zImage 重新编译就可以将添加的模块加入到zImage中。
支持/dev文件系统:
2.6内核不支持/dev文件系统,但保留代码
一.代码级移植
1.nand flash 分区支持
前面已经在u-boot中添加了nandflash的定义,这里在内核中对nand flash进行分区。修改arch/arm/mach-s3c2410/devs.c 文件,需要添加三个头文件
Linux/mtd/partitions.h linux/mtd/nand.h    asm/arch/nand.h 在第48行左右加入分区结构体数组,由自己定义分区的名字,大小等。一般要分四个区,引导区,内核区,文件系统,用户区。加入代码如下:
Static struct mtd_partition partition_info[]={
{
   name : “bootloader”,
   size : 0x100000,
   offset : 0x0,
},
{
name : “kernel”,
size : 0x300000,
offset : 0x100000,
},
{
name : “root”,
size : 0x2800000,
offset : 0x400000,
},
{
name : “user”,
size : 0x1400000,  
offset : 0x2c00000,
},
};
Struct s3c2410_nand_set nandset = {
nr_partitions : 4,
partitions : partition_info,
};
时序要自己定义 查找芯片手册第218页,定义一个结构体,设置时序,继续添加代码:
Struct s3c2410_platform_nand superlpplatform = {
tacls : 0,
twrph0 : 30,
twrph1 : 0,
sets : &nandset,
nr_sets : 1,
};
在(大约147行)s3c_device_nand={
增加一行: .dev = {.platform_data=&superlpplaform,},
};(.dev成员也是结构体)
将结构体添加到linux设备映射表当中,内核启动时初始化nand设备。
添加到 (arch/arm/mach-s3c2410/mach-smdk2410.c) 查找platform_device (大约90行)在 &s3c_device_iis, 下添加:&s3c_device_nand,
内核默认有ecc校验,但nandflash不支持,所以要关闭nand flash的ecc校验,修改(driver/mtd/nand/s3c2410
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章