导读:嵌入式Linux开发大体上可以分为三个部分BSP开发、系统集成、应用开发,一般公司开发会有不同的人员分别负责这三个大的部分。就本文谈到Linux系统构建而言,主要涉及到BSP、系统集成两个方面。对于从业人员而言了解Linux系统的构建过程,会对Linux系统有更加深入的理解。
1. 基本概念
1.1 嵌入式开发主要任务
首先想谈谈对于Linux开发这三个方面的大体内容,具体有哪些开发工作:
BSP开发:移植bootloader以及Linux 内核,开发Linux设备驱动
系统集成:将用户空间所需的组件集成进系统并进行配置,同时开发升级恢复机制。
应用开发:开发特定业务的应用软件或者库
而对于Linux的启动过程,大体如下图:
当然对于不同的体系结构会有所不同,本文主要基于ARM进行讨论。
至于Bootloader、内核的移植、驱动开发不在本文的讨论范围。假定都是完备可执行的。那么Buildroot可以帮我们做什么呢?Buildroot可以完成Bootloader的配置编译、内核的配置编译、根文件系统的配置编译、用户空间所需的软件组件及库的配置编译等工作。
1.2 常用的Linux构建系统
常见的嵌入式构建系统有Yocto/OpenEmbedded,PTXdist, Buildroot,OpenWRT 等等。。。
比较流行的有两种:
Yocto/OpenEmbedded:使用二进制包构建完整的Linux发行版。功能强大,但有些复杂,而且学习曲线相当陡峭。
Buildroot:构建一个根文件系统映像,没有二进制包。使用,理解和修改要简单得多
2. Buildroot之初体验
2.1 Buildroot简介
Buildroot的特点:
可以构建工具链,rootfs,内核,引导程序
易于配置:menuconfig,xconfig等
快速:只需几分钟即可构建一个简单的根文件系统
易于理解:用大量书面文件制作
小型根文件系统,起始于2 MB
提供2500多个用于用户空间库/应用程序的软件包
支持多种架构
知名威廉希尔官方网站 :make和kconfig
具有最让用户心动的设计目标:
简单易用
易于定制
可复制的构建
小根文件系统
而事实上,Buildroot确实如其期望一样,简单易用,用户体验友好。详细请参考:https://buildroot.org/
2.2 基本的步骤
Buildroot的使用主要有以下几个步骤:
下载:从下面网址选择你需要的版本
https://buildroot.org/download.html
你也可以:git clone git://http://git.busybox.net/buildroot
配置:可选的有以下几种配置方式:
make menuconfig,这无疑是为大家所熟知的,因为内核正式基于kconfig语言的配置方式。需要ncurses的支持
make nconfig,需要ncurses的支持
make xconfig,需要QT的支持
make gconfig,需要QTK的支持
编译:make
部署: 位于。/output/images/下 是生产的bootloader镜像,内核镜像以及根文件系统压缩包。
2.3 基本配置
对于一个最小系统而言,我们需要配置以下一些基本配置就可以进行编译了:
本文基于TI的DM3730为例进行描述。
TI公司的DM3730微处理器是由1GHz(同时支持300,600和800MHz)的ARM Cortex-A8 Core和800MHz(同时支持250,520和660MHz)的TMS320C64x+ DSP Core两部分组成,并集成了3D图形处理器,视频加速器(IVA),USB 2.0,支持MMC/SD卡,串口等。DM3730 pin-to-pin兼容DM3725、AM3715、AM3703处理器,支持高清720p视频编解码。
2.3.1 Target配置
根据芯片手册很容易做出如上配置。所以关于目标机的配置,主要是包括大小端、目标机二进制格式、目标机内核变种、浮点支持选项、指令集选择。
2.3.2 Build 配置
主要配置以下一些内容:
配置文件保存位置,将配置文件保存的好处是,在重新构建时,值需要调用
make 《xxx_defconfig》
然后make,而不必重新全部配置。
配置下载位置,因为系统构建的时候需要从网络上抓起很多软件报的代码进行编译构建。这个一般不需要修改。
strip target binaries建议使能,这样会使文件尺寸变小。
对于其他的选项基本可以不做修改。
2.3.3 工具链配置
工具链配置非常重要,不容出错:
工具链可选择外部可执行工具链,亦可以自行编译,或者本地存放的厂商提供的二进制工具链。本例选则本地可执行二进制包。
工具链前导符,本文选择arm-none-linux-gnueabi,这取决于所用芯片的体系结构,需与所配的工具对应! 另外需要注意的是浮点的支持,需与所选芯片是否有硬件浮点计算单元匹配,且与上面提到的目标机浮点配置对应。
外部GCC版本,选择所需的版本。
内核头文件版本,这个选项至关重要,需与你用的内核版本对应
GDB调试,这个建议选上,方便后面系统调试
MMU支持,一般地需要MMU支持。
对于其他一些选项,不做详述
2.3.4 系统配置
主机名:根据需要定义一个字符串,是控制台前面的提示符xxx@vsi
密码加密方式:根据需要选择加密算法
init系统:这里选择busybox,轻量级使用非常广泛。可选的有systemV,systemd.
设备表,可以默认即可
符号链接,这个可选
shell,因为前面选择使用busybox,通常嵌入式会选择busybox提供的shell工具集
其他还有诸如语言、时区、用户表、根文件系统覆盖、本地脚本加载等不做一一描述了。需要提示的是,如果需要需要修改根文件系统的某部分,可以考虑使用根文件系统覆盖。
2.3.5 内核配置
对于内核可选择本地压缩包,亦可以选择从代码库、网络进行抓取
补丁选项,如果有补丁需要打,可使能
内核格式,因为采用u-boot这里选择uImage
内核代码压缩格式,因为前面选择的是.gz格式,故这里选gzip
设备树,因为本例的内核并不支持设备树,故未使能。值得一提的是,现行的内核大多采用设备树对硬件层进行抽象剥离。
内核扩展,这里有以下一些选项:
Adeos/Xenomai Real-time patc,
FB TFT drivers,
ev3dev Linux drivers
Aufs Filesystem Module patch
内核工具,有以下一些选项:
可根据硬件系统需要进行裁剪,这些工具非常有用。
2.3.6 Target package配置
根据需要进行配置,需要提到的是,这个配置非常有用,可实现丰富的客制化软件包的支持,公司内部自研的应用包、库可以由此进行集成。
2.3.7 Filesystem images配置
可将output/target生成的根文件系统打包成一个镜像,需要注意的是output/target下生成的根文件系统由于权限等原因是不可以直接加载的。例如不可以用NFS进行挂载。
2.3.8 Bootloaders配置
本例采用本地压缩包,类似内核配置,也可以通过网络进行抓取,需要注意的是网络抓取的代码很多移植工作应该没有完成,除非已经声明支持的板子能找到对应bootloader代码仓库。当然如果内部已经开发完成,并有版本系统管理,这里就可以配置为从版本仓库抓取了。
对于Host utilities/Legacy config options 对于最小系统可不做配置。
最后一步,完成配置,保存设置。
建议:保存.config 用如下命令
mv .config 。/configs/xxx_defconfig
下次修改,只需执行make xxx_defconfig就会加载本次的配置。
3.编译部署
完成了配置后,只需要执行 make,则在。/output/images/下就会得到如前所示的bootloader,uImage,rootfs.tar,然后就可以部署在目标板上进行运行了。
至此,我们的Buildroot快速通关,就顺利通关了,是不是很容易,很方便!
公号里面内容更多,欢迎关注交流.
评论
查看更多