关于如何给开发板启动操作系统程序:
1.开发板上操作系统启动的步骤:
1.启动引导程序bootloader,用来给操作系统内核启动准备环境
2.启动操作系统内核
3.挂载根文件系统
2.具体的步骤分为:
1.引导程序bootloader只是一类的总称。实验中用的是uboot这个启动程序来作为开发板启动程序,我们需要利用jflash将uboot程序烧录到开发板的norflash中。在开发板一上电,pc程序计数器就会指向0地址,也就是bootloader程序,然后bootloader程序开始启动执行。bootloader的作用是为内核启动准备环境。
具体的需要初始化的有:
1.初始化cpu的工作模式
2.初始化堆栈
3.初始化时钟
4.初始化看门狗
5.初始化异常向量表
6.初始化内存
7.关闭cache
8.关闭mmu
9.初始化相关的硬件设备
10.继承相关的通信协议
11.搬移内核到内存
12.向内核传参 ---根文件系统的位置
13.引导内核启动。
bootloader有两种启动方式:
1.nandflash。bootloader程序在nandflash中的第0块位置,通过专用程序可以将nandflash中的bootloader程序的前4k放进cpu中的IRAM中,然后执行这前4k的程序,在这前4K的程序中初始化好内存,然后将bootloader剩下的程序加载进入内存继续执行。
2.norflash.bootloader在norflash中的启动方式就比较简单(因为norflash和内存一样,可以利用地址总线和数据总线,控制总线来获得其中的数据)。当开发板一上电,cpu中的pc程序计数器就指向norflash的0地址单元(bootloader就存放在这个位置),然后开始执行bootloader程序。
2.启动操作系统内核
启动操作系统内核也分为两种方式:
1.nandflash:nandflash的大小为256M,比起norflash的2M要大许多,所以可以直接将操作系统烧到nandflash中(nandflash和内存的结构不一样,CPU不能通过总线直接读写nandflash中数据)。这种启动操作系统的方式是bootloader程序将操作系统内核加载到内存中(在项目学习中是加载到0x30008000)。在·
在nandflash中:
第0块区域:bootloader
第1块区域:引导内核启动时给内核程序传递的参数;环境变量
第2块区域:操作系统内核
第3块区域:根文件系统
2.bootloader程序通过tftp服务将Ubuntu中下载好的内核下载到内存的指定位置(0x30008000)。在uboot中的指令为 :tftp 0x30008000 uImage。 tftp是一种简单文件传输协议,在项目中,Ubuntu作为服务器,配置好tftp的设置之后,将uImage放进tftpboot文件夹下。在开发板上,想要通过tftp获得Ubuntu中的内核,需要先与服务器的网络联通(可以使用ping命令查看是否与目的主机连接成功,如果能连接成功,但是却无法通过tftp下载,可以查看Ubuntu上tftfboot文件夹的权限是否更改,更改指令为 chmod -r tftpboot 777)。连通之后,就可以用tftp 0x30008000 uImage来获得内核文件。
3.挂载根文件系统
1.nandflash:在nandflash的第3块中,存放着需要挂载的根文件系统,直接通过nandflash 挂载第三块中的根文件系统即可。
2.nfs挂载根文件系统:可以在uboot中配置参数(在内核加载块结束的时候,会挂载根文件系统),
指令为: setenv bootargs root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs ip=192.168.1.xx console=ttySAC0,115200 init=/linuxrc
在这个指令中:root:根文件系统的类型(在这里为nfs挂载类型)
nfsroot:表示这个根文件系统的具体位置。
IP:这里的IP是指在内核启动过程中开发板的ip地址。通常是自己设置,只要与自己的服务器主机处于同一网段之下就行。
console:ttySAC0代表串口,115200代表串口通信的波特率。
init:这个是内核启动结束后运行的程序。
在uboot启动程序中一些常用的指令:
reset:复位。pc从0位置开始重新执行。
print/printenv:查看环境变量。
help/?:查看帮助手册
setenv key value :设置环境变量
setenv key :删除环境变量
saveenv:保存更改到norflash中。
bootcmd 'tftp 0x30008000 uImage;bootm 0x30008000':这个指令用来在开机启动时,倒计时结束会自动执行的指令setenv。需要加 ‘ ’,如果不加‘’,则会直接执行这个tftp 0x30008000 uIe.mag
注意:环境变量是保存在nandflash中,如果不保存的话,下一次上电从这里读取环境变量的时候,只会是上次保存后的结果。所以在每次修改环境变量之后,都需要执行一下这个指令。
tftp 0x30008000(内存地址) uImage(下载的文件):tftp指令是将想要下载的文件下载到指定的内存地址处。
注意:这个操作在每次上电之后,都需要执行一次。因为是通过tftp从Ubuntu中将内核程序下载到内存中,内存是易丢失存储。在每一次重新上电之后都需要将内核下载到指定的内存地址处。
bootm 0x30008000(内存地址):bootm指令指专门用来启动内核程序的,它会传递给内核程序参数。