嵌入式Linux开发教程
上QQ阅读APP看书,第一时间看更新

1.5 启动目标板系统

Linux 系统的一般启动过程包括引导内核、启动内核和启动初始化程序三个阶段,如图1-20所示。

图1-20 Linux的启动过程

1.5.1 Boot Loader和Kernel

目标板处理器上电或者复位之后,首先执行引导程序(Boot Loader),初始化内存等硬件,然后把压缩的内核映像加载到内存中,最后跳转到内核映像入口执行。

目标板上的 Boot Loader 具有加载内核映像的功能。在嵌入式Linux开发中,常常用到网络加载的方式,就是通过Tftp协议把内核映像加载到目标板内存中。不同的 Boot Loader 有不同的配置方法,这里以U-Boot为例说明。U-Boot支持多种启动加载模式,包括从网络和从FLASH启动。这里以从网络启动为例。

U-Boot 1.1.4 (Jun 29 2007 - 13:26:53)

U-Boot code: 31F80000 -> 31F9DCE0 BSS: -> 31FA2350

RAM Configuration:

Bank #0: 30000000 32 MB

Nor Flash: 512 KB

NAND FLASH: 64 MB

In: serial

Out: serial

Err: serial

Hit any key to stop autoboot: 0

NANO2410=> Tftp 30008000 zImage

系统加电后首先启动了U-Boot,当出现命令提示符后,输入命令:

Tftp 30008000 zImage

表示从服务器上通过Tftp下载内核镜像zImage。之后出现下面的提示。

Tftp from server 192.168.0.1; our IP address is 192.168.0.2

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

#################################################################

#################################################################

############################################

done

Bytes transferred = 1555932 (17bddc hex)

通过前面的Tftp命令,将内核下载到了内存地址的30008000处。在下载的同时还显示了下载进度。由于这是Linux 4.6的内核,而其包含了较多的驱动和模块,使得体积较大,有1555932字节长,若是2.4版本的内核,通常不会超过1MB。

NANO2410=>go 30008000

## Starting application at 0x30008000 ...

Uncompressing Linux.............................................................

.......................... done, booting the kernel.

当输入命令:

go 30008000

Boot Loader将内核镜像解压,并跳转至内核映像入口地址,开始启动内核。

Linux version 2.6.18.2 (swordzj@swordzj-desktop) (gcc version 3.4.1) #1 Wed Jul

18 22:00:09 CST 2007

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

Machine: SMDK2410

ATAG_INITRD is deprecated; please update your BootLoader.

Memory policy: ECC disabled, Data cache writeback

CPU S3C2410A (id 0x32410002)

S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz

S3C24XX Clocks, (c) 2004 Simtec Electronics

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

CPU0: D VIVT write-back cache

CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

Scanning device for bad blocks

Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00100000 : "BootLoader "

0x00100000-0x00300000 : "kernel"

0x00300000-0x02b00000 : "root"

0x02b00000-0x04000000 : "user"

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

yaffs: dev is 32505859 name is "mtdblock3"

yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.3, "mtdblock3"

eth0: using half-duplex 10Base-T (RJ-45)

在经历一系列的初始化过程之后,内核启动完毕,接下来启动Init程序。

BusyBox v1.4.2 (2007-07-01 17:44:36 CST) Built-in shell (ash)

Enter 'help' for a list of built-in commands.

[root@swordzj /]$

嵌入式程序的Init程序完成的工作很少,一般不需要实现Login等复杂的功能,而是直接启动shell。

1.5.2 根文件系统

在内核启动到最后,必须为其挂接一个根文件系统。从文件系统中启动Init程序,以完成剩下的系统启动过程。

在交叉开发环境中,通常采用NFS文件系统,在内核的启动过程中挂载由主机共享的根文件系统,这种方式将大大地方便主机与目标板的数据共享。

要使目标板能够加载上NFS根文件系统,需要做两方面的工作。一是在主机端配置NFS服务器和准备好文件系统所需的文件和目录结构。二是配置目标板的内核选项。关于主机端的配置在前面的内容中已经介绍过了,这里主要介绍内核的配置内容。使用NFS的根文件系统必须首先具备以下条件。

1.有正确的以太网接口驱动

内核的以太网驱动和Boot Loader中的以太网驱动是不一样的,有时可能在Boot Loader中能正常使用的以太网,在内核中就不能使用了。在内核中配置以太网驱动一般在菜单项“Network device support”下。

2.配置内核启动命令行参数

通过命令行参数可以告诉内核从哪里获得根文件系统。配置内核启动命令行参数默认值的菜单项为“Default kernel command line string”。格式如下:

root=/dev/nfs rw nfsroot=<nfs_server>:<root_path> ip=<target_ip>

参数的说明如下。

● <target_ip>:是为目标板指定的IP地址。

● <nfs_server>:是指定NFS服务器的IP。

● <root_path>:是指定要挂载的NFS服务器的目录。

● root=/dev/nfs:则指定要挂接NFS根文件系统。

● rw:表示按照可读/写属性挂载。

例如:

root=/dev/nfsrwnfsroot=192.168.1.1:/home/share/rootfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:swordzj:eth0:off console=ttySAC0 115200 ehtaddr=08:00:3e:26:0a:5b mem=32M init=/linuxrc

表示挂载服务器 192.168.1.1 的/home/share/rootfs 为根文件系统,目标板的 IP 地址为192.168.1.2。此外还包含以下关于目标板的启动信息。

● 网关地址:192.168.1.1。

● 子网掩码:255.255.255.0。

● 主机名:lc-pc。

● 以太网接口:eth0。

● 以太网MAC:08:00:3e:26:0a:5b。

● 串口设备:ttySAC0(串口1,这是在Linux4.6内核下的设置)。

● 串口数率:115200。

● 内存大小:32MB。

● Init程序路径:/linuxrc。

3.配置内核支持NFS根文件系统

在内核配置中,选中:“File Systems”“Kernel automounter support”“Network File Systems”和“NFS file system support”,配置编译为内核,下载到目标板上启动,如果准备工作没有遗漏,此时NFS根文件系统就可以挂载到内核上了。至此,交叉开发环境就建立起来了。