【转】嵌入式ARM移植之三:移植 linux-2.6.26 内核
宿主机:
Kubuntu 8.04 (linux-2.6.24-19)
gcc-4.2.3
目标机:
s3c2440
交叉编译器(由crosstool-0.43制作):
arm-linux-gcc-4.1.0
要移植的内核版本:
linux-2.6.26
文件系统:
cramfs
—————————————————————————————————
准备知识:
Linux支持多种平台架构。在其源码的arch目录下,已经将各种支持的平台架构的源码分门别类。为了配置方便,在各种平台架构的目录下,一般都配有一个名为configs的目录。其中,放置着许多已经初步配置好的defconfig文件。通过这些defconfig文件,加快了我们配置内核的速度。
比如我所用的是一个arm架构的s3c2440板,那我就可以从arch/arm/configs/中找到s3c2410_defconfig,这是目前最匹配2440的一个默认配置文件了。使用:
$ make s3c2410_defconfig |
或
$ cp arch/arm/configs/s3c2410_defconfig ./.config |
执行上述命令后,将会在源码目录下生成相应的.config配置文件。通过
$ make menuconfig |
或
$ make xconfig |
可以进一步配置内核。最后执行
$ make zImage |
生成我们所需的烧录文件
内核编译基本命令:
make mrproper — 清理全部文件,包括.config和一些备份文件
make clean — 清理生成文件,但会保留.config和一些模块文件。
make defconfig — 生成包含全部默认选项的.config文件。这里用make s3c2410_defconfig替代
make oldconfig — 在旧的.config基础上生成新的.config。如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦
make config — 基于文本的最为传统的配置界面,不推荐使用
make menuconfig — 基于文本选单的配置界面,字符终端下推荐使用
make xconfig — 基于图形窗口模式的配置界面,Xwindow下推荐使用
目的都是生成一个.config文件,这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用 make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 |
make — 默认编译。
make bzImage — 编译生成压缩的内核二进制文件,也会用make zImage替代
—————————————————————————————————
参考资料:
《 Linux2.6.22.2内核移植方法 》
《 移植内核2.6.24.4到S3C2440 》
《 对于Kernel panic – ……出错的一点总结! 》
—————————————————————————————————
移植linux-2.6.26内核(假设已下载linux-2.6.26.tar.bz2)
1. 解压源代码
$ tar jxvf linux-2.6.26.tar.bz2 $ cd linux-2.6.26 |
2. 更改Makefile
#ARCH ?= $(SUBARCH) #CROSS_COMPILE ?= ARCH ?= arm CROSS_COMPILE ?= $HOME/toolchain/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux-gnu/bin/arm-linux-gnu- |
3. 生成默认配置
$ make s3c2410_defconfig |
4. 增加devfs文件系统支持
linux2.6.26已经去掉devfs,为了内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs的Kconfig文件。
linux-2.6.26/fs/Kconfig
修改的内容:
找到menu "Pseudo filesystems"
添加如下语句:
config DEVFS_FS bool "/dev file system support (OBSOLETE)" depends on EXPERIMENTAL help This is support for devfs, a virtual file system (like /proc) which provides the file system interface to device drivers, normally found in /dev. Devfs does not depend on major and minor number allocations. Device drivers register entries in /dev which then appear automatically, which means that the system administrator does not have to create character and block special device files in the /dev directory using the mknod command (or MAKEDEV script) anymore. This is work in progress. If you want to use this, you *must* read Note that devfs no longer manages /dev/pts! If you are using UNIX98 Note that devfs has been obsoleted by udev, If unsure, say N. config DEVFS_MOUNT If unsure, say N. config DEVFS_DEBUG If unsure, say N. |
5. 修改晶振( 可解决打印信息乱码问题 )
文件:arch/arm/mach-s3c2440/mach-smdk2440.c
/*s3c24xx_init_clocks(16934400);*/ s3c24xx_init_clocks(12000000); |
6. 修改MTD分区
文件: arch/arm/plat-s3c24xx/common-smdk.c
/* fix mtd partition to be same with bootloader */ /* a flash all in 64M bit size have been devided into 4 partition: */ /* 1. boot : offset is 0 and size is 192k */ /* 2. kernel : offset is 0x30000 and size is 1856k */ /* 3. rootfs : offset is 0x200000 and size is 30M */ /* 4. ext-fs1 : offset is 0x2000000 and size is 32M */ static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "boot", /* default is "Boot Agent", by qspy */ .size = SZ_64K*3, /* default is SZ_16K, qspy fix it to 192K*/ .offset = 0, }, [1] = { .name = "kernel", /* default is "S3C2410 flash partition 1", by qspy */ .offset = SZ_64K*3,/* default is 0, by qspy */ .size = SZ_64K*29,/* default is SZ_2M, qspy fix it to 1856K*/ }, [2] = { .name = "rootfs",/* default is "S3C2410 flash partition 2", by qspy */ .offset = SZ_2M,/* default is SZ_4M, by qspy */ .size = SZ_1M*30,/* default is SZ_4M, qspy fix it to 30M*/ }, [3] = { .name = "ext-fs1",/* default is "S3C2410 flash partition 2", by qspy */ .offset = SZ_32M,/* default is SZ_8M, by qspy */ .size = SZ_32M,/* default is SZ_2M, qspy fix it to 30M*/ } /*, [4] = { .name = "S3C2410 flash partition 4", .offset = SZ_1M * 10, .size = SZ_4M, }, [5] = { .name = "S3C2410 flash partition 5", .offset = SZ_1M * 14, .size = SZ_1M * 10, }, [6] = { .name = "S3C2410 flash partition 6", .offset = SZ_1M * 24, .size = SZ_1M * 24, }, [7] = { .name = "S3C2410 flash partition 7", .offset = SZ_1M * 48, .size = SZ_16M, } */ }; |
7. 关闭ECC校验
文件:drivers/mtd/nand/s3c2410.c
函数:s3c2410_nand_init_chip
/*chip->ecc.mode = NAND_ECC_SOFT; */ chip->ecc.mode = NAND_ECC_NONE; |
8. 配置内核
$ make xconfig |
其中有几项一定要修改的,分别是:
a. 启动
|—Boot options | |—Default kernel command string: [root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc console=ttySAC1,115200 devfs=mount mem=64] |
分析:
/dev/mtdblock2 : 表示MTD分区的第2个分区存储根文件系统
rootfstype=cramfs : 分区是cramfs类型,这项不加应该关系不大
init=/linuxrc : 启动的首个脚本即根目录下的linuxrc
console=ttySAC1,115200 : 使用串口1作为串口调试,波特率设置为115200; 现在已经摒弃了以前使用ttyS0的写法
devfs=mount : 在/sbin/init运行之前能自动挂载/dev为devfs文件系统
mem=64 : 存储器大小为64M
b. 增加devfs文件系统支持
|—File systems | |—Pseudo filesystems | | |—/dev file system support | | | |—Automatically mount at boot | | | |—Debug devfs |
这几项都是必选的
c. 芯片及系统类型
|—System Type | |—S3C2410 Machines | | |—SMDK2410/A9M2410 |
支持2440时,这一项也是必选的,否则会编译不过
—————————————————–
遇到的问题:
1. 启动时乱码
信息:
Nand flash status = c0 Set boot params = root=/dev/mtdblock2 init=/linuxrc load_ramdisk=0 console=ttySAC1,115200 mem=65536K devfs=mount display=shp480 Load Kernel… 8? ?腳c?洤”D?G#溰 `納 { 悃’榌 |
解决:时钟问题,更改时钟频率为12M即可
2. 文件系统cramfs挂载失败
IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 2048 (order: 2, 16384 bytes) TCP bind hash table entries: 2048 (order: 1, 8192 bytes) TCP: Hash tables configured (established 2048 bind 2048) TCP reno registered NET: Registered protocol family 1 NetWinder Floating Point Emulator V0.97 (double precision) msgmni has been set to 120 io scheduler noop registered io scheduler anticipatory registered (default) io scheduler deadline registered io scheduler cfq registered Console: switching to colour frame buffer device 30×40 fb0: s3c2410fb frame buffer device s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440 s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440 s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440 brd: module loaded usbcore: registered new interface driver ub dm9000 Ethernet Driver, V1.30 Linux video capture interface: v2.00 NFTL driver: nftlcore.c $Revision: 1.98 $, nftlmount.c $Revision: 1.41 $ S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c2440-nand s3c2440-nand: Tacls=1, 10ns Twrph0=4 40ns, Twrph1=1 10ns NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit) s3c2410_nand_update_chip: chip c3d7d4bc: 9 Scanning device for bad blocks Bad eraseblock 357 at 0x00594000 Bad eraseblock 3335 at 0x0341c000 Bad eraseblock 3995 at 0x03e6c000 Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x00000000-0x00030000 : "boot" 0x00030000-0x00200000 : "kernel" 0x00200000-0x02000000 : "rootfs" 0x02000000-0x04000000 : "ext-fs1" usbmon: debugfs is not available s3c2410-ohci s3c2410-ohci: S3C24XX OHCI s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 usb usb1: configuration #1 chosen from 1 choice hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected Initializing USB Mass Storage driver… usbcore: registered new interface driver usb-storage USB Mass Storage support registered. mice: PS/2 mouse device common for all mice i2c /dev entries driver s3c2440-i2c s3c2440-i2c: slave address 0x10 s3c2440-i2c s3c2440-i2c: bus frequency set to 390 KHz s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled Registered led device: led4 Registered led device: led5 Registered led device: led6 Registered led device: led7 TCP cubic registered RPC: Registered udp transport module. RPC: Registered tcp transport module. end_request: I/O error, dev mtdblock2, sector 2 EXT2-fs: unable to read superblock end_request: I/O error, dev mtdblock2, sector 0 Buffer I/O error on device mtdblock2, logical block 0 end_request: I/O error, dev mtdblock2, sector 0 Buffer I/O error on device mtdblock2, logical block 0 end_request: I/O error, dev mtdblock2, sector 8 Buffer I/O error on device mtdblock2, logical block 1 end_request: I/O error, dev mtdblock2, sector 8 Buffer I/O error on device mtdblock2, logical block 1 end_request: I/O error, dev mtdblock2, sector 16 Buffer I/O error on device mtdblock2, logical block 2 end_request: I/O error, dev mtdblock2, sector 16 Buffer I/O error on device mtdblock2, logical block 2 end_request: I/O error, dev mtdblock2, sector 24 Buffer I/O error on device mtdblock2, logical block 3 end_request: I/O error, dev mtdblock2, sector 24 Buffer I/O error on device mtdblock2, logical block 3 end_request: I/O error, dev mtdblock2, sector 0 FAT: unable to read boot sector VFS: Cannot open root device "mtdblock2" or unknown-block(31,2) Please append a correct "root=" boot option; here are the available partitions: 1f00 192 mtdblock0 (driver?) 1f01 1856 mtdblock1 (driver?) 1f02 30720 mtdblock2 (driver?) 1f03 32768 mtdblock3 (driver?) Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(31,2) |
问题可能:
a。MTD分区与bootloader不匹配
b。没有 devfs文件系统支持
c。ECC校验没有关闭
3. /linuxrc初始化失败
Linux video capture interface: v2.00 NFTL driver: nftlcore.c $Revision: 1.98 $, nftlmount.c $Revision: 1.41 $ S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c2440-nand s3c2440-nand: Tacls=1, 10ns Twrph0=4 40ns, Twrph1=1 10ns NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit) s3c2410_nand_update_chip: chip c3d704bc: 9 NAND_ECC_NONE selected by board driver. This is not recommended !! Scanning device for bad blocks Bad eraseblock 357 at 0x00594000 Bad eraseblock 3335 at 0x0341c000 Bad eraseblock 3995 at 0x03e6c000 Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x00000000-0x00030000 : "boot" 0x00030000-0x00200000 : "kernel" 0x00200000-0x02000000 : "rootfs" 0x02000000-0x04000000 : "ext-fs1" usbmon: debugfs is not available s3c2410-ohci s3c2410-ohci: S3C24XX OHCI s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1 s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000 usb usb1: configuration #1 chosen from 1 choice hub 1-0:1.0: USB hub found hub 1-0:1.0: 2 ports detected Initializing USB Mass Storage driver… usbcore: registered new interface driver usb-storage USB Mass Storage support registered. mice: PS/2 mouse device common for all mice i2c /dev entries driver s3c2440-i2c s3c2440-i2c: slave address 0x10 s3c2440-i2c s3c2440-i2c: bus frequency set to 390 KHz s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled Registered led device: led4 Registered led device: led5 Registered led device: led6 Registered led device: led7 TCP cubic registered RPC: Registered udp transport module. RPC: Registered tcp transport module. VFS: Mounted root (cramfs filesystem) readonly. Freeing init memory: 124K cramfs: bad compressed blocksize 989432407 cramfs: bad compressed blocksize 4274059297 Failed to execute /linuxrc. Attempting defaults… Kernel panic – not syncing: No init found. Try passing init= option to kernel. |
问题可能:
a。 "Default kernel command string"设置有误,比如启动分区指定不对
b。 可能是文件系统有问题
最后的这个问题更多的可能是文件系统制作导致的,由于我之前一直是用开发板自带的文件系统做的,一直不行。网上很多介绍busybox的文章,也许可以用这个试一下
转载请注明:在路上 » 【转】嵌入式ARM移植之三:移植 linux-2.6.26 内核