烧写Linux Kernel uImage后,停在Uncompressing Linux... done, booting the kernel.

本文讨论了嵌入式开发中遇到的串口驱动问题,通过配置内核驱动并解决串口打印信息消失的问题,最终实现内核正常启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在串口终端打印的信息如下:



RomBOOT


AT91Bootstrap 3.6.0 (Sat Jan 30 20:44:32 CST 2016)

NAND: Done to load image


U-Boot 2014.04 (Feb 20 2016 - 12:02:56)

CPU: AT91SAM9261
Crystal frequency:   18.432 MHz
CPU clock        :  198.656 MHz
Master clock     :   99.328 MHz
DRAM:  64 MiB
WARNING: Caches not enabled
NAND:  128 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot:  0 

NAND read: device 0 offset 0x200000, size 0x300000
 3145728 bytes read: OK
## Booting kernel from Legacy Image at 22000000 ...
   Image Name:   Linux-3.4.9-AT91SAM9261
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1663528 Bytes = 1.6 MiB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

         接下来,就什么都没有了,就像没有内核一样的。。。但是内核又加载成功了一样,看了一下开发板,LED还在闪着呢,我记得Uboot烧写成功后,这个用户LED灯不闪烁。难道Linux内核已经成功运行,只是串口没有打印,看来有可能与Linux中的串口驱动有关!!!
        Uboot的传递参数是正确的,其他的内核引导过正常!!

打开内核,配置一下串口的驱动,控制台的串口使用的是DEBUG串口,这里使用AT91SAM9261EK的开发板,Linux 内核为:Linux 3.4.9的内核(官方的)。

         内核配置是根据默认的配置修改的,去掉一些无关项。
找到Device Driver看一下串口配置:
在shell控制台里执行:
make ARCH=arm menuconfig



(1)串口的驱动,在Device Drivers --->菜单项下:



(2)串口设备属于:字符设备 Character devices --->




(3)找到串口驱动项:Serial drivers --->




(4)串口的配置正常:我这里用的是Atmel的板子。



(5)这个DMA一定要选上,因为串口设备那里选择了串口基于DMA,否则可能串口驱动不正常,并且还不打印出错的信息,让你蒙在鼓里!!!

以上配置正确后,重新编译内核:生成uImage,使用samba烧写即可。

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage


          烧写后,果然,串口终端有打印信息了,内核启动正常!!

RomBOOT




AT91Bootstrap 3.6.0 (Sat Jan 30 20:44:32 CST 2016)


NAND: Done to load image




U-Boot 2014.04 (Feb 20 2016 - 12:02:56)


CPU: AT91SAM9261
Crystal frequency:   18.432 MHz
CPU clock        :  198.656 MHz
Master clock     :   99.328 MHz
DRAM:  64 MiB
WARNING: Caches not enabled
NAND:  128 MiB
*** Warning - bad CRC, using default environment


In:    serial
Out:   serial
Err:   serial
Net:   Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot:  0 


NAND read: device 0 offset 0x200000, size 0x300000
 3145728 bytes read: OK
## Booting kernel from Legacy Image at 22000000 ...
   Image Name:   Linux-3.4.9-AT91SAM9261
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1654216 Bytes = 1.6 MiB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK


Starting kernel ...


Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0
Linux version 3.4.9-AT91SAM9261 (root@zhangsz) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #4 Sat Feb 20 12:30:17 CST 2016
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Atmel AT91SAM9261-EK
Memory policy: ECC disabled, Data cache writeback
AT91: Detected soc type: at91sam9261
AT91: Detected soc subtype: Unknown
AT91: sram at 0x300000 of 0x28000 mapped at 0xfef50000
Clocks: CPU 198 MHz, master 99 MHz, main 18.432 MHz
gpiochip_add: registered GPIOs 0 to 31 on device: pioA
gpiochip_add: registered GPIOs 32 to 63 on device: pioB
gpiochip_add: registered GPIOs 64 to 95 on device: pioC
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: mem=64M console=ttyS0,115200 mtdparts=atmel_nand:8M(bootstrap/uboot/kernel)ro,-(rootfs) root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60900k/60900k available, 4636k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    vmalloc : 0xc4800000 - 0xff000000   ( 936 MB)
    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .text : 0xc0008000 - 0xc0395ee8   (3640 kB)
      .init : 0xc0396000 - 0xc03b6000   ( 128 kB)
      .data : 0xc03b6000 - 0xc03db4c0   ( 150 kB)
       .bss : 0xc03db4e4 - 0xc03eef9c   (  79 kB)
