1.2.6 uboot 编译安装

  • 嵌入式 bootloader 的功能:

    • 功能类似于 PC 的 BIOS、硬件检测是否正常
    • 加载操作系统镜像到 RAM
    • 设置不同的启动方式
  • 常见的启动方式:
    • NOR/NAND Flash 启动
    • 从 SD 卡启动
    • Bootloader 从网络加载 Linux 内核启动
  • uboot 编译
    • 下载地址:ftp://ftp.denx.de/pub/u-boot/

      • 获取得版本为 u-boot-2017.01.tar.bz2,发布时间为 2017-1-15
    • 主 Makefile 中修改 CROSS_COMPILE,config.mk 中修改 ARCH
    • 配置 make vexpress_ca9x4_defconfig
    • 编译 make -j8
    • 测试 uboot 可用:qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M
  • 启动成功后,需要对 uboot 配置网络功能,即 QEMU 网络功能设置

    • 采用桥接(bridge)的网络连接与 Host 通信
    • 需要主机内核 tun/tap 模块支持
    • 配置:
      • 主机安装工具包

        • sudo apt-get install uml-utilities
        • sudo apt-get install bridge-utils
      • 创建 tun 设备文件:/dev/net/tun,工具安装成功后,会生成此设备节点
      • 开启 tun 网络功能,使其声线:
        • 修改 /etc/network/interfaces 文件,重启生效
      • 配置 /etc/qemu-ifup、/etc/qemu-ifdown 脚本,这些可能自动生成了,那就不需要配置
      • 重启,使 br0 生效:
      • 虚拟网口 br0 是 QEMU 虚拟机与Linux主机通讯的网口

  • 内核配置编译:
    • 使用 u-boot 引导内核镜像

      • 需要将内核编译为 uImage 格式
      • 需要指定 uImage 的加载地址
      • 编译时指定:make LOADADDR=0x60003000 uImage -j8
  • 主机 TFTP 工具安装
    • 工具安装:sudo apt-get install tftp-hpa tftpd-hpa xinetd
    • 修改配置文件:/etc/default/tftpd-hpa
      • TFTP_DIRECTORY 是我们的工作目录,开发板从此目录下载镜像和配置文件,我们的镜像和配置文件也存放此目录中
    • 创建 tftpboot 目录,mkdir tftpboot, chmod 777 tftpboot
    • 配置 /etc/xinetd.conf,如果没有此文件,则创建此文件:
    • 配置 /etc/xinetd.d/tftp 文件,如果没有此文件,则创建此文件

    • 重启 tftp:
      • sudo /etc/init.d/tftpd-hpa restart
      • sudo /etc/init.d/xinetd reload
      • sudo /etc/init.d/xinetd restart
    • 测试 tftp

      • cd ..
      • tftp localhost
      • tftp> get test.c
      • 获取文件成功,则OK
  • 启动测试:
    • qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -sd rootfs.ext3
    • 注意:若是高版本得QEMU,则去掉 vlan 参数
    • 脚本在最后

1.3 挂载 NFS 文件系统

1.3.1 介绍

  • 主机 HOST 支持 NFS 服务

    • 安装:sudo apt-get install nfs-kernel-server
    • 配置NFS
      • 在 /etc/exports 文件中添加:
      • /home/rootfs *(rw,sync,no_root_squash,no_subtree_check)
        • /home/rootfs:是根文件系统的主目录
        • rw:可读可写
        • sync:磁盘和内存进行同步
        • no_root_squash:不执行开发板 root 用户映射为主机的匿名用户,保证权限重组
        • no_subtree_check:不检查根文件系统的子目录
    • 开启 NFS 服务
      • /etc/init.d/rpcbind restart
      • /etc/init.d/nfs-kernel-server restart
  • 修改 bootargs 启动参数
    • 设置为 NFS 为根文件系统
    • 设置主机 NFS 文件系统的地址
    • nfsroot 是主机的 IP 地址
    • ip 是开发板的 IP 地址
    • 注意:若是 QEMU 得版本较高,则参数配置如下:
    • 即相比于低版本 QEMU,在nfsroot 后添加了 proto=tcp,nfsvers=3,nolock 三个参数 

  • 内核支持挂载 NFS 文件系统
    • make menuconfig 配置
    • 修改完后:make uImage -j8
    • 由于暂时 uboot 没办法启动内核,则单独启动内核
    • VFS 已经 mount 成功
    • 在根文件系统(/home/coco/work/rootfs)下创建一个文件:test.c,然后在 linux 控制台查看是否存在此文件

