天天看點

pcDuino + busybox 成功搭建最小linux系統

經過一周的嘗試,我的pcduino mini linux系統跑起來了。下面可以專心做驅動開發,以及移植自己的Android系統。

準備一張tf卡,我用的1G Kingstorm。準備檔案:sunxi-spl.bin、u-boot.bin、script.bin、uImage、boot.scr、uEnv.txt、rootfs

linux最小系統制作過程(詳細過程見linux移植一二三)如下:

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ ls /dev/sdb

sdb   sdb1 

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo sfdisk -R /dev/sdb

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo cat <<EOT | sudo sfdisk --in-order -uM /dev/sdb

> 1,16,c

> ,,L

> EOT

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo mkfs.vfat /dev/sdb1

mkfs.vfat 3.0.7 (24 Dec 2009)

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo mkfs.ext4 /dev/sdb2

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo dd if=u-boot.bin of=/dev/sdb bs=1024 seek=32

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo mount /dev/sdb1 /mnt/

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo cp ../linux-sunxi-sunxi-3.0/arch/arm/boot/uImage /mnt/

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo cp ../sunxi-tools-master/script.bin /mnt/

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo cp ../boot.scr /mnt/

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo cp ../uEnv.txt /mnt/

[email protected]:~/Si/A10/pcduino/u-boot-sunxi-sunxi$ sudo umount /dev/sdb1

/dev/sdb1 最後包括檔案:script.bin、uImage、boot.scr、uEnv.txt

[email protected]:~/Si/A10/pcduino$ sudo umount /dev/sdb2

[email protected]:~/Si/A10/pcduino$ sudo mount /dev/sdc2 /mnt/

