嵌入式linux與物聯網進階之路二:基於荔枝派nano的linux內核編譯

前言

之前我們成功的將U-Boot進行了編譯和移植,這章主要講解linux內核的編譯和移植。

說道linux內核,我便會想起linus這個人,拜他所賜,使得全世界擁有了這麼個操作系統。同時由於目前硬件設備的急劇成熟化和規模化,使得在一塊不到30塊錢的設備上運行移植過的linux也不是什麼難事兒了。所以在後面的物聯網發展道路上,linux註定會一路高歌。

作爲linux的喜好者,我向來不吝嗇把自己的讚美送給這個已經比自己年紀還大的操作系統。不僅僅因爲他的便捷移植性,更因爲他的開源,以及由開源所體現出來的各種合作精神。相信擁抱過開源後的人,一定也會成爲開源的佈道者,而linux則值得讓我們這樣做。

linux內核編譯

編譯linux內核前,我們需要設置交叉編譯鏈,但是由於第一章中,已經設置好了交叉編譯鏈,所以這裏無需重複設置。而linux內核的下載,可以在這裏進行:

git clone https://github.com/Icenowy/linux.git -b f1c100s-480272lcd-test

下載下來後,傳到虛擬機上解壓。

之後,我們需要進入到linux內核目錄來配置menuconfig,命令如下:

make ARCH=arm menuconfig

 這條命令執行後會打開linux內核裁剪的menuconfig,這裏我們可以根據自己的需要進行特性的裁剪。選擇好後,保存之後,會在源碼根目錄下將我們的配置寫入到.config文件中備用。需要說明的是,由於荔枝派nano這裏已經爲我們配置好了.config,所以我們直接點擊鏈接下載,並將此.config文件拷貝到源碼根目錄即可。

之後,我們就開始進行正式的編譯流程了,在根目錄中執行如下命令:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16

 此時屏幕會進行輸出,開始進行正式的編譯流程。期間可能會遇到若干問題,目前通過百度基本上都可以解決。

比如,編譯過程中我遇到的一個問題,記錄在了挖坑網上,通過百度,修改源碼後得以解決,這裏我不準備貼具體的錯誤信息了,大家可以點開自行翻閱。

漫長的等待,一般需要30分鐘左右的編譯時間,看到如下的結果,就代表編譯成功了:

image

zImage is ready 代表着linux內核編譯成功,並且已經生成到了/arch/arm/boot/目錄下,我們接下來只需要將其拷貝到第一分區中即可。

製作分區

由於這裏我們還沒有製作分區,這裏需要製作一下,總共需要製作兩個分區,其中zImage文件和dtb設備樹文件放到第一個分區,而根文件系統rootfs.tar需要放到第二個分區。

首先,利用命令打開gparted工具,然後分別創建第一個,第二個分區,第一個分區爲fat16格式,給16mb大小,第二個分區爲ext4格式,給4gb大小:

 

 

分區點好後,點擊上面的對勾,即可把兩個分區正確的做出來了。從圖上,我們可以看出,第一分區爲/dev/sdb1, 第二分區爲/dev/sdb2.

進入到zImage所在的目錄(arch/arm/boot),然後執行如下命令,將其拷貝到第一分區(由於sdb沒法直接訪問,需要先掛載,才能訪問):

sudo mkdir /mnt/sdb1                      //創建一個臨時目錄
sudo mount /dev/sdb1 /mnt/sdb1            //將sdb1掛載到此臨時目錄
sudo cp zImage  /mnt/sdb1                 //拷貝到sdb1中,此時sdb1中已經能看到文件
sudo sync
sudo umount /dev/sdb1

設備樹文件

之後進入目錄/linux-mi/linux-f1c100s-480272lcd-test/arch/arm/boot/dts中,可以看到存在着suniv-f1c100s-licheepi-nano.dts文件,我們使用如下命令對其進行修改:

nano suniv-f1c100s-licheepi-nano.dts

整體的修改方法,這裏有提示,我們可以按照我們的需求進行更改,改完之後保存,然後利用如下命令進行編譯:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j16

編譯完畢,會在當前目錄生成suniv-f1c100s-licheepi-nano.dtb文件,將此文件也拷貝到第一分區即可,命令如下:

sudo mkdir /mnt/sdb1              //創建一個臨時目錄
sudo mount /dev/sdb1 /mnt/sdb1    //將sdb1掛載到此臨時目錄
sudo cp suniv-f1c100s-licheepi-nano.dtb /mnt/sdb1   //拷貝到sdb1中,此時sdb1中已經能看到文件
sudo sync
sudo umount /dev/sdb1

