上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用。
(1)制作根文件系统
使用busybox构建根文件系统的步骤可以参考本博客的另外一篇文章,该文章链接如下:
S5PV210(TQ210)学习笔记——内核移植与文件系统构建
需要补充的是,文章"S5PV210(TQ210)学习笔记——内核移植与文件系统构建"中记录rootfs文件系统构建时漏掉了一步,没有在etc/sysconfig/目录下创建HOSTNAME文件,可以手动添加HOSTNAME文件,其内容为主机名称,本文使用了tq335x。在rootfs目录可以通过如下指令创建:
-
echo tq335x > etc/sysconfig/HOSTNAME
本文在已制作好的rootfs基础上,制作ramdisk。
(2)制作ramdisk
制作ramdisk的方式很多,最方便的是使用指令genext2fs。ubuntu操作系统上可以通过apt-get工具直接安装genext2fs工具:
-
sudo apt-get install genext2fs
其它操作系统也有类似的管理工具,这里就不一一列举了,下面使用genext2fs打包rootfs目录。命令如下:
-
genext2fs -b 4096 -d rootfs/ ramdisk
然后使用gzip命令压缩ramdisk:
执行完成该命令后可以得到文件ramdisk.gz。
由于u-boot启动内核使用的ramdisk需要有u-boot的image头,故需要使用编译u-boot时生成的工具mkimage将ramdisk.gz制作为ramdisk.img。其中,工具mkimage位于u-boot的tools目录下,制作ramdisk.img的指令如下:
-
u-boot-2014.10/tools/mkimage -A arm -O linux -T ramdisk -C none -a 0x88080000 -n "ramdisk" -d ramdisk.gz ramdisk.img
命令中mkimage前的路径根据自己实际执行的路径指定即可。
这样,就完成了u-boot可以使用的ramdisk制作,然后将ramdisk.img拷贝到SD卡的boot目录下即可。
(3)挂载ramdisk
老式的ATAGS方式启动内核时使用ATAG传递bootargs给内核,由于本文使用的dtb方式启动内核,故采取dtb的chosen方式传递bootargs给内核。
Step1: 修改内核配置
进入配置项:
按N键取消配置项:
-
[ ] Use appended device tree blob to zImage (EXPERIMENTAL)
官方内核默认启用了该项配置。启用该项配置后内核兼容老式的ATAGS方式内核启动,关闭后则使用新式的dtb方式启动,故此处禁用了此项配置。
按ESC保存配置后退出menuconfig画面,重新编译内核:
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
Step2:添加bootargs到dtb
切换到内核目录arch/arm/boot/dts/,拷贝am335x-evm.dts为tq335x.dts:
-
cp am335x-evm.dts tq335x.dts
打开tq335x.dts,在memory项后通过chosen方式添加bootargs,添加内容如下:
-
memory {
-
device_type = "memory";
-
reg = <0x80000000 0x10000000>;
-
};
-
-
chosen {
-
bootargs = "console=ttyO0,115200n8 root=/dev/ram0";
-
};
-
-
...
其中chosen节点是新添加的,memory节点是原有的。
接下来重新编译dtb:
-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb
将新编译得到的tq335x.dtb拷贝到SD的boot目录下。至此,准备工作就完成了,下面我们使用新制作的ramdisk.img和tq335x.dtb启动内核。
Step3:使用新制作的ramdisk.img和tq335x.dtb启动内核
将SD插到开发板上,给开发板上电(开发板切换到SD卡启动模式),可以通过按任意键打断内核启动进入u-boot命令模式(由于之前没有配置u-boot的bootcmd环境变量,而默认的u-boot环境无法启动内核,故,开发板上电后不按键的话也会进入u-boot的命令行模式)。
首先是加载内核到DRAM:
-
load mmc 0 ${loadaddr} /boot/zImage
其中,${loadaddr}在u-boot的环境变量中默认指定为0x82000000,这里可以直接打数字。
然后是加载dtb到DRAM:
-
load mmc 0 ${fdtaddr} /boot/tq335x.dtb
${fdtaddr}的默认值是0x88000000。
接下来加载ramdisk到DRAM:
-
load mmc 0 ${rdaddr} /boot/ramdisk.img
${rdaddr}的默认值是0x88080000
最后就是将ramdisk和dtb的加载地址作为参数启动内核:
-
bootz ${loadaddr} ${rdaddr} ${fdtaddr}
至此,Linux内核已经能够正常启动并进入终端模式了。
启动Log如下:
-
Hit any key to stop autoboot: 0
-
U-Boot# load mmc 0 ${fdtaddr} /boot/tq335x.dtb
-
34781 bytes read in 9 ms (3.7 MiB/s)
-
U-Boot# load mmc 0 ${loadaddr} /boot/zImage
-
4377824 bytes read in 242 ms (17.3 MiB/s)
-
U-Boot# load mmc 0 ${rdaddr} /boot/ramdisk.img
-
1120934 bytes read in 68 ms (15.7 MiB/s)
-
U-Boot# bootz ${loadaddr} ${rdaddr} ${fdtaddr}
-
Kernel image @ 0x82000000 [ 0x000000 - 0x42cce0 ]
-
## Loading init Ramdisk from Legacy Image at 88080000 ...
-
Image Name: ramdisk
-
Created: 2014-11-18 15:47:41 UTC
-
Image Type: ARM Linux RAMDisk Image (uncompressed)
-
Data Size: 1120870 Bytes = 1.1 MiB
-
Load Address: 88080000
-
Entry Point: 88080000
-
Verifying Checksum ... OK
-
## Flattened Device Tree blob at 88000000
-
Booting using the fdt blob at 0x88000000
-
Loading Ramdisk to 8feee000, end 8ffffa66 ... OK
-
Loading Device Tree to 8fee2000, end 8feed7dc ... OK
-
-
-
Starting kernel ...
-
-
-
[ 0.000000] Booting Linux on physical CPU 0x0
-
[ 0.000000] Linux version 3.17.2 (lilianrong@AY140721164813287e77Z) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) ) #1 SMP Tue Nov 18 22:49:31 CST 2014
-
[ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d
-
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
-
[ 0.000000] Machine model: TI AM335x EVM
-
[ 0.000000] cma: Reserved 16 MiB at 9e800000
-
[ 0.000000] Memory policy: Data cache writeback
-
[ 0.000000] HighMem zone: 1048574 pages exceeds freesize 0
-
[ 0.000000] CPU: All CPU(s) started in SVC mode.
-
[ 0.000000] AM335X ES2.1 (sgx neon )
-
[ 0.000000] PERCPU: Embedded 9 pages/cpu @dfa9a000 s14336 r8192 d14336 u36864
-
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 129792
-
[ 0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/ram0
-
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
-
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
-
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
-
[ 0.000000] Memory: 483692K/523264K available (5668K kernel code, 647K rwdata, 2208K rodata, 406K init, 8210K bss, 39572K reserved, 0K highmem)
-
[ 0.000000] Virtual kernel memory layout:
-
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
-
[ 0.000000] fixmap : 0xffc00000 - 0xffe00000 (2048 kB)
-
[ 0.000000] vmalloc : 0xe0800000 - 0xff000000 ( 488 MB)
-
[ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB)
-
[ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB)
-
[ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB)
-
[ 0.000000] .text : 0xc0008000 - 0xc07b9478 (7878 kB)
-
[ 0.000000] .init : 0xc07ba000 - 0xc081f800 ( 406 kB)
-
[ 0.000000] .data : 0xc0820000 - 0xc08c1d08 ( 648 kB)
-
[ 0.000000] .bss : 0xc08c1d08 - 0xc10c68e0 (8211 kB)
-
[ 0.000000] Hierarchical RCU implementation.
-
[ 0.000000] RCU restricting CPUs from NR_CPUS=2 to nr_cpu_ids=1.
-
[ 0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
-
[ 0.000000] NR_IRQS:16 nr_irqs:16 16
-
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
-
[ 0.000000] Total of 128 interrupts on 1 active controller
-
[ 0.000000] OMAP clockevent source: timer2 at 24000000 Hz
-
[ 0.000013] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns
-
[ 0.000061] OMAP clocksource: timer1 at 24000000 Hz
-
[ 0.000795] Console: colour dummy device 80x30
-
[ 0.000847] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
-
[ 0.000856] ... MAX_LOCKDEP_SUBCLASSES: 8
-
[ 0.000863] ... MAX_LOCK_DEPTH: 48
-
[ 0.000870] ... MAX_LOCKDEP_KEYS: 8191
-
[ 0.000878] ... CLASSHASH_SIZE: 4096
-
[ 0.000885] ... MAX_LOCKDEP_ENTRIES: 32768
-
[ 0.000892] ... MAX_LOCKDEP_CHAINS: 65536
-
[ 0.000900] ... CHAINHASH_SIZE: 32768
-
[ 0.000907] memory used by lock dependency info: 5167 kB
-
[ 0.000915] per task-struct memory footprint: 1152 bytes
-
[ 0.000956] Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736)
-
[ 0.079037] pid_max: default: 32768 minimum: 301
-
[ 0.079438] Security Framework initialized
-
[ 0.079564] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
-
[ 0.079576] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
-
[ 0.081769] CPU: Testing write buffer coherency: ok
-
[ 0.082962] CPU0: thread -1, cpu 0, socket -1, mpidr 0
-
[ 0.083084] Setting up static identity map for 0x8055f030 - 0x8055f0a0
-
[ 0.086327] Brought up 1 CPUs
-
[ 0.086347] SMP: Total of 1 processors activated.
-
[ 0.086357] CPU: All CPU(s) started in SVC mode.
-
[ 0.088983] devtmpfs: initialized
-
[ 0.097743] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3
-
[ 0.132789] omap_hwmod: tptc0 using broken dt data from edma
-
[ 0.133139] omap_hwmod: tptc1 using broken dt data from edma
-
[ 0.133467] omap_hwmod: tptc2 using broken dt data from edma
-
[ 0.141252] omap_hwmod: debugss: _wait_target_disable failed
-
[ 0.198964] pinctrl core: initialized pinctrl subsystem
-
[ 0.201633] regulator-dummy: no parameters
-
[ 0.231057] NET: Registered protocol family 16
-
[ 0.239540] DMA: preallocated 256 KiB pool for atomic coherent allocations
-
[ 0.241725] cpuidle: using governor ladder
-
[ 0.241754] cpuidle: using governor menu
-
[ 0.253658] OMAP GPIO hardware version 0.1
-
[ 0.268591] omap-gpmc 50000000.gpmc: could not find pctldev for node /pinmux@44e10800/nandflash_pins_s0, deferring probe
-
[ 0.268635] platform 50000000.gpmc: Driver omap-gpmc requests probe deferral
-
[ 0.273243] No ATAGs?
-
[ 0.273274] hw-breakpoint: debug architecture 0x4 unsupported.
-
[ 0.316650] edma-dma-engine edma-dma-engine.0: TI EDMA DMA engine driver
-
[ 0.318001] vbat: 5000 mV
-
[ 0.318774] lis3_reg: no parameters
-
[ 0.322209] SCSI subsystem initialized
-
[ 0.323028] usbcore: registered new interface driver usbfs
-
[ 0.323207] usbcore: registered new interface driver hub
-
[ 0.327009] usbcore: registered new device driver usb
-
[ 0.327877] omap_i2c 44e0b000.i2c: could not find pctldev for node /pinmux@44e10800/pinmux_i2c0_pins, deferring probe
-
[ 0.327917] platform 44e0b000.i2c: Driver omap_i2c requests probe deferral
-
[ 0.327972] omap_i2c 4802a000.i2c: could not find pctldev for node /pinmux@44e10800/pinmux_i2c1_pins, deferring probe
-
[ 0.327995] platform 4802a000.i2c: Driver omap_i2c requests probe deferral
-
[ 0.332363] Switched to clocksource timer1
-
[ 0.477595] NET: Registered protocol family 2
-
[ 0.479415] TCP established hash table entries: 4096 (order: 2, 16384 bytes)
-
[ 0.479601] TCP bind hash table entries: 4096 (order: 5, 147456 bytes)
-
[ 0.480965] TCP: Hash tables configured (established 4096 bind 4096)
-
[ 0.481157] TCP: reno registered
-
[ 0.481186] UDP hash table entries: 256 (order: 2, 20480 bytes)
-
[ 0.481375] UDP-Lite hash table entries: 256 (order: 2, 20480 bytes)
-
[ 0.482657] NET: Registered protocol family 1
-
[ 0.484656] RPC: Registered named UNIX socket transport module.
-
[ 0.484680] RPC: Registered udp transport module.
-
[ 0.484690] RPC: Registered tcp transport module.
-
[ 0.484699] RPC: Registered tcp NFSv4.1 backchannel transport module.
-
[ 0.485566] Trying to unpack rootfs image as initramfs...
-
[ 0.487045] rootfs image is not initramfs (no cpio magic); looks like an initrd
-
[ 0.497016] Freeing initrd memory: 1092K (cfeee000 - cffff000)
-
[ 0.497514] hw perfevents: enabled with armv7_cortex_a8 PMU driver, 5 counters available
-
[ 0.501968] futex hash table entries: 256 (order: 2, 16384 bytes)
-
[ 0.507634] VFS: Disk quotas dquot_6.5.2
-
[ 0.507781] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
-
[ 0.510254] NFS: Registering the id_resolver key type
-
[ 0.510637] Key type id_resolver registered
-
[ 0.510653] Key type id_legacy registered
-
[ 0.510794] jffs2: version 2.2. (NAND) (SUMMARY) 漏 2001-2006 Red Hat, Inc.
-
[ 0.511229] msgmni has been set to 978
-
[ 0.516624] io scheduler noop registered
-
[ 0.516656] io scheduler deadline registered
-
[ 0.516726] io scheduler cfq registered (default)
-
[ 0.519057] pinctrl-single 44e10800.pinmux: 142 pins at pa f9e10800 size 568
-
[ 0.522800] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
-
[ 0.528945] omap_uart 44e09000.serial: no wakeirq for uart0
-
[ 0.529540] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 88, base_baud = 3000000) is a OMAP UART0
-
[ 1.236732] console [ttyO0] enabled
-
[ 1.245368] omap_rng 48310000.rng: OMAP Random Number Generator ver. 20
-
[ 1.277842] brd: module loaded
-
[ 1.297230] loop: module loaded
-
[ 1.303764] mtdoops: mtd device (mtddev=name/number) must be supplied
-
[ 1.313662] usbcore: registered new interface driver asix
-
[ 1.319456] usbcore: registered new interface driver ax88179_178a
-
[ 1.326006] usbcore: registered new interface driver cdc_ether
-
[ 1.332305] usbcore: registered new interface driver smsc95xx
-
[ 1.338427] usbcore: registered new interface driver net1080
-
[ 1.344489] usbcore: registered new interface driver cdc_subset
-
[ 1.350791] usbcore: registered new interface driver zaurus
-
[ 1.356854] usbcore: registered new interface driver cdc_ncm
-
[ 1.364965] usbcore: registered new interface driver cdc_wdm
-
[ 1.371056] usbcore: registered new interface driver usb-storage
-
[ 1.377647] usbcore: registered new interface driver usbtest
-
[ 1.388450] mousedev: PS/2 mouse device common for all mice
-
[ 1.399599] omap_rtc 44e3e000.rtc: rtc core: registered 44e3e000.rtc as rtc0
-
[ 1.407152] 44e3e000.rtc: already running
-
[ 1.411995] i2c /dev entries driver
-
[ 1.415787] Driver for 1-wire Dallas network protocol.
-
[ 1.428670] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec
-
[ 1.438626] omap_hsmmc 48060000.mmc: unable to get vmmc regulator -517
-
[ 1.446110] platform 48060000.mmc: Driver omap_hsmmc requests probe deferral
-
[ 1.454198] ledtrig-cpu: registered to indicate activity on CPUs
-
[ 1.461042] usbcore: registered new interface driver usbhid
-
[ 1.466922] usbhid: USB HID core driver
-
[ 1.472270] oprofile: using arm/armv7
-
[ 1.476763] TCP: cubic registered
-
[ 1.480243] Initializing XFRM netlink socket
-
[ 1.484880] NET: Registered protocol family 17
-
[ 1.489611] NET: Registered protocol family 15
-
[ 1.494616] Key type dns_resolver registered
-
[ 1.499266] omap_voltage_late_init: Voltage driver support not added
-
[ 1.505960] sr_dev_init: No voltage domain specified for smartreflex0. Cannot initialize
-
[ 1.514433] sr_dev_init: No voltage domain specified for smartreflex1. Cannot initialize
-
[ 1.523926] ThumbEE CPU extension supported.
-
[ 1.528444] Registering SWP/SWPB emulation handler
-
[ 1.533522] SmartReflex Class3 initialized
-
[ 1.547402] omap-gpmc 50000000.gpmc: GPMC revision 6.0
-
[ 1.554563] nand: device found, Manufacturer ID: 0xec, Chip ID: 0xd3
-
[ 1.561211] nand: Samsung NAND 1GiB 3,3V 8-bit
-
[ 1.565966] nand: 1024MiB, SLC, page size: 2048, OOB size: 64
-
[ 1.571968] nand: error: CONFIG_MTD_NAND_OMAP_BCH not enabled
-
[ 1.578104] omap2-nand: probe of omap2-nand.0 failed with error -22
-
[ 1.691744] tps65910 0-002d: No interrupt support, no core IRQ
-
[ 1.709178] vrtc: 1800 mV
-
[ 1.712892] vrtc: supplied by vbat
-
[ 1.719981] vio: at 1500 mV
-
[ 1.723353] vio: supplied by vbat
-
[ 1.730169] vdd_mpu: 912 <--> 1312 mV at 1325 mV
-
[ 1.735377] vdd_mpu: supplied by vbat
-
[ 1.742659] vdd_core: 912 <--> 1150 mV at 1137 mV
-
[ 1.747889] vdd_core: supplied by vbat
-
[ 1.754583] vdd3: 5000 mV
-
[ 1.760090] vdig1: at 1800 mV
-
[ 1.763611] vdig1: supplied by vbat
-
[ 1.769998] vdig2: at 1800 mV
-
[ 1.773480] vdig2: supplied by vbat
-
[ 1.779839] vpll: at 1800 mV
-
[ 1.783256] vpll: supplied by vbat
-
[ 1.789576] vdac: at 1800 mV
-
[ 1.792977] vdac: supplied by vbat
-
[ 1.799236] vaux1: at 1800 mV
-
[ 1.802749] vaux1: supplied by vbat
-
[ 1.809109] vaux2: at 3300 mV
-
[ 1.812606] vaux2: supplied by vbat
-
[ 1.818973] vaux33: at 3300 mV
-
[ 1.822579] vaux33: supplied by vbat
-
[ 1.829010] vmmc: 1800 <--> 3300 mV at 3300 mV
-
[ 1.834051] vmmc: supplied by vbat
-
[ 1.840026] vbb: at 3000 mV
-
[ 1.843609] vbb: supplied by vbat
-
[ 1.848858] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz
-
[ 1.862630] omap_i2c 4802a000.i2c: bus 1 rev0.11 at 100 kHz
-
[ 1.972271] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6
-
[ 1.978680] davinci_mdio 4a101000.mdio: detected phy mask ffffffde
-
[ 1.988850] libphy: 4a101000.mdio: probed
-
[ 1.993152] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver unknown
-
[ 2.001513] davinci_mdio 4a101000.mdio: phy[5]: device 4a101000.mdio:05, driver unknown
-
[ 2.011094] cpsw 4a100000.ethernet: Detected MACID = c4:ed:ba:88:b5:e4
-
[ 2.022260] input: volume_keys@0 as /devices/volume_keys@0/input/input0
-
[ 2.032966] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
-
[ 2.041988] sr_init: No PMIC hook to init smartreflex
-
[ 2.047636] sr_init: platform driver register failed for SR
-
[ 2.071187] lis3_reg: disabling
-
[ 2.078305] RAMDISK: gzip image found at block 0
-
[ 2.088654] mmc0: host does not support reading read-only switch. assuming write-enable.
-
[ 2.114634] mmc0: new high speed SDHC card at address aaaa
-
[ 2.124023] mmcblk0: mmc0:aaaa SL16G 14.8 GiB
-
[ 2.145511] mmcblk0:
-
[ 2.264995] VFS: Mounted root (ext2 filesystem) readonly on device 1:0.
-
[ 2.273502] devtmpfs: mounted
-
[ 2.277355] Freeing unused kernel memory: 404K (c07ba000 - c081f000)
-
----------mount all..........
-
----------Starting mdev......
-
-
-
Please press Enter to activate this console.
-
@tq335x #ls
-
HOSTNAME dev lib mnt sbin usr
-
bin etc linuxrc proc sys var
-
boot home lost+found root tmp
(4)小结
到目前为止,已经能够成功启动内核了,接下来我们会在新内核的基础上添加tq335x板载驱动。
本文作者:girlkoo
本文链接:http://blog.csdn.net/girlkoo/article/details/41258583
本文在该文章制作好的rootfs基础上,制作ramdisk。