Ubuntu-20.04使用手册
一、平台说明
本平台在64位Ubuntu-20.04环境下,通过安装和运行qemu,仿真一款Cortex-A9架构的ARM开发板:Vexpress,并在上面运行U-boot和Linux操作系统。没有硬件开发板的学员,可以直接在这个仿真平台上去研究U-boot、Linux内核等嵌入式软件技术,经济实惠又方便。
镜像下载
百度网盘:https://pan.baidu.com/s/1qaRT9A1Pj2o5U-fxg1Qojg 提取码: wjns
微云:https://share.weiyun.com/IQjOE4bi 密码:ynm2nr
若下载地址失效,请关注公众号:宅学部落;进入公众号,输入:小宅实验室,即可获取最新镜像下载地址。
本平台是已经安装好qemu,qemu版本是qemu-5.1.0,并设置好网络配置的Ubuntu+VMware镜像。使用之前,你的本地电脑要已经安装好VMware station(建议版本15.0),并且硬件配置不低于以下最低标准:
内存:4GB
硬盘:至少有30GB的空闲空间
解压该镜像,直接使用VMware打开即可运行。
默认登录账户:zhaixue.cc
默认登录密码:123456
ROOT密码:123456
使用之前,确保你的虚拟机已经安装vmware-tool、与Windows共享文件夹,可以在Windows和Ubuntu虚拟机之间来回拷贝文件,方便后续的开发、文件拷贝。
二、使用初体验
在/home/tftpboot目录下,有已经编译好的镜像文件,各个镜像文件的说明如下:
u-boot-nfs: u-boot镜像,启动参数bootargs设置为挂载NFS文件系统
uImage: Linux-4.4内核镜像文件
vexpress-v2p-ca9.dtb:Linux-4.4内核对应的设备树文件
/hone/nfs: 网络文件系统,内核启动后,会挂载此文件系统作为根文件系统
启动u-boot,引导Linux内核镜像,并挂载NFS文件系统,使用uart作为控制台:
# cd /home/tftpboot
# ./boot-nfs.sh
每一个仿真的虚拟开发板在Ubuntu中都是以一个进程的形式运行。如果你想重新启动开发板上的u-boot+Linux,有2种方法,一是直接在console中使用reboot命令,二是杀掉qemu-system-arm进程,通过boot-nfs.sh脚本重新启动。
# ps -a | grep qemu-system-arm
3293 pts/1 00:00:04 qemu-system-arm
# kill 3293
# ./boot-nfs.sh
第三种方法是使用敲击组合键Ctrl+a,然后再快速敲击 x 键,即可关闭虚拟开发板的运行。建议使用reboot重启开发板系统,快捷、方便。
如果你想运行自己编译的U-boot或Linux内核镜像,可按照下面的步骤去编译U-boot或Linux内核源码,然后将编译生成的u-boot或uImage镜像文件拷贝到/home/tftpboot目录替换掉原来的镜像即可。
三、编译Linux内核
下载Linux内核源码并解压:https://www.kernel.org/
# tar xvf linux-5.4.70.tar.gz
编译内核和dtb文件:
# apt install gcc-arm-linux-gnueabi make libncurses-dev bison flex
# cd linux-5.4.70
# make ARCH=arm vexpress_defconfig
# make ARCH=arm menuconfig
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage LOADADDR=0x60003000
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
TIPS:
下面这一步不要省略,否则在内核源码外编译独立的out-of-tree内核模块时,可能会报错。
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
如果你在内核源码外,编译独立的模块,遇到下面的错误:
WRANING:symbol version dump "Module.symvers" is missing
no rule to make target 'scripts/module.lds'
可能就是忽略上面的命令的原因。
Ubuntu-20.04使用的NFS version4版本,在编译内核时将对应的版本都选上:
--- Network File Systems │ │
│ │ <*> NFS client support │ │
│ │ <*> NFS client support for NFS version 2 │ │
│ │ <*> NFS client support for NFS version 3 │ │
│ │ [ ] NFS client support for the NFSv3 ACL protocol extension │ │
│ │ <*> NFS client support for NFS version 4 │ │
│ │ [*] Provide swap over NFS support │ │
│ │ [*] NFS client support for NFSv4.1 │ │
│ │ [*] NFS client support for NFSv4.2 │ │
│ │ (kernel.org) NFSv4.1 Implementation ID Domain │ │
│ │ [*] NFSv4.1 client support for migration │ │
│ │ [*] Root file system on NFS
在内核启动时打印时间戳,可以选中kernel hacking->printk and dmesg options中的选项:
Kernel hacking --->
printk and dmesg options --->
│ │ [*] Show timing information on printks │ │
│ │ [ ] Show caller information on printks │ │
│ │ (7) Default console loglevel (1-15) │ │
│ │ (4) quiet console loglevel (1-15) │ │
│ │ (4) Default message log level (1-7) │ │
│ │ [ ] Delay each boot printk message by N milliseconds │ │
│ │ [ ] Enable dynamic printk() support │ │
│ │ [ ] Enable core function of dynamic debug support │ │
│ │ [*] Support symbolic error names in printf
拷贝内核镜像到tftpboot目录:
# cp arch/arm/boot/uImage /home/tftpboot
# cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb /home/tftpboot
启动U-boot引导内核镜像uImage
# cd /home/tftpboot
# ./boot-nfs.sh
四、编译U-boot
下载u-boot-2020.10.tar.bz2,并解压。下载地址:https://ftp.denx.de/pub/u-boot/
# tar xvf u-boot-2020.10.tar.bz2
# cd u-boot-2020.10
修改U-boot源码:include/configs/vexpress_common.h,设置ipaddr、serverip、netmask等参数为以下值:
#define CONFIG_IPADDR 192.168.33.14
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.33.145
编译U-boot
# apt install gcc-arm-linux-gnueabi make libncurses-dev bison flex
# make vexpress_ca9x4_defconfig
# make menuconfig
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
最新版的u-boot-2020.10,ARCH和bootcmd可以通过make menuconfig 菜单选项配置。在Architecture select选项中选择:ARM architecture
Architecture
select (ARM architecture) --->
( ) ARC architecture
(X) ARM architecture
( ) M68000 architecture
( ) MicroBlaze architecture
( ) MIPS architecture
( ) NDS32 architecture
设置bootcmd命令:
[*] Enable a default value for bootcmd
Please enter a string value. Use the key to move from the input field to the buttons below it.
bootcmd命令设置如下,直接将下面的命令粘贴到上面即可。
tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.33.145:/home/nfs,proto=tcp,nfsvers=4,nolock init=/linuxrc ip=192.168.33.144 console=ttyAMA0';bootm 0x60003000 - 0x60500000;
启动U-boot:
# cp u-boot /home/tftpboot/u-boot-nfs
# cd /home/tftpoot
# ./boot-nfs.sh
U-Boot 2020.10 (Oct 21 2020 - 19:50:30 -0700)
DRAM: 512 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
smc911x: MAC 52:54:00:12:34:56
smc911x: detected LAN9118 controller
smc911x: phy initialized
smc911x: MAC 52:54:00:12:34:56
Using smc911x-0 device
TFTP from server 192.168.33.145; our IP address is 192.168.33.144
Filename 'uImage'.
Load address: 0x60003000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
########################
2.9 MiB/s
done
Bytes transferred = 5115584 (4e0ec0 hex)
smc911x: MAC 52:54:00:12:34:56
smc911x: MAC 52:54:00:12:34:56
smc911x: detected LAN9118 controller
smc911x: phy initialized
smc911x: MAC 52:54:00:12:34:56
Using smc911x-0 device
TFTP from server 192.168.33.145; our IP address is 192.168.33.144
Filename 'vexpress-v2p-ca9.dtb'.
Load address: 0x60500000
Loading: #
1.7 MiB/s
done
Bytes transferred = 14143 (373f hex)
smc911x: MAC 52:54:00:12:34:56
## Booting kernel from Legacy Image at 60003000 ...
Image Name: Linux-5.10.0-rc3+
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 5115520 Bytes = 4.9 MiB
Load Address: 60003000
Entry Point: 60003000
Verifying Checksum ... OK
## Flattened Device Tree blob at 60500000
Booting using the fdt blob at 0x60500000
Loading Kernel Image
Loading Device Tree to 7fe6e000, end 7fe7473e ... OK
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
...
[ 3.109740] ALSA device list:
[ 3.110156] #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 28
[ 3.273387] VFS: Mounted root (nfs4 filesystem) on device 0:15.
[ 3.301042] Freeing unused kernel memory: 1024K
[ 3.314666] Run /linuxrc as init process
[ 3.465897] random: fast init done
mount: mounting debugfs on /sys/kernel/debug failed: No such file or directory
_ _
___| |__ __ _(_)_ ___ _ ___ ___ ___
|_ / '_ \ / _` | \ \/ / | | |/ _ \ / __/ __|
/ /| | | | (_| | |> <| |_| | __/| (_| (__
/___|_| |_|\__,_|_/_/\_\\__,_|\___(_)___\___|
[root@vexpress ]#
[root@vexpress ]# ls
a.out hello.ko mnt sys var
bin lib proc test.ko
dev linuxrc root tmp
etc mathmodule.ko sbin usr
[root@vexpress ]#
五、更多资料、教程
基于qemu平台的嵌入式、Linux、内核、驱动开发、C语言视频教程,可访问:https://wanglitao.taobao.com