整體操作完畢後,可以看到倆文件都拷貝到第一分區來了:

需要注意的是,如果執行umount操作,提示busy:umount: /mnt/sdb2: target is busy.,無法卸載的時候,可以嘗試將當前cmd窗口關閉,然後在新窗口中進行umount即可,或者退出當前/mnt目錄。

將卡插入荔枝派nano,得到的輸出結果如下:

[    7.408921] Reboot failed -- System halted

U-Boot SPL 2018.01 (Jun 07 2021 - 14:56:21)
DRAM: 32 MiB
Trying to boot from MMC1


U-Boot 2018.01 (Jun 07 2021 - 14:56:21 -0700) Allwinner Technology

CPU:   Allwinner F Series (SUNIV)
Model: Lichee Pi Nano
DRAM:  32 MiB
MMC:   SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment

In:    serial@1c25000
Out:   serial@1c25000
Err:   serial@1c25000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0 
reading zImage
3844528 bytes read in 200 ms (18.3 MiB/s)
reading suniv-f1c100s-licheepi-nano.dtb
7583 bytes read in 25 ms (295.9 KiB/s)
## Flattened Device Tree blob at 83000000
   Booting using the fdt blob at 0x83000000
   Loading Device Tree to 816fb000, end 816ffd9e ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.15.0-rc8-licheepi-nano (scy@ubuntu) (gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08)) #11
