一、下載linux-2.6.30.4源碼,並解壓
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.gz
tar zxvf linux-2.6.30.4.tar.gz
二、在系統中添加對ARM的支持
$vim Makefile
193#ARCH ?= $(SUBARCH)
194#CROSS_COMPILE ?=
195 ARCH=arm
196 CROSS_COMPILE=arm-linux-
三、修改系統時鐘
$vim arch/arm/mach-s3c2440/mach-smdk2440.c
系統的外部時鐘為12MHz
160static void __init smdk2440_map_io(void)
161{
162s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc));
163//s3c24xx_init_clocks(16934400);
164//edit by
165 s3c24xx_init_clocks(12000000);
166s3c24xx_init_uarts(smdk2440_uartcfgs,ARRAY_SIZE(smdk2440_uartcfgs));
167}
說明:如果系統時鐘不匹配,則出現亂碼。
四、制作或者獲取內核配置單.config
$make menuconfig
說明:一個比較好的做法是先調用自帶的配置清單,該配置清單在arch/arm/configs目錄,文件名為:s3c2410_defconfig,該配置文件幾乎S3C24XX系列CPU的配置項,可以在此基礎上修改配置項。x86的配置項在arch/x86/configs目錄下,文件名為:i386_defconfig(32為cpu)。
cp arch/arm/configs/s3c2410_defconfig .config
五、修改機器碼
【linux內核源碼中查看機器碼相關文件:】
$vim arch/arm/mach-s3c2440/mach-smdk2440.c
178 MACHINE_START(S3C2440 , "SMDK2440")
179/* Maintainer: Ben Dooks <[email protected]> */
180.phys_io = S3C2410_PA_UART,
181.io_pg_offst = (((u32)S3C24XX_VA_UART)>> 18) & 0xfffc,
182.boot_params = S3C2410_SDRAM_PA+ 0x100,
183
184 .init_irq = s3c24xx_init_irq,
185.map_io = smdk2440_map_io,
186.init_machine = smdk2440_machine_init,
187.timer = &s3c24xx_timer,
188MACHINE_END
修改機器碼,使之與bootloader的機器碼相同,這裡使用的是u-boot,機器碼為168
$vim arch/arm/tools/mach-types
379 s3c2440 ARCH_S3C2440 S3C2440168
$vim arch/arm/tools/Makefile
7 include/asm-arm/mach-types.h :$(src)/gen-mach-types $(src)/mach-types
8@echo ' Generating $@'
9@mkdir -p $(dir $@)
10$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
$vim include/asm/mach-types.h
375 #define MACH_TYPE_S3C2440168 //這個沒有找見
【U-boot中的相關配置文件】
$vim include/asm-arm/mach-types.h
377 #define MACH_TYPE_S3C2440 168
總結:首先從linux內核源碼中找出機器類型(如S3C2440 ),其次,根據u-boot中給出的對應機器類型的機器碼(如377 #define MACH_TYPE_S3C2440 168 )修改內核機器碼。流程如下:
內核:
$vimarch/arm/mach-s3c2440/mach-smdk2440.c
U-boot:
$viminclude/asm-arm/mach-types.h
內核:
$vimarch/arm/tools/mach-types
說明:如果機器碼錯誤,則系統提示選取平台,死機。
六、編譯鏡像
$make zImage
七、板子燒寫
使用DNW工具將內核鏡像燒寫至開發板中
八、遇到的問題
問題:
Kernel panic - not syncing: Attempted to kill init!
解決辦法:
$make menuconfig
選擇以下兩項:
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)