1.3.2 完善跟文件系统

  • 启动流程:

    • Linux 内核启动之后,挂载 NFS或其他根文件系统
    • 然后开启 init 进程(前面设置的 bootargs 中,init=/linuxrc),这个init 进程会执行 inittab 脚本
  • 增加内核的各种用户接口,用户接口存在 /proc 和 /sys 下
    • /etc 内核配置和启动文件,需要在下面添加以下文件

      • inittab:脚本文件,运行命令
 ::sysinit:/etc/init.d/rcS            ///< 启动 rcS 脚本
#::respawn:-/bin/sh
#tty2::askfirst:-/bin/sh
#::ctrlaltdel:/bin/umount -a -r console::askfirst:-/bin/sh ///< 启动控制台,控制台与 shell 绑定一起,"-" 表示启动 shell 之前,要启动 profile
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
      • fstab:文件init.d:目录
 挂载的文件系统    挂载的目录
proc /proc proc defaults
tmpfs /tmp tmpfs defaults
sysfs /sys sysfs defaults
tmpfs /dev tmpfs defaults
var /dev tmpfs defaults
ramfs /dev ramfs defaults 注意:挂载的目录必须在根文件系统下存在,不存在则创建,这个文件的作用就是将文件系统挂载到目录的节点上
      • rcS:文件
 #!bin/sh
# 设置环境变量
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=/lib
export PATH LD_LIBRARY_PATH # 挂载各种文件系统,挂载的文件系统与 fstab 有关
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
mkdir -p /var/lock echo "--------------------------------------------------------------------------------" echo "Welcome to my cortex-a9 board" echo "--------------------------------------------------------------------------------"
      • profile:文件
 PS1='cortex_a9@arm:\w # '        ///< 显示控制台的格式,就相当于终端中的 coco@ubuntu:~/work/rootfs/etc$
export PS1 注意:此文件也可以做其他操作
  • 重启 reboot 功能,已经在 inittab 中操作
  • 最终结果

1.4 在开发板上运行应用和内核驱动程序

1.4.1 运行应用程序

  main.c

  

  执行交叉编译:arm-linux-gnueabi-gcc main.c

  将生成 a.out 拷贝进开发板中(NFS 文件系统),并执行:

  

1.4.2 运行内核驱动程序

  

  Makefile:

 .PHONY:all clean
ifneq ($(KERNELRELEASE),) obj-m := hello.o else EXTRA_CFLAGS += -DDEBUG
KDIR := /home/coco/work/kernel/linux-..
all:
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -C $(KDIR) M=$(PWD) modules
clean:
rm -fr *.ko *.o *.mod.o *.mod.c *.symvers *.order .*.ko .tmp_versions endif

  拷贝 hello.ko 进NFS文件系统:cp /home/coco/work/code/test_driver/hello.ko ./work

  加载模块:insmod hello.ko

  

  查看模块:lsmod

  

  卸载模块:rmmod hello.ko

  查看模块:lsmod

  

1.5 启动脚本

  boot.sh

 #!/bin/bash

 BOARD=vexpress-a9

 KERNEL_DIR=/home/ubuntu/work/arm/kernel/linux-4.4.
