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
若下载地址失效,请关注公众号:宅学部落;进入公众号,输入:小宅实验室,即可获取最新镜像下载地址。

本平台是已经安装好qemuqemu版本是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

不用买开发板,使用QEMU就可以学习的Linux内核开发实战视频教程:《Linux内核编程》,具有一线芯片原厂开发经验的驱动工程师录制,详情点击:王利涛老师个人淘宝店:Linux内核编程