一、QEMU環(huán)境配置
一、QEMU環(huán)境配置
? 1、搭建嵌入式開發(fā)基本環(huán)境
? 2、QEMU安裝及A9開發(fā)板配置介紹
? 3、編譯、運行Linux內(nèi)核
? 4、使用BusyBox制作根文件系統(tǒng)
? 5、使用U-boot引導啟動Linux內(nèi)核
? 6、掛載NFS文件系統(tǒng)
? 7、在虛擬開發(fā)板上開發(fā)應用程序、驅(qū)動示例
1、搭建嵌入式開發(fā)基本環(huán)境
? 1.1、Vmware+Ubuntu16.04
? 1.2、Vmwaretools
? 1.3、更新軟件源
? 1.4、安裝uboot-tools
? 1.5、代碼編輯管理工具:Git/vim
? 1.6、交叉編譯器:gcc-arm-linux-gnueabi
? 1.7、其他
虛擬機使用vmware player
推薦使用Ubuntu16.04
1、Ubuntu16.04是LTS(Long Term Support)長期Support版本
2、軟件包豐富,可以默認安裝arm-gcc編輯器
安裝vmware-tools:跟主機之間拷貝文件
安裝
1、直接把WMwareTools拷貝出來到桌面吧
2、然后打開終端解壓 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz
3、進入解壓后的目錄,執(zhí)行:sudo ./wmware-install.pl 然后就一直回車了。
? Ubuntu采用集中式的軟件倉庫機制,將軟件包分類存在軟件倉
庫中,進行管理。軟件倉庫放置在各種鏡像服務器中,對于用
戶來說,當使用apt-get install安裝軟件包時,會從這些服務器
下載軟件包,這些鏡像服務器就是 軟件源(Reposity).
? 執(zhí)行apt update,程序分析/etc/apt/source.list
? 自動聯(lián)網(wǎng)尋找list中對應的Packages/Sources/Release列表文件,
如果有更新則重新下載之,存入存入/var/lib/apt/lists/目錄
? 然后apt install相應的包,下載到本地并進行安裝
? /var/lib/dpkg/available:軟件包的描述信息,軟件源中所有軟
件包中的信息,包括安裝和未安裝的軟件包
? /var/cache/apt/archives:當apt install安裝軟件包的臨時存放路
徑
? /etc/apt/sources.list:文件里是軟件源站點,apt install時,
Ubuntu會從這些站點下載軟件包到本地并進行安裝
? /var/lib/apt/lists:使用apt update命令會從/etc/apt/sources.list
中下載軟件包列表索引,并保存到該目錄
備份系統(tǒng)本身源文件
cp /etc/apt/sources.list /etc/apt/sources.list.backup
1
修改源文件內(nèi)容,將新的源地址寫入該文件中
//先安裝vim:apt-get insatll vim vim /etc/apt/sources.list
1
2
保存文件,并刷新配置
apt update
1
? 工具介紹
? 用來生成適應U-boot引導的鏡像文件格式
$ apt install u-boot-tools
1
apt install git apt install tree
1
2
初始化倉庫: git init
git add name //上傳
git status //看修改
git log
提交:先設置郵箱和名字
什么是交叉編譯?
? 在一種計算機環(huán)境中編譯程序,在另外一種環(huán)境下運行。或者說在一個平臺上編譯生成在另一個平臺上運行的可執(zhí)行代碼。
什么是ABI和EABI
? ABI: 二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture) 在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統(tǒng)之間或其他應用程序的低級接口. 涵蓋了數(shù)據(jù)類型的大小、布局和對齊,調(diào)用約定
? EABI: 嵌入式ABI
嵌入式應用二進制接口指定了文件格式、數(shù)據(jù)類型、寄存器使用、堆積組織優(yōu)化和在一個嵌入式軟件中的參數(shù)的標準約定。
? Arm-none-gnueabi-linux比arm-linux-gcc要好,在可移植性、兼容性上面
? 早期u-boot和Linux編譯可能使用的都不是一個arm-linux-gcc版本
安裝
? $ apt install gcc-arm-linux-gnueabi
? $ apt install g++-arm-linux-gnueabi
1、curses庫–libncurses5-dev–游標移動及屏幕的顯示
2、我們在ubuntu上編譯程序,不是說有了gcc就行了,需要先apt-get install build-essential,
這個包提供了很多編譯相關的軟件包,里面有:
dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libdpkg-perl libstdc++6-4.6-dev libtimedate-perl
1
2
3
3、(工具鏈:一般由編譯器、連接器、解釋器和調(diào)試器組成)
gcc-arm-none-eabi是GNU項目下的軟件,是一個面向裸機arm的編譯器
2、QEMU安裝及A9開發(fā)板配置介紹
? $ apt install qemu
? 首先安裝QEMU編譯依賴的包
– apt install zlib1g-dev – apt install libglib2.0-0 libglib2.0-dev – apt install libsdl1.2-dev – apt install libpixman-1-dev libfdt-dev
1
2
3
4
? 下載QEMU源碼:git clone git://git.qemu-project.org/qemu.git
git branch -a
分支 git checkout remotes/origin/stable-2.8 -b stable-2.8
標簽 git tag
? 切換到一個穩(wěn)定版本:git checkout v2.7.0
? 編譯配置:./configure –target-list=arm-softmmu –audio-drv-list=
? 編譯安裝:make ; make install
查看qemu 支持的開發(fā)板子
qemu-system-arm -M help
1
3、編譯、運行Linux內(nèi)核
– www.kernel.org
– git clone
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/
? ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
? 編譯內(nèi)核、模塊、dtb文件
? makevexpressdefconfig;makezImage?
m
a
k
e
v
e
x
p
r
e
s
s
d
e
f
c
o
n
f
i
g
;
m
a
k
e
z
I
m
a
g
e
?
make modules; make dtbs
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”
qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append “rdinit=/linuxrc console=ttyAMA0 loglevel=8” -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb
4、使用busybox制作根文件系統(tǒng)
? 文件系統(tǒng)
? 對存儲設備上的數(shù)據(jù)進行組織的機制
? Linux的哲學:一切皆文件
? 用戶與操作系統(tǒng)進行交互的主要工具:文件系統(tǒng)調(diào)用
? 用戶和底層存儲的接口
? Linux內(nèi)核啟動后第一個掛載的文件系統(tǒng)
? 主要由基本的shell命令、各種庫、字符設備、配置腳本組成
? 提供了根目錄/
? RFS可以放在:nor/nand flash、SD卡、磁盤、網(wǎng)絡空間上
? 下載源代碼:http://www.busybox.net/downloads/
? 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
? 配置:make defconfig ; make menuconfig
? 編譯:make
? 安裝:make install
? mkdirrootfs?
m
k
d
i
r
r
o
o
t
f
s
?
mkdir rootfs/lib
? cp–rinstall/?rootfs?
c
p
–
r
i
n
s
t
a
l
l
/
?
r
o
o
t
f
s
?
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
? mkdir?prootfs/dev/?
m
k
d
i
r
?
p
r
o
o
t
f
s
/
d
e
v
/
?
mknod –m 666 tty1 c 4 1
? mknod–m666tty2c42?
m
k
n
o
d
–
m
666
t
t
y
2
c
4
2
?
mknod –m 666 tty3 c 4 3
? mknod–m666tty4c44?
m
k
n
o
d
–
m
666
t
t
y
4
c
4
4
?
mknod –m 666 console c 5 1
? $ mknod –m 666 null c 1 3
? 生成鏡像:dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
? 格式化為exts文件系統(tǒng):mkfs.ext3 rootfs.ext3
? 將各種文件拷貝到文件系統(tǒng)鏡像中:
? mount?text3rootfs.ext3/mnt/?oloop?
m
o
u
n
t
?
t
e
x
t
3
r
o
o
t
f
s
.
e
x
t
3
/
m
n
t
/
?
o
l
o
o
p
?
cp -r rootfs/* /mnt
? $ umount /mnt
? $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -nographic -append
“root=/dev/mmcblk0 rw console=ttyAMA0” -sd rootfs.ext3
? $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -append “root=/dev/mmcblk0 rw
console=tty0” -sd rootfs.ext3
mkdir etc/init.d
touch etc/init.d/rcS
chmod a+x rcS
vi rcS
5、使用u-boot加載Linux內(nèi)核
? 5.1、嵌入式啟動概述
? 5.2、U-boot編譯
? 5.3、QEMU網(wǎng)絡功能設置
? 5.4、內(nèi)核配置編譯
? 5.5、主機TFTP工具安裝
? 5.6、啟動測試
? 5.7、自動化引導
嵌入式bootloader
? 功能類似于PC的BIOS、硬件檢測是否正常
? 加載操作系統(tǒng)鏡像到RAM
? 設置不同的啟動方式
常見的啟動方式
? NOR/NAND flash啟動
? 從SD卡啟動
? Bootloader從網(wǎng)絡加載Linux內(nèi)核啟動
? 功能類似于Windows的BIOS
? 編譯u-boot
? 下載: http://ftp.denx.de/pub/u-boot/
? 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
? 配置:makevexpressca9x4defconfig?編譯:
m
a
k
e
v
e
x
p
r
e
s
s
c
a
9
x
4
d
e
f
c
o
n
f
i
g
?
編
譯
:
make –j4
? 運行u-boot
? qemu-system-arm -M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M
QEMU網(wǎng)絡功能設置
? 配置QEMU與主機的網(wǎng)絡連接
? 采用橋接(bridge)的網(wǎng)絡連接與Host通信
? 需要主機內(nèi)核tun/tap模塊支持
? 配置
? 主機安裝工具包: apt install uml-utilities bridge-utils
? 創(chuàng)建tun設備文件:/dev/net/tun
? 修改/etc/network/interfaces文件,重啟生效:
? # interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33
? 配置/etc/qemu-ifup、/etc/qemu-ifdown腳本
/etc/qemu-ifup與/etc/qemu-ifdown,是kvm啟動后將網(wǎng)卡在宿主主機上配置的腳本文件,我的archlinux沒有這個腳本自己寫了一個,直接上代碼 /etc/qemu-ifup: #! /bin/sh switch=br0 ifconfig $1 up #ip link set $1 up brctl addif ${switch} $1 /etc/qemu-ifdown: #! /bin/sh switch=br0 brctl delif ${switch} $1 ifconfig $1 down #ip link set $1 down #tunctl -d $1 其中$1是虛擬機傳入的參數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
內(nèi)核配置編譯
? 使用U-boot引導內(nèi)核鏡像
? 需要將內(nèi)核編譯為uImage格式
? 需要指定uImage的加載地址
? 編譯時指定:$ make LOADADDR=0x60003000 uImage -j4
主機TFTP工具安裝
? 安裝主機Host的TFTP
? 1)安裝tftp工具:$ apt-get install tftp-hpa tftpd-hpa xinetd
? 2)修改配置文件: /etc/default/tftpd-hpa
TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/home/tftpboot”
TFTP_ADDRESS=”0.0.0.0:69”
TFTP_OPTIONS=”-l -c -s”
? 3)創(chuàng)建tftp目錄:mkdir/home/tftpboot;chmod777tftpboot?4)重啟tftp服務:
m
k
d
i
r
/
h
o
m
e
/
t
f
t
p
b
o
o
t
;
c
h
m
o
d
777
t
f
t
p
b
o
o
t
?
4
)
重
啟
t
f
t
p
服
務
:
/etc/init.d/tftpd-hpa restart
自動化引導
? 修改include/configs/vexpress_common.h
? #define CONFIG_BOOTCOMMAND \
“tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs ‘root=/dev/mmcblk0 console=tty0’; \
bootm 0x60003000 - 0x60500000; ”
? 配置開發(fā)板、主機IP地址
/Netmask/
196 #define CONFIG_IPADDR 192.168.244.128
197 #define CONFIG_NETMASK 255.255.255.0
198 #define CONFIG_SERVERIP 192.168.244.129
6、掛載NFS文件系統(tǒng)
? 主機HOST支持NFS服務
? 修改bootargs啟動參數(shù)
? ? ? 設置NFS為根文件系統(tǒng)
? ? ? 設置主機NFS文件系統(tǒng)的地址
? 內(nèi)核支持掛載NFS文件系統(tǒng)
安裝
$ apt install nfs-kernel-server
配置NFS
? 在/etc/exports文件中添加:
/work *(rw,sync,no_root_squash,no_subtree_check)
開啟NFS服務
? /etc/init.d/rpcbindrestart?
/
e
t
c
/
i
n
i
t
.
d
/
r
p
c
b
i
n
d
r
e
s
t
a
r
t
?
/etc/init.d/nfs-kernel-server restart
安裝FTP:
sudo apt-get install vsftpd openssh-server nfs-kernel-server portmap
配置 FTP 服務
修改 vsftpd 的配置文件/etc/vsftpd.conf,將下面兩行前面的“#”號去掉。
#local_enable=YES
#write_enable=YES
上面第一行表示是否允許本地用戶登錄,第二行表示是否允許上傳文件。
修改完華之后,執(zhí)行以下命令重啟 ftp 服務:
sudo /etc/init.d/vsftpd restart
修改bootargs啟動參數(shù):
修改BOOTCOMMAND(hhbf.h中)
#define CONFIG_BOOTCOND \ "tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;\ setenv bootargs 'root=/dev/nfs rw\ nfsroot=192.168.244.129:/homg/rootfs init=/linuxrc \ ip=192.168.244.128 console=ttyAMA0';\ bootm 0x60003000 - 0x60500000 "
1
2
3
4
5
6
7
8
9
內(nèi)核make menuconfig
配置內(nèi)核支持掛載NFS文件系統(tǒng)
File systems –>
? 增加內(nèi)核的各種用戶接口
? 重啟reboot功能
? 新建etc目錄
? ? ? 添加inittab、 init.d/rcS、 fstab、 profile
? 新建tmp、 sys、 var、 proc目錄
? 啟動Linux,掛載NFS文件系統(tǒng)
? Linux內(nèi)核啟動之后,掛載NFS根文件系統(tǒng)
? 開啟Linux的第一個用戶進程: init
? init進程bootargs?init=…?執(zhí)行inittab腳
本
? inittab腳本首先會執(zhí)行init.d/rcS腳本
? rcS腳本:執(zhí)行mount –a 讀取fstab掛載各種
文件系統(tǒng)
? inittab:接著會啟動console
? ? ? 啟動shell: /bin/sh
? ? ? 在啟動/bin/sh之前先執(zhí)行profile文件
7、在虛擬開發(fā)板上開發(fā)應用程序、驅(qū)動示例
Linux 鏡像服務
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。