NR_IRQS:16 nr_irqs:16 16
AT91: 96 gpio irqs in 3 banks
sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286ms
Console: colour dummy device 80x30
Calibrating delay loop... 98.71 BogoMIPS (lpj=493568)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0x202c7130 - 0x202c7188
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
AT91: Power Management
AT91: Starting after general reset
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
i2c-gpio i2c-gpio.0: using pins 7 (SDA) and 8 (SCL)
Switching to clocksource tcb_clksrc
NET: Registered protocol family 2
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
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
squashfs: version 4.0 (2009/01/31) Phillip Lougher
msgmni has been set to 118
io scheduler noop registered (default)
atmel_lcdfb atmel_lcdfb.0: clut resources unusable
atmel_usart.0: ttyS0 at MMIO 0xfffff200 (irq = 17) is a ATMEL_SERIAL
console [ttyS0] enabled
brd: module loaded
ssc ssc.1: Atmel SSC device at 0xc4810000 (irq 31)
atmel_nand: Use On Flash BBT
atmel_nand atmel_nand: No DMA support for NAND access.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
Bad block table not found for chip 0
Bad block table not found for chip 0
Scanning device for bad blocks
Bad eraseblock 446 at 0x0000037c0000
Bad eraseblock 994 at 0x000007c40000
Bad block table written to 0x000007fe0000, version 0x01
Bad block table written to 0x000007fc0000, version 0x01
2 cmdlinepart partitions found on MTD device atmel_nand
Creating 2 MTD partitions on "atmel_nand":
0x000000000000-0x000000800000 : "bootstrap/uboot/kernel"
0x000000800000-0x000008000000 : "rootfs"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: empty MTD device detected
UBI: max. sequence number:       0
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name:            "rootfs"
UBI: MTD device size:            120 MiB
UBI: number of good PEBs:        954
UBI: number of bad PEBs:         6
UBI: number of corrupted PEBs:   0
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     0
UBI: available PEBs:             941
UBI: total number of reserved PEBs: 13
UBI: number of PEBs reserved for bad PEB handling: 9
UBI: max/mean erase counter: 0/0
UBI: image sequence number:  -230112458
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 28)
UBI: background thread "ubi_bgt0d" started, PID 810
atmel_spi atmel_spi.0: master is unqueued, this is deprecated
dm9000 Ethernet Driver, V1.31
dm9000 dm9000.0: eth%d: Invalid ethernet MAC address. Please set using ifconfig
eth0: dm9000a at c4804000,c4806044 IRQ 123 MAC: 86:74:e2:c9:41:58 (random)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
at91_ohci at91_ohci: AT91 OHCI
at91_ohci at91_ohci: new USB bus registered, assigned bus number 1
at91_ohci at91_ohci: irq 36, io mem 0x00500000
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.
mousedev: PS/2 mouse device common for all mice
ads7846 spi0.2: touchscreen, irq 45
input: ADS7843 Touchscreen as /devices/platform/atmel_spi.0/spi_master/spi0/spi0.2/input/input0
rtc-at91sam9 rtc-at91sam9.0: rtc core: registered rtc-at91sam9 as rtc0
rtc-at91sam9: probe of rtc-at91sam9.0 failed with error -38
i2c /dev entries driver
at91sam9_wdt: sorry, watchdog is disabled
at91_wdt: probe of at91_wdt failed with error -5
TCP: cubic registered
NET: Registered protocol family 17
VFP support v0.3: not present
input: gpio-keys as /devices/platform/gpio-keys/input/input1
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0): error -19
Please append a correct "root=" boot option; here are the available partitions:
1f00            8192 mtdblock0  (driver?)
1f01          122880 mtdblock1  (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[<c0014620>] (unwind_backtrace+0x0/0xf4) from [<c02c531c>] (panic+0x74/0x1bc)
[<c02c531c>] (panic+0x74/0x1bc) from [<c0396cf0>] (mount_block_root+0x174/0x228)
[<c0396cf0>] (mount_block_root+0x174/0x228) from [<c0396f20>] (prepare_namespace+0x8c/0x1ac)
[<c0396f20>] (prepare_namespace+0x8c/0x1ac) from [<c0396390>] (kernel_init+0x164/0x1ac)
[<c0396390>] (kernel_init+0x164/0x1ac) from [<c000f988>] (kernel_thread_exit+0x0/0x8)


           总结:学习嵌入式,需要的是软件与硬件的结合,我是硬件出身,因此,出现问题,先从硬件角度去思路,也就是从硬件驱动上着手,从根本上找到为什么会这样!!


<think>嗯,用户提到Mini2440引导Linux失败,我需要先了解可能的原因。首先,Mini2440是一款基于ARM9的开发板,引导失败可能涉及多个方面。我应该从常见的启动流程入手,比如Bootloader、内核配置、文件系统、硬件连接等。 首先想到的是Bootloader的问题,比如U-Boot是否正确录,配置参数是否正确。如果Bootloader损坏或者环境变量设置错误,比如内存地址、启动参数不对,可能会导致无法加载内核。这时候需要检查U-Boot是否能正常启动,以及参数是否正确。 接下来是内核镜像的问题。用户可能编译的内核不正确,比如没有选择适合Mini2440的配置,或者编译选项错误,比如处理器类型、时钟频率不匹配。还有可能是内核镜像格式不对,比如没有处理成U-Boot可识别的uImage,而是直接用了zImage,导致无法加载。 文件系统也是常见的问题。文件系统类型是否正确,比如是否支持YAFFS2或JFFS2,以及是否正确地录到NAND Flash的相应分区。如果rootfs损坏或者内核找不到rootfs的位置,启动过程会卡住。 硬件方面,需要检查电源是否稳定,内存和NAND Flash是否有问题。接触不良或者硬件损坏也会导致启动失败,尤其是如果开发板之前正常使用突然出问题的话。 还有可能是启动参数设置错误,比如命令行参数中的root设备、控制台设置是否正确。例如,控制台输出配置错误可能导致看不到启动信息,误以为启动失败。 用户可能按照某个教程操作,但步骤有误,比如录顺序不对,或者使用了不兼容的版本。需要确认每一步操作是否正确,比如先用U-Boot录内核和文件系统,再设置启动参数。 我应该建议用户按照步骤排查:首先确认Bootloader状态,检查U-Boot是否能交互;然后确认内核镜像是否正确,检查编译配置和格式;接着检查文件系统的录位置和类型;查看启动时的串口输出信息,定位错误点;最后检查硬件连接和电源。 可能还需要提醒用户检查串口连接和终端配置,确保能正确看到启动信息。有时候问题只是出在终端显示上,比如波特率设置不对,导致看不到输出,误以为启动失败。 总之,需要引导用户逐步排除各个可能的原因,从软件配置到硬件状态,逐一检查,找到具体的问题点。</think>Mini2440 开发板引导 Linux 失败可能涉及多个环节的问题,以下是分步排查指南: --- ### 一、Bootloader 阶段问题 1. **U-Boot 状态检查** - 通过串口查看 U-Boot 是否正常启动 $$ \text{串口输出示例:} \quad \texttt{U-Boot 1.3.4 (Mar 10 2023)} $$ - 若未输出信息: - 检查 **Nor Flash/NAND Flash 启动模式跳线** - 确认 **U-Boot 镜像**是否正确录(使用 H-JTAG 或 OpenOCD 工具) 2. **环境变量验证** - 在 U-Boot 命令行输入 `printenv` - 关键参数核对: ``` bootargs=root=/dev/mtdblock3 console=ttySAC0,115200 bootcmd=nand read 0x30008000 0x60000 0x200000; bootm 0x30008000 ``` - 错误示例:`bootcmd` 中内核地址与录位置不匹配。 --- ### 二、内核加载失败 1. **镜像格式问题** - 确保内核编译为 **U-Boot 可识别的 uImage**(非 zImage) ```bash # 编译命令需包含头部信息 make uImage LOADADDR=0x30008000 ``` - 验证镜像:`file uImage` 应显示 `U-Boot legacy uImage` 2. **录地址与内存冲突** - 典型错误:内核加载地址与内存映射冲突 - Mini2440 S3C2440 内存范围:`0x30000000–0x34000000` - 使用 `nand write` 时需避开 U-Boot 保留区(通常前 4MB) --- ### 三、根文件系统问题 1. **文件系统类型验证** - 确认内核配置支持对应文件系统(如 `CONFIG_YAFFS_FS`) - 常见错误:未启用 ECC 校验导致 NAND 读取异常 2. **MTD 分区表匹配** - 内核源码中 `arch/arm/mach-s3c2440/mach-mini2440.c` 需与 U-Boot 分区一致 ```c static struct mtd_partition mini2440_nand_part[] = { [0] = { .name = "u-boot", .offset = 0, .size = 0x40000 }, [1] = { .name = "kernel", .offset = 0x60000, .size = 0x200000 }, [2] = { .name = "rootfs", .offset = 0x260000,.size = 0x500000 } }; ``` --- ### 四、硬件相关故障 1. **电源稳定性测试** - 使用示波器检测 5V 电源纹波(需 < 50mV) - 核心电压 1.25V(ARM920T 内核)波动可能导致异常 2. **NAND Flash 检测** - 在 U-Boot 中运行 `nand info` 查看识别状态 - 使用 `nand scrub` 擦除坏块(谨慎操作!会清空数据) --- ### 五、调试建议 1. **串口输出分析** - 卡在 `Uncompressing Linux... done, booting the kernel`:内核解压后崩溃 - 卡在 `VFS: Cannot open root device`:文件系统加载失败 2. **内存检测命令** ``` # 在 U-Boot 中测试内存 mtest 0x30000000 0x31000000 ``` --- ### 六、典型修复案例 - **案例1**:未设置 `CONFIG_CMDLINE` 导致内核参数丢失 _解决方法_:在内核配置中强制指定 `console=ttySAC0,115200 root=/dev/mtdblock3` - **案例2**:YAFFS2 文件系统未启用 OOB 自动处理 _解决方法_:录时添加 `-n` 参数跳过 OOB 区域: ``` nand write.yaffs 0x31000000 0x260000 $(filesize) ``` 请根据实际现象选择对应的排查方向,建议优先通过串口日志定位故障阶段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsz_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值