嵌入式開發(fā)制作最小的linux文件系統(tǒng)
要求:編譯器的版本是4.4.6
?
查看當(dāng)前交叉編譯器的版本:arm-linux-gcc -v
?
如果不是4.4.6編譯器,需要修改一下兩個(gè)文件:
?
vim /home/tarena/.bashrc
?
刪除最后一行:
export PATH = /opt/arm-2009q3...
?
sudo vim /etc/environment添加4.4.6的支持
?
最小根文件系統(tǒng)?。?!
?
1.制作自己最小的根文件系統(tǒng)
1.0
把之前解壓的內(nèi)容徹底刪除 ?
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) ?//去掉此選項(xiàng)
?
[*] 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 默認(rèn)安裝到當(dāng)前目錄_install目錄
?
1.7 cd _install ???//進(jìn)入安裝目錄
?
1.8 檢查busybox可執(zhí)行程序的屬性
file bin/busybox ??//必須是如下信息,針對(duì)ARM架構(gòu),否則不對(duì)
bin/busybox:ELF 32-bit LSB executable,ARM,version 1(SYSV),dynamically linked(uses shared libs),stripped
如果不是ARM架構(gòu),是intel,需要檢查Makefile是否修改過!
?
1.9 創(chuàng)建必要的目錄
mkdir dev lib etc proc sys
?
1.10 創(chuàng)建額外的目錄
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
添加系統(tǒng)基本的配置文件(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也是一種虛擬的文件系統(tǒng),文件系統(tǒng)相關(guān)的信息存在內(nèi)存中
?
vim etc/profile:暫不添加信息,這里用來配置系統(tǒng)的全局環(huán)境變量
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
?
修改文件權(quán)限:chmod 777 rcS
?
1.12
添加系統(tǒng)的基本庫文件
添加庫的原則:應(yīng)用程序需要哪些庫,拷貝哪些系統(tǒng)庫到lib下,動(dòng)態(tài)庫在交叉編譯器中。
1.查看busybox可執(zhí)行程序所需的動(dòng)態(tài)庫
arm-linux-readelf -a bin/busybox | grep “Shared”
?
0x00000001(NEEDED) ???????Shared library:[libm.so.6]
?
0x00000001(NEEDED) ???????Shared library:[libx.so.6]
從而得到busybox所需的動(dòng)態(tài)庫是:libm, libc
2.切記一定要拷貝加載器(動(dòng)態(tài)鏈接庫)到lib(ld-*)
3.所以busybox最終需要三個(gè)庫
cp /home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/arm-concenwit-linux-gnueabi/lib/ld-* lib/ -frd //首先拷貝動(dòng)態(tài)鏈接庫,切記一定加-d選項(xiàng)
cp /home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/arm-concenwit-linux-gnueabi/lib/libc* lib/ -frd
//然后把c庫以外的其他動(dòng)態(tài)庫,靜態(tài)庫全部刪除,保留一下三個(gè)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庫以外的其他動(dòng)態(tài)庫,靜態(tài)庫全部刪除,
保留一下三個(gè)m庫:libm-2.10.1.so libm.so.6 libm.so
動(dòng)態(tài)庫命名:lib+庫名+.so
?
1.13 至此最小的根文件制作ok (3.2M)
?
1.14測試
mv /opt/rootfs ?/opt/rootfs_bak ??//備份之前的根文件系統(tǒng)
cp /home/tarena/workdir/tools/busybox-1.19.4/_install ?/opt/rootfs -frd ??//切記不能缺少-d選項(xiàng)(缺少-d 4.×M)
?
1.15 重啟開發(fā)板, 利用NFS進(jìn)程測試
?
1.16 修改inittab文件
vim /opt/rootfs/etc/inittab將askfirst修改為respawn,
以后就無需按回車,直接進(jìn)入shell終端
?
執(zhí)行基本的qt需要的庫(庫從arm-linux-gcc中的來) 以后缺少什么苦基本從這里來拿
?
?
總結(jié):不同的內(nèi)核、在不同的操作系統(tǒng)(虛擬機(jī)或者實(shí)體機(jī)上面編譯出來)即使都是使用的交叉編譯器,還是不能進(jìn)行插入驅(qū)動(dòng)模塊,因?yàn)榫幾g的時(shí)候會(huì)使用gcc進(jìn)行編譯的,不同的操作系統(tǒng)上面使用的gcc不一樣,還有使用的qt進(jìn)行編譯的時(shí)候需要哪些的動(dòng)態(tài)庫則編譯哪些,有些從arm-linux中來,有些從自己的qt源碼中進(jìn)行自己編譯之后再放在qt庫中,不同的庫放置之后需要進(jìn)行環(huán)境變量的配置,總之: 在不同的環(huán)境下,即使都是ubunt,都需要對(duì)從新編譯對(duì)應(yīng)的源碼。
?
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
?
使用的內(nèi)核不一樣,造成加載驅(qū)動(dòng)與內(nèi)核的版本不符合。