[    0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
[    0.000000] CPU: VIVT data cache, VIVT instruction cache
[    0.000000] OF: fdt: Machine model: Lichee Pi Nano
[    0.000000] Memory policy: Data cache writeback
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 8128
[    0.000000] Kernel command line: console=ttyS0,115200 panic=5 root=/dev/mmcblk0p2 rootwait rw 
[    0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Memory: 22684K/32768K available (6144K kernel code, 236K rwdata, 1388K rodata, 1024K init, 244K bss, 10084K )
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xc2800000 - 0xff800000   ( 976 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xc2000000   (  32 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .text : 0x(ptrval) - 0x(ptrval)   (7136 kB)
[    0.000000]       .init : 0x(ptrval) - 0x(ptrval)   (1024 kB)
[    0.000000]       .data : 0x(ptrval) - 0x(ptrval)   ( 237 kB)
[    0.000000]        .bss : 0x(ptrval) - 0x(ptrval)   ( 245 kB)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000046] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
[    0.000109] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000614] Console: colour dummy device 80x30
[    0.000703] Calibrating delay loop... 203.16 BogoMIPS (lpj=1015808)
[    0.070226] pid_max: default: 32768 minimum: 301
[    0.070532] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.070571] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.072012] CPU: Testing write buffer coherency: ok
[    0.073656] Setting up static identity map for 0x80100000 - 0x80100058
[    0.076119] devtmpfs: initialized
[    0.082271] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.082333] futex hash table entries: 256 (order: -1, 3072 bytes)
[    0.082588] pinctrl core: initialized pinctrl subsystem
[    0.084455] random: get_random_u32 called from bucket_table_alloc+0x80/0x1bc with crng_init=0
[    0.084696] NET: Registered protocol family 16
[    0.085971] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.087791] cpuidle: using governor menu
[    0.113370] SCSI subsystem initialized
[    0.113698] usbcore: registered new interface driver usbfs
[    0.113843] usbcore: registered new interface driver hub
[    0.114051] usbcore: registered new device driver usb
[    0.114483] pps_core: LinuxPPS API ver. 1 registered
[    0.114508] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <[email protected]>
[    0.114567] PTP clock support registered
[    0.115019] Advanced Linux Sound Architecture Driver Initialized.
[    0.115884] random: fast init done
[    0.116479] clocksource: Switched to clocksource timer
[    0.142440] NET: Registered protocol family 2
[    0.143849] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[    0.143924] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[    0.143975] TCP: Hash tables configured (established 1024 bind 1024)
[    0.144244] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.144301] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.144764] NET: Registered protocol family 1
[    0.145966] RPC: Registered named UNIX socket transport module.
[    0.146008] RPC: Registered udp transport module.
[    0.146025] RPC: Registered tcp transport module.
[    0.146041] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.148277] NetWinder Floating Point Emulator V0.97 (double precision)
[    0.150120] Initialise system trusted keyrings
[    0.150651] workingset: timestamp_bits=30 max_order=13 bucket_order=0
[    0.168147] NFS: Registering the id_resolver key type
[    0.168228] Key type id_resolver registered
[    0.168250] Key type id_legacy registered
[    0.181411] Key type asymmetric registered
[    0.181450] Asymmetric key parser 'x509' registered
[    0.181647] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.181683] io scheduler noop registered
[    0.181702] io scheduler deadline registered
[    0.182448] io scheduler cfq registered (default)
[    0.182483] io scheduler mq-deadline registered
[    0.182503] io scheduler kyber registered
[    0.183580] sun4i-usb-phy 1c13400.phy: Couldn't request ID GPIO
[    0.193407] suniv-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[    0.360992] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[    0.367696] console [ttyS0] disabled
[    0.387937] 1c25000.serial: ttyS0 at MMIO 0x1c25000 (irq = 23, base_baud = 6250000) is a 16550A
[    0.862083] console [ttyS0] enabled
[    0.872528] panel-simple panel: panel supply power not found, using dummy regulator
[    0.881892] SCSI Media Changer driver v0.25 
[    0.889643] m25p80 spi0.0: unrecognized JEDEC id bytes: 0b, 40, 18
[    0.896382] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    0.903033] ehci-platform: EHCI generic platform driver
[    0.908590] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    0.914814] ohci-platform: OHCI generic platform driver
[    0.920498] usbcore: registered new interface driver usb-storage
[    0.927511] udc-core: couldn't find an available UDC - added [g_cdc] to list of pending drivers
[    0.936453] i2c /dev entries driver
[    0.996612] sunxi-mmc 1c0f000.mmc: base:0x(ptrval) irq:19
[    1.004004] usbcore: registered new interface driver usbhid
[    1.009706] usbhid: USB HID core driver
[    1.031574] NET: Registered protocol family 17
[    1.036270] Key type dns_resolver registered
[    1.042881] Loading compiled-in X.509 certificates
[    1.059259] sun4i-drm display-engine: bound 1e60000.display-backend (ops 0xc07394f8)
[    1.068148] sun4i-drm display-engine: bound 1c0c000.lcd-controller (ops 0xc07387dc)
[    1.075813] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    1.082532] [drm] No driver support for vblank timestamp query.
[    1.138992] Console: switching to colour frame buffer device 60x34
[    1.142223] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.145893] mmc0: new high speed SDXC card at address aaaa
[    1.147151] mmcblk0: mmc0:aaaa SN64G 59.5 GiB 
[    1.162578]  mmcblk0: p1 p2
[    1.185816] sun4i-drm display-engine: fb0:  frame buffer device
[    1.193003] [drm] Initialized sun4i-drm 1.0.0 20150629 for display-engine on minor 0
[    1.202242] usb_phy_generic usb_phy_generic.0.auto: usb_phy_generic.0.auto supply vcc not found, using dummy regulator
[    1.214157] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[    1.220133] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 1
[    1.230248] hub 1-0:1.0: USB hub found
[    1.234246] hub 1-0:1.0: 1 port detected
[    1.239923] using random self ethernet address
[    1.244392] using random host ethernet address
[    1.250846] usb0: HOST MAC da:9f:cf:9e:80:f1
[    1.255224] usb0: MAC 52:86:68:f9:fd:1b
[    1.259282] g_cdc gadget: CDC Composite Gadget, version: King Kamehameha Day 2008
[    1.266828] g_cdc gadget: g_cdc ready
[    1.271378] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    1.289660] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    1.296407] ALSA device list:
[    1.299516]   #0: Loopback 1
[    1.303359] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    1.312086] cfg80211: failed to load regulatory.db
[    1.318923] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
[    1.339949] EXT4-fs (mmcblk0p2): recovery complete
[    1.344794] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    1.353177] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    1.360977] devtmpfs: error mounting -2
[    1.369651] Freeing unused kernel memory: 1024K
[    1.374418] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentat.
[    1.388565] CPU: 0 PID: 1 Comm: swapper Not tainted 4.15.0-rc8-licheepi-nano #1
[    1.395851] Hardware name: Allwinner suniv Family
[    1.400640] [<c010e73c>] (unwind_backtrace) from [<c010b8a8>] (show_stack+0x10/0x14)
[    1.408395] [<c010b8a8>] (show_stack) from [<c01168d8>] (panic+0xb8/0x230)
[    1.415275] [<c01168d8>] (panic) from [<c0656d6c>] (kernel_init+0xd4/0x10c)
[    1.422238] [<c0656d6c>] (kernel_init) from [<c0107f60>] (ret_from_fork+0x14/0x34)
[    1.429800] Rebooting in 5 seconds..
[    7.409034] Reboot failed -- System halted

可以看到,成功進入了內核,由於沒有根文件系統,所以系統暫停了,接下來一章,我們就來講解如何製作根文件系統。

參考

http://nano.lichee.pro/build_sys/kernel.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章