自学内容网 自学内容网

内核驱动-如何在开发板启动操作系统

关于如何给开发板启动操作系统程序:
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中。
    注意:环境变量是保存在nandflash中,如果不保存的话,下一次上电从这里读取环境变量的时候,只会是上次保存后的结果。所以在每次修改环境变量之后,都需要执行一下这个指令。
tftp 0x30008000(内存地址) uImage(下载的文件):tftp指令是将想要下载的文件下载到指定的内存地址处。
    注意:这个操作在每次上电之后,都需要执行一次。因为是通过tftp从Ubuntu中将内核程序下载到内存中,内存是易丢失存储。在每一次重新上电之后都需要将内核下载到指定的内存地址处。

bootm 0x30008000(内存地址):bootm指令指专门用来启动内核程序的,它会传递给内核程序参数。
 


原文地址:https://blog.csdn.net/m0_65525748/article/details/142523767

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!