移植Linux2.6.26内核到SEP4020平台上
时间:2009-07-18 来源:fpseustar
最近想学习下arm linux 的启动过程,于是就想把sep4020的现有Linux2.6.16平台升级到2.6.26平台上,顺便学习下linux启动过程:
步骤一:
下载一个Linux2.6.26版本下来可以到http://www.af.kernel.org/pub/linux/kernel/v2.6/
上下载2.6.26版本,并在fedora 7的根目录下面解压缩。
步骤二:
修改linux-2.6.26根目录下面的Makefile,在内核根目录下的Makefile文件中指定要用到的编译器和架构(arch),方法:在第194行添加代码 ,将ARCH ?=(SUBARCH) 改为,
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
步骤三:
由于我们是已经有很完善的Linux2.6.16平台了,(这个平台的移植参考leeming的文章Porting Linux2.6.16内核到sep4020(arm720T)),我在这里就比较轻松的将两个主要目录arch/arm/mach-sep4020和include/asm-arm/arch-sep4020直接拷贝到2.6.26内核相应目录,修改好arch/arm的Kconfig和Makefile文件,让它支持我们的SEP4020处理器。
另外还需要注意的是,在arch/arm/tools/mach-types文件中增加一行sep4020的机器ID
步骤四:
make menuconfig,将内核大部分选项全部去掉,这里有关sep4020的能正常用的config文件,如果需要,大家可以参考这个来改menuconfig
|
步骤五:
编译内核,问题相当多,分别列举如下:
问题1:
[root@localhost linux-2.6.26]# make HOSTLD scripts/kconfig/conf scripts/kconfig/conf -s arch/arm/Kconfig CHK include/linux/version.h SYMLINK include/asm-arm/arch -> include/asm-arm/arch-sep4020 make[1]: “include/asm-arm/mach-types.h”是最新的。 CHK include/linux/utsrelease.h CC kernel/bounds.s GEN include/linux/bounds.h CC arch/arm/kernel/asm-offsets.s In file included from include/linux/irqflags.h:46, from include/asm/system.h:65, from include/asm/bitops.h:27, from include/linux/bitops.h:17, from include/linux/kernel.h:15, from include/linux/sched.h:52, from arch/arm/kernel/asm-offsets.c:13: include/asm/irqflags.h:11:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/asm/bitops.h:27, from include/linux/bitops.h:17, from include/linux/kernel.h:15, from include/linux/sched.h:52, from arch/arm/kernel/asm-offsets.c:13: include/asm/system.h:167:5: warning: "__LINUX_ARM_ARCH__" is not defined include/asm/system.h:173:5: warning: "__LINUX_ARM_ARCH__" is not defined include/asm/system.h:177:35: warning: "__LINUX_ARM_ARCH__" is not defined include/asm/system.h:297:5: warning: "__LINUX_ARM_ARCH__" is not defined include/asm/system.h:302:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/linux/bitops.h:17, from include/linux/kernel.h:15, from include/linux/sched.h:52, from arch/arm/kernel/asm-offsets.c:13: include/asm/bitops.h:237:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/asm/thread_info.h:16, from include/linux/thread_info.h:47, from include/linux/preempt.h:9, from include/linux/spinlock.h:49, from include/linux/seqlock.h:29, from include/linux/time.h:8, from include/linux/timex.h:57, from include/linux/sched.h:54, from arch/arm/kernel/asm-offsets.c:13: include/asm/fpstate.h:32:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/linux/prefetch.h:14, from include/linux/list.h:6, from include/linux/preempt.h:11, from include/linux/spinlock.h:49, from include/linux/seqlock.h:29, from include/linux/time.h:8, from include/linux/timex.h:57, from include/linux/sched.h:54, from arch/arm/kernel/asm-offsets.c:13: include/asm/processor.h:109:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/linux/spinlock.h:302, from include/linux/seqlock.h:29, from include/linux/time.h:8, from include/linux/timex.h:57, from include/linux/sched.h:54, from arch/arm/kernel/asm-offsets.c:13: include/asm/atomic.h:25:5: warning: "__LINUX_ARM_ARCH__" is not defined In file included from include/asm/page.h:29, from include/linux/mm_types.h:13, from include/linux/sched.h:61, from arch/arm/kernel/asm-offsets.c:13: include/asm/glue.h:119:2: #error Unknown data abort handler type include/asm/glue.h:146:2: #error Unknown prefetch abort handler type In file included from include/linux/mm_types.h:13, from include/linux/sched.h:61, from arch/arm/kernel/asm-offsets.c:13: include/asm/page.h:111:2: #error Unknown user operations model make[1]: *** [arch/arm/kernel/asm-offsets.s] 错误 1 make: *** [prepare0] 错误 2 解决方法: 这个主要是由于我没在/arch/arm/mm/Kconfig的720T中增加sep4020引起的。 问题 2: include/linux/compiler.h:34:1: warning: this is the location of the previous definition CC init/do_mounts_rd.o CC init/do_mounts_initrd.o LD init/mounts.o CC init/initramfs.o CC init/calibrate.o LD init/built-in.o HOSTCC usr/gen_init_cpio GEN usr/initramfs_data.cpio.gz AS usr/initramfs_data.o LD usr/built-in.o CC arch/arm/kernel/compat.o AS arch/arm/kernel/entry-armv.o arch/arm/kernel/entry-armv.S: Assembler messages: arch/arm/kernel/entry-armv.S:210: Error: bad instruction `get_irqnr_preamble r5,lr' arch/arm/kernel/entry-armv.S:431: Error: bad instruction `get_irqnr_preamble r5,lr' make[1]: *** [arch/arm/kernel/entry-armv.o] 错误 1 make: *** [arch/arm/kernel] 错误 2 解决方法: 进入arch/arm/kernel/entry-armv.S屏掉这两句话 因为[ARM] 4185/2: entry: introduce get_irqnr_preamble and arch_ret_to_user
get_irqnr_preamble allows machines to take some action before entering the
get_irqnr_and_base loop. On iop we enable cp6 access.
arch_ret_to_user is added to the userspace return path to allow individual
architectures to take actions, like disabling coprocessor access, before
the final return to userspace.
Per Nicolas Pitre's note, there is no need to cp_wait on the return to user
as the latency to return is sufficient.
Signed-off-by: Dan Williams
Signed-off-by: Russell King
问题3: arch/arm/kernel/entry-common.S: Assembler messages: arch/arm/kernel/entry-common.S:30: Error: bad instruction `arch_ret_to_user r1,lr' arch/arm/kernel/entry-common.S:69: Error: bad instruction `arch_ret_to_user r1,lr' make[1]: *** [arch/arm/kernel/entry-common.o] 错误 1 make: *** [arch/arm/kernel] 错误 2 解决方法: 直接屏掉这两句话,原因同上 问题4: In file included from include/linux/init.h:4, from arch/arm/mach-sep4020/irq.c:1: include/linux/compiler.h:34:1: warning: this is the location of the previous definition arch/arm/mach-sep4020/irq.c:35: error: variable `sep4020_chip' has initializer but incomplete type arch/arm/mach-sep4020/irq.c:37: error: unknown field `ack' specified in initializer arch/arm/mach-sep4020/irq.c:37: warning: excess elements in struct initializer arch/arm/mach-sep4020/irq.c:37: warning: (near initialization for `sep4020_chip') arch/arm/mach-sep4020/irq.c:38: error: unknown field `mask' specified in initializer arch/arm/mach-sep4020/irq.c:38: warning: excess elements in struct initializer arch/arm/mach-sep4020/irq.c:38: warning: (near initialization for `sep4020_chip') arch/arm/mach-sep4020/irq.c:39: error: unknown field `unmask' specified in initializer arch/arm/mach-sep4020/irq.c:39: warning: excess elements in struct initializer arch/arm/mach-sep4020/irq.c:39: warning: (near initialization for `sep4020_chip') arch/arm/mach-sep4020/irq.c: In function `sep4020_init_irq': arch/arm/mach-sep4020/irq.c:54: error: `do_level_IRQ' undeclared (first use in this function) arch/arm/mach-sep4020/irq.c:54: error: (Each undeclared identifier is reported only once arch/arm/mach-sep4020/irq.c:54: error: for each function it appears in.) arch/arm/mach-sep4020/irq.c:55: warning: passing arg 2 of `set_irq_chip' from incompatible pointer type arch/arm/mach-sep4020/irq.c: At top level: arch/arm/mach-sep4020/irq.c:35: error: storage size of `sep4020_chip' isn't known make[1]: *** [arch/arm/mach-sep4020/irq.o] 错误 1 make: *** [arch/arm/mach-sep4020] 错误 2 解决方法: 将irq.c的35行换为static struct irq_chip sep4020_chip 将54行的set_irq_handler(i, do_level_IRQ);换为 set_irq_handler(i, handle_level_irq); 问题5: In file included from include/linux/timex.h:56, from arch/arm/mach-sep4020/time.c:1: include/linux/compiler.h:34:1: warning: this is the location of the previous definition arch/arm/mach-sep4020/time.c: In function `sep4020_timer_interrupt': arch/arm/mach-sep4020/time.c:29: error: too many arguments to function `timer_tick' arch/arm/mach-sep4020/time.c: At top level: arch/arm/mach-sep4020/time.c:38: error: `SA_INTERRUPT' undeclared here (not in a function) arch/arm/mach-sep4020/time.c:38: error: `SA_TIMER' undeclared here (not in a function) arch/arm/mach-sep4020/time.c:38: error: initializer element is not constant arch/arm/mach-sep4020/time.c:38: error: (near initialization for `sep4020_timer_irq.flags') arch/arm/mach-sep4020/time.c:39: warning: initialization from incompatible pointer type arch/arm/mach-sep4020/time.c: In function `sep4020_timer_init': arch/arm/mach-sep4020/time.c:47: error: implicit declaration of function `setup_irq' make[1]: *** [arch/arm/mach-sep4020/time.o] 错误 1 make: *** [arch/arm/mach-sep4020] 错误 2 解决方法: 将29行 timer_tick(regs);换为 timer_tick(); 将23行static irqreturn_t sep4020_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)换为static irqreturn_t sep4020_timer_interrupt(int irq, void *dev_id) 将38行 .flags = SA_INTERRUPT | SA_TIMER,换为 .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, 另外在开头处写上#include <linux/irq.h> 问题6: [root@localhost linux-2.6.26]# make CHK include/linux/version.h make[1]: “include/asm-arm/mach-types.h”是最新的。 CHK include/linux/utsrelease.h CALL scripts/checksyscalls.sh <stdin>:1097:2: warning: #warning syscall fadvise64 not implemented <stdin>:1265:2: warning: #warning syscall migrate_pages not implemented <stdin>:1321:2: warning: #warning syscall pselect6 not implemented <stdin>:1325:2: warning: #warning syscall ppoll not implemented <stdin>:1365:2: warning: #warning syscall epoll_pwait not implemented CHK include/linux/compile.h CC arch/arm/mach-sep4020/Devices.o CC arch/arm/mach-sep4020/clock.o In file included from include/asm/io.h:85, from arch/arm/mach-sep4020/clock.c:27: include/asm/arch/io.h:53:1: warning: "__cond_lock" redefined In file included from include/linux/stddef.h:4, from include/linux/list.h:4, from include/linux/module.h:9, from arch/arm/mach-sep4020/clock.c:13: include/linux/compiler.h:34:1: warning: this is the location of the previous definition In file included from include/asm/io.h:85, from arch/arm/mach-sep4020/clock.c:27: include/asm/arch/io.h:53:1: warning: "__cond_lock" redefined In file included from include/linux/stddef.h:4, from include/linux/list.h:4, from include/linux/module.h:9, from arch/arm/mach-sep4020/clock.c:13: include/linux/compiler.h:34:1: warning: this is the location of the previous definition CC arch/arm/mach-sep4020/dma.o In file included from include/asm/io.h:85, from arch/arm/mach-sep4020/dma.c:16: include/asm/arch/io.h:53:1: warning: "__cond_lock" redefined In file included from include/linux/stddef.h:4, from include/linux/list.h:4, from include/linux/module.h:9, from arch/arm/mach-sep4020/dma.c:5: include/linux/compiler.h:34:1: warning: this is the location of the previous definition CC arch/arm/mach-sep4020/4020.o In file included from include/asm/io.h:85, from arch/arm/mach-sep4020/4020.c:2: include/asm/arch/io.h:53:1: warning: "__cond_lock" redefined In file included from include/linux/stddef.h:4, from include/linux/posix_types.h:4, from include/linux/types.h:11, from include/asm/io.h:26, from arch/arm/mach-sep4020/4020.c:2: include/linux/compiler.h:34:1: warning: this is the location of the previous definition In file included from include/linux/time.h:8, from include/linux/timex.h:57, from include/linux/sched.h:54, from include/linux/interrupt.h:12, from arch/arm/mach-sep4020/4020.c:7: include/linux/seqlock.h:76:34: macro "__cond_lock" passed 2 arguments, but takes just 1 In file included from include/linux/time.h:8, from include/linux/timex.h:57, from include/linux/sched.h:54, from include/linux/interrupt.h:12, from arch/arm/mach-sep4020/4020.c:7: include/linux/seqlock.h: In function `write_tryseqlock': include/linux/seqlock.h:76: error: `__cond_lock' undeclared (first use in this function) include/linux/seqlock.h:76: error: (Each undeclared identifier is reported only once include/linux/seqlock.h:76: error: for each function it appears in.) make[1]: *** [arch/arm/mach-sep4020/4020.o] 错误 1 make: *** [arch/arm/mach-sep4020] 错误 2 解决方法: 将include/asm-arm/arch-sep4020/io.h中的 #ifdef __CHECKER__ # define __user __attribute__((noderef, address_space(1))) # define __kernel // default address space # define __safe __attribute__((safe)) # define __force __attribute__((force)) # define __nocast __attribute__((nocast)) # define __iomem __attribute__((noderef, address_space(2))) # define __acquires(x) __attribute__((context(0,1))) # define __releases(x) __attribute__((context(1,0))) # define __acquire(x) __context__(1) # define __release(x) __context__(-1) # define __cond_lock(x) ((x) ? ({ __context__(1); 1; }) : 0) extern void __chk_user_ptr(void __user *); extern void __chk_io_ptr(void __iomem *); #else # define __user # define __kernel # define __safe # define __force # define __nocast # define __iomem # define __chk_user_ptr(x) (void)0 # define __chk_io_ptr(x) (void)0 # define __builtin_warning(x, y...) (1) # define __acquires(x) # define __releases(x) # define __acquire(x) (void)0 # define __release(x) (void)0 # define __cond_lock(x) (x) #endif 这一大段屏掉,因为在/include/linux/compiler.h中也定义了这些,重复定义了 问题7: SYSMAP System.map SYSMAP .tmp_System.map 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 arch/arm/boot/compressed/misc.c:73: error: redefinition of 'putstr' include/asm/arch/uncompress.h:44: error: previous definition of 'putstr' was here arch/arm/boot/compressed/misc.c: In function `putstr': arch/arm/boot/compressed/misc.c:78: error: implicit declaration of function `putc' arch/arm/boot/compressed/misc.c:82: error: implicit declaration of function `flush' make[2]: *** [arch/arm/boot/compressed/misc.o] 错误 1 make[1]: *** [arch/arm/boot/compressed/vmlinux] 错误 2 make: *** [zImage] 错误 2 解决方法: 将linux/include/asm-arm/arch-4020/uncompress.h 的43行的 static void putstr(const char *s) { char c; while ((c = *s++) != '\0') { while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) barrier(); clps_writel(c, UARTDRx); if (c == '\n') { while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) barrier(); clps_writel('\r', UARTDRx); } } while (clps_readl(SYSFLGx) & SYSFLG_UBUSY) barrier(); } 改为: static inline void putc(int c) { while (clps_readl(SYSFLGx) & SYSFLG_UTXFF) barrier(); clps_writel(c, UARTDRx); } static inline void flush(void) { while (clps_readl(SYSFLGx) & SYSFLG_UBUSY) barrier(); } 步骤六: 经过上面的出错过程,编译基本上没有什么问题了,现在开始调试: (1)直接编译成uImage,通过uboot加载引导,但出现乱码: 发现已经进入了/init/main.c的start_kernel函数了,因为一旦我在start_kernel开始处加入while(1);他就死在此处,不会输出任何东西了,所以我就准备用AXD直接调试Linux未压缩的内核/arch/arm/boot/Image(它是elf格式vmlinux的二进制文件,没有经过任何压缩),我将此文件用axd下载到0x30008000的地址,并且将r0=0,r1=194,然后将pc移到0x30008000开始运行,刚开始位于0x30008000处的函数就是/arch/arm/kernel/head.s中的78行的stext函数,这个就是内核入口函数,呵呵!! 今天移植的第二天了,本来在ADS上调试发现是在 __turn_mmu_on: mov r0, r0 mcr p15, 0, r0, c1, c0, 0 @ write control reg mrc p15, 0, r3, c0, c0, 0 @ read id reg mov r3, r3 mov r3, r3 mov pc, r13 这段程序飞掉了,看来是在开MMU后飞掉的,但自己又觉得是ADS ICE出问题了,于是我就换了jlink和另外一块MBT1.0的板子来调试,这次一下就都过去了,很快就到了start_kernel函数,太激动了啊,于是我赶紧将内核镜像直接做成uImage行式,直接用uboot来引导它,呵呵,果然一下什么都好了,看来已经移植成功了: Starting kernel ... Linux version 2.6.26 ([email protected]) (gcc version 3.4.1) #30 Sat Jul 18 14:41:36 CST 2009 CPU: ARM720T [41807202] revision 2 (ARMv4T), cr=0000217f Machine: 4020 board Memory policy: ECC disabled, Data cache writeback Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128 Kernel command line: root=/dev/nfs rw nfsroot=192.168.0.3:/nfs ip=192.168.0.2:192.168.0.3:192.168.0.1:255.255.255.0::eth0:off console=ttyS0,115200 init=/linuxrc Trying to install interrupt handler for IRQ0 Trying to install interrupt handler for IRQ1 Trying to install interrupt handler for IRQ2 Trying to install interrupt handler for IRQ3 Trying to install interrupt handler for IRQ4 Trying to install interrupt handler for IRQ5 Trying to install interrupt handler for IRQ6 Trying to install interrupt handler for IRQ7 Trying to install interrupt handler for IRQ8 Trying to install interrupt handler for IRQ9 Trying to install interrupt handler for IRQ10 Trying to install interrupt handler for IRQ11 Trying to install interrupt handler for IRQ12 Trying to install interrupt handler for IRQ13 Trying to install interrupt handler for IRQ14 Trying to install interrupt handler for IRQ15 Trying to install interrupt handler for IRQ16 Trying to install interrupt handler for IRQ17 Trying to install interrupt handler for IRQ18 Trying to install interrupt handler for IRQ19 Trying to install interrupt handler for IRQ20 Trying to install interrupt handler for IRQ21 Trying to install interrupt handler for IRQ22 Trying to install interrupt handler for IRQ23 Trying to install interrupt handler for IRQ24 Trying to install interrupt handler for IRQ25 Trying to install interrupt handler for IRQ26 Trying to install interrupt handler for IRQ27 Trying to install interrupt handler for IRQ28 Trying to install interrupt handler for IRQ29 Trying to install interrupt handler for IRQ30 Trying to install interrupt handler for IRQ31 PID hash table entries: 128 (order: 7, 512 bytes) Console: colour dummy device 80x30 Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) Memory: 32MB = 32MB total Memory: 31248KB available (1012K code, 104K data, 64K init) SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok platform_device_register sep4020_fb_set_platdata msgmni has been set to 61 Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing disabled serial8250.0: ttyS0 at MMIO 0x10005000 (irq = 24) is a 16450 console [ttyS0] enabled serial8250.0: ttyS1 at MMIO 0x10006000 (irq = 23) is a 16450 serial8250.0: ttyS2 at MMIO 0x10007000 (irq = 22) is a 16450 serial8250.0: ttyS3 at MMIO 0x10008000 (irq = 21) is a 16450 mice: PS/2 mouse device common for all mice Freeing init memory: 64K Failed to execute /linuxrc. Attempting defaults... Kernel panic - not syncing: No init found. Try passing init= option to kernel. 这个中间会出现 Trying to install interrupt handler for IRQ0 Trying to install interrupt handler for IRQ1 Trying to install interrupt handler for IRQ2 Trying to install interrupt handler for IRQ3 Trying to install interrupt handler for IRQ4 Trying to install interrupt handler for IRQ5 Trying to install interrupt handler for IRQ6 Trying to install interrupt handler for IRQ7 Trying to install interrupt handler for IRQ8 Trying to install interrupt handler for IRQ9 Trying to install interrupt handler for IRQ10 Trying to install interrupt handler for IRQ11 Trying to install interrupt handler for IRQ12 Trying to install interrupt handler for IRQ13 Trying to install interrupt handler for IRQ14 Trying to install interrupt handler for IRQ15 Trying to install interrupt handler for IRQ16 Trying to install interrupt handler for IRQ17 Trying to install interrupt handler for IRQ18 Trying to install interrupt handler for IRQ19 Trying to install interrupt handler for IRQ20 Trying to install interrupt handler for IRQ21 Trying to install interrupt handler for IRQ22 Trying to install interrupt handler for IRQ23 Trying to install interrupt handler for IRQ24 Trying to install interrupt handler for IRQ25 Trying to install interrupt handler for IRQ26 Trying to install interrupt handler for IRQ27 Trying to install interrupt handler for IRQ28 Trying to install interrupt handler for IRQ29 Trying to install interrupt handler for IRQ30 Trying to install interrupt handler for IRQ31 这个问题,这是由于在/arch/arm/mach-sep4020/irq.c中 void __init sep4020_init_irq(void) { unsigned int i; unsigned long flags; local_save_flags(flags); *(RP)(INTC_IER_V) = 0XFFFFFFFF; *(RP)(INTC_IMR_V) = 0XFFFFFFFF; *(RP)(INTC_IPLR_V) = 0X0; local_irq_restore(flags); printk("sep4020_init_irq(void)\n"); for(i = 0; i < NR_IRQS; i++) { set_irq_handler(i, handle_level_irq); set_irq_chip(i, &sep4020_chip); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); } // __raw_writel(0, INTC_IMR_V); } 函数中set_irq_handler(i, handle_level_irq);这句应该放在 set_irq_chip(i, &sep4020_chip); set_irq_flags(i, IRQF_VALID | IRQF_PROBE); 这两句话后面才行的:现在的结果是 Starting kernel ... Uncompressing Linux....................................... done, booting the kernel. Linux version 2.6.26 ([email protected]) (gcc version 3.4.1) #35 Sat Jul 18 15:50:34 CST 2009setup_arch(&command_line);
CPU: ARM720T [41807202] revision 2 (ARMv4T), cr=0000217f
Machine: 4020 board
Memory policy: ECC disabled, Data cache writeback
mm_init_owner(&init_mm, &init_task);
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 8128
page_alloc_init();
Kernel command line: root=/dev/nfs rw nfsroot=192.168.0.3:/nfs ip=192.168.0.2:192.168.0.3:192.168.0.1:255.255.255.0::eth0:off console=ttyS0,115200 init=/linuxrc
trap_init();
init_IRQ();
sep4020_init_irq(void)
PID hash table entries: 128 (order: 7, 512 bytes)
init_timers();
time_init();
console_init();
Console: colour dummy device 80x30
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 31248KB available (1012K code, 104K data, 68K init)
SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
rest_init();
platform_device_register sep4020_fb_set_platdata
msgmni has been set to 61
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x10005000 (irq = 24) is a 16450
console [ttyS0] enabled
serial8250.0: ttyS1 at MMIO 0x10006000 (irq = 23) is a 16450
serial8250.0: ttyS2 at MMIO 0x10007000 (irq = 22) is a 16450
serial8250.0: ttyS3 at MMIO 0x10008000 (irq = 21) is a 16450
mice: PS/2 mouse device common for all mice
Freeing init memory: 68K
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel. 到这一步,移植就算结束了吧,呵呵