KERNEL_BIN_DIR=${KERNEL_DIR}/arch/arm/boot
DTB_DIR=${KERNEL_BIN_DIR}/dts
DTB_BIN=vexpress-v2p-ca9.dtb
UIMAGE=uImage
ZIMAGE=zImage UBOOT_DIR=/home/ubuntu/work/arm/uboot/u-boot-2017.01
UBOOT_BIN_DIR=${UBOOT_DIR}
UBOOT_BIN=u-boot ROOTFS_DIR=/home/ubuntu/work/arm
ROOTFS_BIN=rootfs.ext3 TFTPBOOT_DIR=/home/ubuntu/work/arm/tftpboot help()
{
echo "-t start qemu"
echo " s; start with graphic......"
echo " s-no; start with no graphic......"
echo "-h print help"
} tftp_init()
{
echo "init...."
if [ "${TFTPBOOT_DIR}/${UIMAGE}" -ot "${KERNEL_BIN_DIR}/${UIMAGE}" -o ! -f "${TFTPBOOT_DIR}/${UIMAGE}" ]; then
echo "cp ${KERNEL_BIN_DIR}/${UIMAGE} ${TFTPBOOT_DIR}"
cp ${KERNEL_BIN_DIR}/${UIMAGE} ${TFTPBOOT_DIR}
fi if [ "${TFTPBOOT_DIR}/${DTB_BIN}" -ot "${DTB_DIR}/${DTB_BIN}" -o ! -f "${DTB_DIR}/${DTB_BIN}" ]; then
echo "cp ${DTB_DIR}/${DTB_BIN} ${TFTPBOOT_DIR}"
cp ${DTB_DIR}/${DTB_BIN} ${TFTPBOOT_DIR}
fi if [ "${TFTPBOOT_DIR}/${UBOOT_BIN}" -ot "${UBOOT_BIN_DIR}/${UBOOT_BIN}" -o ! -f "${UBOOT_BIN_DIR}/${UBOOT_BIN}" ]; then
echo "cp ${UBOOT_BIN_DIR}/${UBOOT_BIN} ${TFTPBOOT_DIR}"
cp ${UBOOT_BIN_DIR}/${UBOOT_BIN} ${TFTPBOOT_DIR}
fi if [ "${TFTPBOOT_DIR}/${ROOTFS_BIN}" -ot "${ROOTFS_DIR}/${ROOTFS_BIN}" -o ! -f "${ROOTFS_DIR}/${ROOTFS_BIN}" ]; then
echo "cp ${ROOTFS_DIR}/${ROOTFS_BIN} ${TFTPBOOT_DIR}"
cp ${ROOTFS_DIR}/${ROOTFS_BIN} ${TFTPBOOT_DIR}
fi
} tftp_start_no_graphic()
{
qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M -net nic, -net tap,ifname=tap0 -sd rootfs.ext3
} nfs_start_no_graphic()
{
qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M -net nic -net tap,ifname=tap0
} kernel_start_no_graphic()
{
qemu-system-arm \
-M ${BOARD} \
-kernel ${KERNEL_BIN_DIR}/${ZIMAGE} \
-nographic \
-m 512M \
-dtb ${DTB_DIR}/${DTB_BIN} \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd ${ROOTFS_DIR}/${ROOTFS_BIN}
} kernel_start_with_graphic()
{
qemu-system-arm \
-M ${BOARD} \
-kernel ${KERNEL_BIN_DIR}/${ZIMAGE} \
-m 512M
} uboot_start_no_graphic()
{
qemu-system-arm \
-M ${BOARD} \
-kernel ${UBOOT_BIN_DIR}/${UBOOT_BIN} \
-nographic \
-m 512M
} uboot_start_with_graphic()
{
qemu-system-arm \
-M ${BOARD} \
-kernel ${UBOOT_BIN_DIR}/${UBOOT_BIN} \
-m 512M
} while getopts "t:h" opt
do
case $opt in
t)
OPTARG_TYPE=$OPTARG
;;
h)
help
exit
;;
esac
done case "$OPTARG_TYPE" in
n-no)
tftp_init
echo "nfs start with no graphic......"
nfs_start_no_graphic $@
;;
s)
echo "tftp start with graphic......"
tftp_init
start_graphic $@
;;
s-no)
tftp_init
echo "tftp start with no graphic......"
tftp_start_no_graphic $@
;;
k)
kernel_start_with_graphic $@
;;
k-no)
kernel_start_no_graphic $@
;;
u)
uboot_start_with_graphic $@
;;
u-no)
uboot_start_no_graphic $@
;;
*)
echo "Unknow option $OPTARG_TYPE..."
exit
;;
esac

