【linux】嵌入式linux的组成

嵌入式Linux的组成:

  • 在硬件上,主要由cpu、emmc(或nand、sd,都属于Flash)、SDRAM、NFS(网络文件系统)四部分组成,flash是Linux的存储器,类似于Windows的硬盘;SDRAM是内存、NFS是网络调试用的网络文件系统。如果是设置为sd卡启动,在启动完成后会将EMMC设置为默认存储器,使用setenv和saveenv设置环境变量时也会将值存储到EMMC。
  • 在软件上,主要由uboot、linux内核、设备树、根文件系统组成。网络调试的嵌入式Linux系统的启动过程:uboot是系统上电后执行的第一个程序,在boot命令下通过tftp命令将ubuntu主机的内核映像文件和设备树通过网络传输到嵌入式系统板上,通过setenv设置bootargs启动参数,指定根文件系统到ubuntu主机上。
  • 从烧录工具的角度认识嵌入式Linux开发的系统组成:
    nxp提供的烧录工具MfgTool烧录的内容为:Linux内核映像zImage、设备树.dtb、根文件系统压缩包、uboot。

本文的目的是介绍uboot、linux内核、根文件系统的构建,mfgtool工具烧写系统,读者能够使用uboot、linux内核、busybox的源码编译出供mfgtool烧写的系统需要的三大组件(uboot、内核、根文件系统),能在嵌入式Linux板卡上将Linux系统运行起来。

一、bootloader

1.1 bootloader介绍

Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间。
常见的bootloader有Redhat公司的Redboot、ARM平台的ARMboot、由开源项目PPCBoot发展起来的U-Boot。

1.2 uboot源码

官网地址:http://www.denx.de/wiki/U-Boot/,nxp在此基础上,针对自己的芯片有自己的版本,可以在这里下载到nxp维护的uboot版本。

1.3 uboot的编译和烧录

1.3.1 编译

安装必要的库。

sudo apt-get install libncurses5-dev

编译uboot有三个步骤:清空工程、配置工程、编译工程。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

配置文件在源码根目录下的configs文件夹里,每一个配置都是针对特定开发板的配置。

1.3.2 烧录

在ubuntu中通过imxdownload工具将编译出的u-boot.bin下载到sd中(sd卡通过读卡器接入电脑)。

./imxdownload u-boot.bin /dev/sdd

1.4 uboot常用命令

1.4.1 基本命令

  • bdinfo:查询板卡信息
  • setenv:设置、删除、增加环境变量
set date 12/23 修改,如果之前没有date环境变量则增加date变量
set date 删除date变量
  • saveenv:在setenv后需要saveenv保存环境变量到EMMC或者NAND。
  • md:查看内存,md[.b, .w, .l] address [# of objects],方括号中的为可选选项,代表以byte、word、long为单位查看,#of objects代表查看的个数。示例如下:
md.w 80000000 10 查看内存里从0x80000000开始的16个word长度的数据
  • nm:修改内存里的内容
输入 nm.l 80000000后会打印0x8000000处的内容,
接着输入需要往该内存写入的值。
  • mm:连续修改内存值,相比于nm,在每次修改完内存值后内存地址会递增,可以连续修改。
  • mw:用固定值填充内存,用法:mw [.b, .w, .l] address value [count],示例如下:
mw.l 80000000 0A0A0A0A 10 
用0a0a0a0a0填充从8000000开始的10个数据。

1.4.2 网络命令

设置boot的环境变量

setenv ipaddr 192.168.1.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250
saveenv

二、Linux内核

2.1 Linux内核介绍

Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
Linux最早是由芬兰 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。

2.2 Linux内核源码

内核地址在https://www.kernel.org/,nxp发布的linux版本在这里

2.3 编译Linux内核

首先安装lzop软件包。

sudo apt-get install lzop

编译Linux内核有四个步骤:清空工程、配置Linux的平台、配置Linux功能、编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

编译后会在arch/arm/boot目录下产生zImage的文件,这个就是内核映像,在arch/arm/boot/dts下产生.dtb后缀的设备树文件。

三、根文件系统

3.1 根文件系统介绍

根文件系统(rootfs)是Linux组织文件的方式,Linux中一切皆文件,对于一个没有根文件系统的操作系统,在Linux启动后会发生内核崩溃的错误。根文件系统和uboot、Linux内核一样作为Linux系统的组成部分,属于一种软件。
Linux根目录下的几个目录的作用:

  • bin:保存可执行程序,如bash、mv、ls
  • dev:设备文件
  • etc:配置文件
  • lib:系统和用户程序需要用到的库文件
  • mnt:临时挂载文件
  • proc:proc文件系统的挂载点
  • usr:软件资源目录,保存软件,如交叉编译工具链
  • var:保存临时变量
  • sbin:可执行程序,与bin的区别是该目录下的程序需要root权限执行
  • sys:sysfs文件系统的挂载点
  • opt:可选的文件、软件存放区

3.2 根文件系统的构建

busybox介绍

busybox是一个集成了Linux常用工具的软件,比如ls、ifconfig,可以在busybox官网获取到源码。

猜你喜欢

转载自blog.csdn.net/weixin_43810563/article/details/121494174