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 |
2.6内核裁剪配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.