一、Linux 设备驱动介绍及开发环境搭建(续)的更多相关文章

  1. 一、Linux 设备驱动介绍及开发环境搭建

    1.1 Linux 设备驱动介绍 1.1.1 分类及特点 计算机系统的硬件主要由 CPU.存储器和外设组成. 当前 CPU 内部都集成有存储器和外设适配器. 外设适配器有入 UART.IIC 控制器. ...

  2. Linux虚拟机中 Node.js 开发环境搭建

    Node.js 开发环境搭建: 1.下载CentOS镜像文件和VMWare虚拟机程序; 2.安装VMWare——>添加虚拟机——>选择CentOS镜像文件即可默认安装带有桌面的Linux虚 ...

  3. (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...

  4. 1. React介绍 React开发环境搭建 React第一个程序

    什么是 React         React 是 Facebook 发布的 JavaScript 库,以其高性能和独特的设计理念受到了广泛关注. React的开发背景         Faceboo ...

  5. Eclipse rap 富客户端开发总结(1) :rap简单介绍和开发环境搭建

    一.rap简单介绍 1 基本概念     RAP可以让开发人员使用JAVA API和按照Eclipse 插件的开发模式构建基于AJAX的Web 2.0应用程序, RAP的工作原理是采用交叉编译的方式将 ...

  6. Linux Ubuntu系统下Java开发环境搭建

    操作系统:Linux x64 / Ubuntu 14.04 Java JDK版本:jdk-8u65-linux-x64.tar.gz 声明:转载请注明出处及本文链接 1. 前往ORACLE官网下载最新 ...

  7. LINUX下QT FOR ARM开发环境搭建过程 (使用qt-x11-opensource-src-4.5.2.tar.gz进行编译)

    在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括了Qt Designer等基本工具,用于在PC上对程序的开发调试,使我们能确保程序放到 ...

  8. centos 7 lamp (linux+apache+mysql+php)开发环境搭建(转+原创)

    准备篇:CentOS 7.0系统安装配置图解教程 http://www.jb51.net/os/188487.html 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是fi ...

  9. linux python 图形编程 qt开发环境搭建

    我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...

随机推荐

  1. 折腾ELK+kafka+zk

    回顾前大半年: 1.kubespray搭建K8S集群 2.openVPN 搭建 3.helm使用 4.aws EKS 搭建维护 5.Jenkins pipline 编写ci/cd流程 6.蓝鲸,jum ...

  2. delphi TDbGrid 右键 PopupMenu 菜单只在有数据的地方弹出

    最近用delphi做开发,用到了DbGrid控件,想在控件上点击鼠标右键弹出菜单 关联DbGrid的 Popupmenu 倒是可以实现,但是这样的效果是不管你在哪里单击鼠标右键 只要在DBGrid里面 ...

  3. plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法(转)

    原文转自:plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法 最近在使用plsql连接本地oracle数据库的时候,在同一网络环境中,出现了可以连接本地oracle, ...

  4. 炼丹的一些trick

    采摘一些大佬的果实: 知乎:如何理解深度学习分布式训练中的large batch size与learning rate的关系? https://blog.csdn.net/shanglianlm/ar ...

  5. [深度应用]·Keras极简实现Attention结构

    [深度应用]·Keras极简实现Attention结构 在上篇博客中笔者讲解来Attention结构的基本概念,在这篇博客使用Keras搭建一个基于Attention结构网络加深理解.. 1.生成数据 ...

  6. Java学习开发第一阶段总结

    前言: 按照学院的安排我专业应该在下学期学习Java课程,因为对技术的热爱,我选择了在本学期学习Java.俗话说得好“笨鸟先飞”,那我就先学习这门课程了. 第一阶段的学习总结: 在此次阶段任务相对比较 ...

  7. Vector和ArrayList的区别联系,Hashtable和HashMap的区别联系

    Vector.Hashtable是早期的集合类,线程安全,但是效率低下,被相同原理.结构的ArrayList.HashMap取代. 1.Vector和ArrayList的区别和联系: 联系:实现原理相 ...

  8. poj1042(贪心+枚举)

    题目链接:https://vjudge.net/problem/POJ-1042 题意:给n个湖,给出每个湖第一次打捞时鱼的数量f[i],每单位时间鱼减少的数量d[i],从湖i到湖i+1用时t[i], ...

  9. c语言程序命名规范:函数、变量、数组、文件名

    函数: //send or recv data task void send_recv_data(void *pvParameters); //get socket error code. retur ...

  10. HDU-5471 Count the Grid

    题目描述 一个矩阵中可以任意填\(m\)个数.给你\(N\)个小矩阵并且告诉你此矩阵中的最大值\(v\),求有多少种大矩阵满足所给条件.\((\%1e9+7)\) Input 包含\(T\)组数据. ...