歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

嵌入式開發制作最小的linux文件系統

要求:編譯器的版本是4.4.6

查看當前交叉編譯器的版本:arm-linux-gcc -v

如果不是4.4.6編譯器,需要修改一下兩個文件:

vim /home/tarena/.bashrc

刪除最後一行:

export PATH = /opt/arm-2009q3...

sudo vim /etc/environment添加4.4.6的支持

最小根文件系統!!!

1.制作自己最小的根文件系統

1.0

把之前解壓的內容徹底刪除

rm busybox-1.19.4 -fr

1.1 解壓busybox源碼

cd/home/tarena/workdir/tools

tar -jxvf busy...

1.2 配置busybox

cd busybox-1.19.4

make menuconfig

Linux Module Utilities --->

[*] Simplified modutils(NEW) //去掉此選項

[*] insmod

[*] rmmod

[*] lsmod

[*] Pretty output

[*] modprobe

[*] Blacklist support

[*] depmod

保存退出

1.3 編譯之前修改Makefile

ARCH = arm //後面無空格(190行)

CROSS_COMPILE = arm-linux- //後面無空格(164行)

1.4 make編譯

1.5 make install //安裝編譯好的busybox

1.6 默認安裝到當前目錄_install目錄

1.7 cd _install //進入安裝目錄

1.8 檢查busybox可執行程序的屬性

file bin/busybox //必須是如下信息,針對ARM架構,否則不對

bin/busybox:ELF 32-bit LSB executable,ARM,version

1(SYSV),dynamically linked(uses

shared libs),stripped

如果不是ARM架構,是intel,需要檢查Makefile是否修改過!

1.9 創建必要的目錄

mkdir dev lib etc proc sys

1.10 創建額外的目錄

mkdir home mnt var tmp root

1.10.1 添加etc/inittab文件,

信息如下:

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

1.11

添加系統基本的配置文件(fstab,profile,rcS)

vim etc/fstab:添加如下信息

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

//tmpfs也是一種虛擬的文件系統,文件系統相關的信息存在內存中

vim etc/profile:暫不添加信息,這裡用來配置系統的全局環境變量

mkdir etc/init.d/

vim etc/init.d/rcS:添加如下信息:

/bin/mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

修改文件權限:chmod 777 rcS

1.12

添加系統的基本庫文件

添加庫的原則:應用程序需要哪些庫,拷貝哪些系統庫到lib下,動態庫在交叉編譯器中。

1.查看busybox可執行程序所需的動態庫

arm-linux-readelf -a bin/busybox | grep “Shared”

0x00000001(NEEDED) Shared library:[libm.so.6]

0x00000001(NEEDED) Shared library:[libx.so.6]

從而得到busybox所需的動態庫是:libm,

libc

2.切記一定要拷貝加載器(動態鏈接庫)到lib(ld-*)

3.所以busybox最終需要三個庫

cp /home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/arm-concenwit-linux-gnueabi/lib/ld-* lib/ -frd //首先拷貝動態鏈接庫,切記一定加-d選項

cp /home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/arm-concenwit-linux-gnueabi/lib/libc* lib/ -frd

//然後把c庫以外的其他動態庫,靜態庫全部刪除,保留一下三個c庫:libc-2.10.1.so

libc.so.6 libc.so

cp /home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/arm-concenwit-linux-gnueabi/lib/libm* lib/ -frd //

把m庫以外的其他動態庫,靜態庫全部刪除,

保留一下三個m庫:libm-2.10.1.so libm.so.6 libm.so

動態庫命名:lib+庫名+.so

1.13 至此最小的根文件制作ok

(3.2M)

1.14測試

mv /opt/rootfs /opt/rootfs_bak //備份之前的根文件系統

cp /home/tarena/workdir/tools/busybox-1.19.4/_install /opt/rootfs -frd //切記不能缺少-d選項(缺少-d 4.×M)

1.15 重啟開發板, 利用NFS進程測試

1.16 修改inittab文件

vim /opt/rootfs/etc/inittab將askfirst修改為respawn,

以後就無需按回車,直接進入shell終端

執行基本的qt需要的庫(庫從arm-linux-gcc中的來) 以後缺少什麼苦基本從這裡來拿

總結:不同的內核、在不同的操作系統(虛擬機或者實體機上面編譯出來)即使都是使用的交叉編譯器,還是不能進行插入驅動模塊,因為編譯的時候會使用gcc進行編譯的,不同的操作系統上面使用的gcc不一樣,還有使用的qt進行編譯的時候需要哪些的動態庫則編譯哪些,有些從arm-linux中來,有些從自己的qt源碼中進行自己編譯之後再放在qt庫中,不同的庫放置之後需要進行環境變量的配置,總之:

在不同的環境下,即使都是ubunt,都需要對從新編譯對應的源碼。

ds18b20_drv: version magic '2.6.35.7-EmbedSky preempt mod_unload ARMv7 ' should be '2.6.35.7-Concenwit preempt mod_unload ARMv7 '

led_drv: version magic '2.6.35.7-EmbedSky preempt mod_unload ARMv7 ' should be '2.6.35.7-Concenwit preempt mod_unload ARMv7 '

at24c02_drv: version magic '2.6.35.7-EmbedSky preempt mod_unload ARMv7 ' should be '2.6.35.7-Concenwit preempt mod_unload ARMv7 '

beep_drv: version magic '2.6.35.7-EmbedSky preempt mod_unload ARMv7 ' should be '2.6.35.7-Concenwit preempt mod_unload ARMv7 '

beep_dev: version magic '2.6.35.7-EmbedSky preempt mod_unload ARMv7 ' should be '2.6.35.7-Concenwit preempt mod_unload ARMv7 '

insmod: can't insert '/home/drivers/ds18b20_drv.ko': invalid module format

insmod: can't insert '/home/drivers/led_drv.ko': invalid module format

insmod: can't insert '/home/drivers/at24c02_drv.ko': invalid module format

insmod: can't insert '/home/drivers/beep_drv.ko': invalid module format

insmod: can't insert '/home/drivers/beep_dev.ko': invalid module format

使用的內核不一樣,造成加載驅動與內核的版本不符合。

Copyright © Linux教程網 All Rights Reserved