[email protected]:~/Si/A10/pcduino$ sudo cp -pR rootfs/* /mnt/ -d

[email protected]:~/Si/A10/pcduino$ sudo umount /dev/sdc2

/dev/sdb2 最後包括rootfs中是以檔案,如下:

bin  dev  etc  home  lib  linuxrc  mnt  proc  run  sbin  sys  tmp  usr  var

最後取下tf卡,插到pcDuino,設定序列槽115200 8 n 1,單闆預設從tf卡啟動。

啟動界面如下:

U-Boot 2012.10 (Apr 19 2013 - 18:46:44) Allwinner Technology

CPU:   SUNXI Family

Board: pcDuino

I2C:   ready

DRAM:  1 GiB

MMC:   SUNXI SD/MMC: 0

*** Warning - bad CRC, using default environment

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0 

reading uEnv.txt

144 bytes read

Loaded environment from uEnv.txt

reading boot.scr

289 bytes read

Jumping to boot.scr

## Executing script at 44000000

Wrong image format for "source" command

reading script.bin

44900 bytes read

reading uImage

4693132 bytes read

## Booting kernel from Legacy Image at 48000000 ...

   Image Name:   Linux-3.0.62

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    4693068 Bytes = 4.5 MiB

   Load Address: 40008000

   Entry Point:  40008000

   Verifying Checksum ... OK

   Loading Kernel Image ... OK

OK

Starting kernel ...

<6>Initializing cgroup subsys cpuset

<5>Linux version 3.0.62 ([email protected]) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #1 PREEMPT Sat Apr 20 18:32:39 CST 2013

CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d

CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache

Machine: sun4i

<6>Memory cut off:

<6>     MALI : 0x5c000000 - 0x5fffffff  (  64 MB)

<4>Ignoring unrecognised tag 0x00000000

<6>Memory Reserved:

<6>     SYS  : 0x43000000 - 0x4300ffff  (  64 kB)

<6>     VE   : 0x44000000 - 0x48ffffff  (  80 MB)

<6>     G2D  : 0x49000000 - 0x49ffffff  (  16 MB)

<6>     LCD  : 0x5a000000 - 0x5bffffff  (  32 MB)

Memory policy: ECC disabled, Data cache writeback

<6>chip-id: A10 (AW1623 revision C)

<7>On node 0 totalpages: 245760

<7>free_area_init_node: node 0, pgdat c0887ea0, node_mem_map c094e000

<7>  Normal zone: 1280 pages used for memmap

<7>  Normal zone: 0 pages reserved

<7>  Normal zone: 146176 pages, LIFO batch:31

<7>  HighMem zone: 768 pages used for memmap

<7>  HighMem zone: 97536 pages, LIFO batch:31

<7>pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768

<7>pcpu-alloc: [0] 0 

Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 243712

<5>Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait loglevel=8 panic=10

<6>PID hash table entries: 4096 (order: 2, 16384 bytes)

<6>Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)

<6>Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)

<6>Memory: 448MB 512MB = 960MB total

<5>Memory: 833852k/833852k available, 149188k reserved, 393216K highmem

<5>Virtual kernel memory layout:

    vector  : 0xffff0000 - 0xffff1000   (   4 kB)

    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)

........//太長了,省略若幹

<6>mmc0: new high speed SD card at address 1234

[    4.140000] mmc0: new high speed SD card at address 1234

<6>mmcblk0: mmc0:1234 SA01G 942 MiB 

[    4.160000] mmcblk0: mmc0:1234 SA01G 942 MiB 

<6> mmcblk0: p1 p2

[    4.170000]  mmcblk0: p1 p2

<6>Console: switching to colour frame buffer device 160x45

[    4.290000] Console: switching to colour frame buffer device 160x45

<4>regulator_init_complete: axp20_buck3: incomplete constraints, leaving on

[    4.330000] regulator_init_complete: axp20_buck3: incomplete constraints, leaving on

<4>regulator_init_complete: axp20_buck2: incomplete constraints, leaving on

[    4.350000] regulator_init_complete: axp20_buck2: incomplete constraints, leaving on

<4>regulator_init_complete: axp20_ldo4: incomplete constraints, leaving on

[    4.360000] regulator_init_complete: axp20_ldo4: incomplete constraints, leaving on

<4>regulator_init_complete: axp20_ldo3: incomplete constraints, leaving on

[    4.380000] regulator_init_complete: axp20_ldo3: incomplete constraints, leaving on

<4>regulator_init_complete: axp20_ldo2: incomplete constraints, leaving on

[    4.390000] regulator_init_complete: axp20_ldo2: incomplete constraints, leaving on

<4>regulator_init_complete: axp20_ldo1: incomplete constraints, leaving on

[    4.410000] regulator_init_complete: axp20_ldo1: incomplete constraints, leaving on

<6>sunxi-rtc sunxi-rtc: sunxi_rtc_gettime

[    4.420000] sunxi-rtc sunxi-rtc: sunxi_rtc_gettime

<6>sunxi-rtc sunxi-rtc: read time 2010-1-1 0:0:10

[    4.430000] sunxi-rtc sunxi-rtc: read time 2010-1-1 0:0:10

<6>sunxi-rtc sunxi-rtc: setting system clock to 2010-01-01 00:00:10 UTC (1262304010)

[    4.440000] sunxi-rtc sunxi-rtc: setting system clock to 2010-01-01 00:00:10 UTC (1262304010)

<3>EXT3-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (240)

[    4.460000] EXT3-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (240)

<3>EXT2-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (244)

[    4.480000] EXT2-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (244)

<6>EXT4-fs (mmcblk0p2): recovery complete

[    5.840000] EXT4-fs (mmcblk0p2): recovery complete

<6>EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)

[    6.060000] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)

<6>VFS: Mounted root (ext4 filesystem) on device 179:2.

[    6.080000] VFS: Mounted root (ext4 filesystem) on device 179:2.

<6>devtmpfs: mounted

[    6.090000] devtmpfs: mounted

<6>Freeing init memory: 164K

[    6.090000] Freeing init memory: 164K

mount: mounting devpts on /dev/pts failed: No such file or directory

mount: mounting /dev/mmcblk0p1 on /boot failed: No such file or directory

Please press Enter to activate this console. 

Processing /etc/profile... Done

/ # ls

bin         home        lost+found  run         tmp

dev         lib         mnt         sbin        usr

etc         linuxrc     proc        sys         var

/ # ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 12:5B:BD:7D:C4:75  

          BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000 

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

          Interrupt:55 Base address:0x8000 

/ # ifconfig eth0 172.16.1.133

<4>wemac wemac.0: WARNING: no IRQ resource flags set.

[ 2360.950000] wemac wemac.0: WARNING: no IRQ resource flags set.

<6>wemac wemac.0: eth0: link down

[ 2361.060000] wemac wemac.0: eth0: link down

<6>ADDRCONF(NETDEV_UP): eth0: link is not ready

[ 2361.070000] ADDRCONF(NETDEV_UP): eth0: link is not ready

/ # 

詳細移植過程見linux移植一、二、三。花了不少時間啊,這是移植心得。pcduino linux移植期間遇到了不少問題,總結如下:

1.pkg-config可以解決明明在自己機器上編譯好好的,在别人電腦上編譯就不行問題,它能為已安裝的庫時提供統一接口。了解pkg-config解決Package libusb-1.0 was not found in the pkg-config search path

2.用busybox制作檔案系統時,要注意檔案的屬性。包括動态連結、執行權限等。通過sudo cp -pR file1 file2 -d,保留檔案屬性,否則系統跑步起來。

cp指令選項含義如下:

- a 該選項通常在拷貝目錄時使用。它保留連結、檔案屬性,并遞歸地拷貝目錄,其作用等于dpR選項的組合。

- d 拷貝時保留連結。

- f 删除已經存在的目标檔案而不提示。

- i 和f選項相反,在覆寫目标檔案之前将給出提示要求使用者确認。回答y時目标檔案将被覆寫,是互動式拷貝。

- p 此時cp除複制源檔案的内容外,還将把其修改時間和通路權限也複制到新檔案中。

- r 若給出的源檔案是一目錄檔案,此時cp将遞歸複制該目錄下所有的子目錄和檔案。此時目标檔案必須為一個目錄名。

- l 不作拷貝,隻是連結檔案。

3.ubuntu下燒寫tf卡指令,這裡容易出問題,發現雜牌子的tf卡就不行,卡了一段時間,最後果斷Kingstorm

4.Kernel panic - not syncing: No init found.  Try passing init= option to kernel,這個問題說了找不到init,而我設定init=/sbin/init,顯然沒問題。原因何在呢?

[email protected]hange:~/Si/A10/pcduino/rootfs$ ls sbin/ -l

lrwxrwxrwx 1 change change 14 2013-04-28 21:16 init -> ../bin/busybox

[email protected]:~/Si/A10/pcduino/rootfs$ file linuxrc 

linuxrc: symbolic link to `bin/busybox'

發現bin/busybox是一個動态連結庫檔案,依賴交叉編譯鍊的相應庫。而交叉編譯鍊庫有很多,試了發現../arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/和 /home/change/tools/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/ 下的*.so*庫可以使用。

還有拷貝後linuxrc有1.9M左右,如果拷貝時沒加 -d選項,拷貝後隻有0位元組,啟動時也會出現上面問題。

繼續閱讀