zoukankan      html  css  js  c++  java
  • 【ARM-Linux开发】ARM嵌入式设备Linux系统启动步骤和方式


    1). 简介

    本文简单介绍ARM嵌入式设备基于嵌入式Linux操作系统时候的启动步骤和启动方式, 区别与X86平台,ARM平台下并没有一个标准的启动步骤,不同ARM SoC都会使用各自定义的boot ROM来实现启动过程,不过大体上面都包含有一些基本步骤。本文就基于Toradex ARM计算机模块和配套载板来介绍基于Freescale i.MX6 ARM嵌入式设备的启动步骤和方式。

     

    2). 启动步骤

    a). 电源上电,系统Reset。

    b). CPU内部boot ROM读取, strapping GPIO数值锁定。

    c). 根据strapping GPIO值和SoC 内部fuse设置确定用于启动的设备。

    d). 从启动设备起始位置读取用于配置DDR RAM和定位boot loader的配置信息。对于i.MX6平台,则使用'image vector table (IVT)' 和 'device configuration data (DCD)' ,如果从NAND设备启动,则还包括 'boot control blocks (BCB)'。

    e). DDR RAM被boot ROM初始化。

    f). boot loader从启动设备复制到RAM执行,至此系统控制交由boot loader.也是从这里,一些定制代码才可以在boot loader里面开始执行。当然也有一些SoC是先将boot loader复制到SDRAM执行后再由boot loader来初始化DDR RAM。

     

    Toradex ARM核心板使用定制化的U-boot作为boot loader,下面就基于此来继续boot loader加载后的启动过程。

     

    g). U-Boot从启动设备上面读取环境变量,如果变量数据损坏或者不存在,则会提示'*** Warning - bad CRC, using default environment' ,然后加载默认初始设置.

    h). U-Boot通过分析环境变量获得kernel和rootfs存储位置,以及所需的kernel command line

    i). U-Boot 自动检测系统RAM和eMMC/Nand Flash容量和参数

    j). U-Boot 设置以太网口MAC地址,并配置好硬件准备加载Linux kernel

    k). U-Boot 加载Linux kernel到RAM,至此系统控制权则转移到kernel来处理

    l). 系统Kernel初始化Linux,加载rootfs,最后启动'init'来初始化Linux user space

     

    3). 启动方式

    a). 默认方式, U-Boot, kernel和rootfs都位与模块自带的eMMC上,全部从eMMC启动。通常情况下的基本模式

    b). U-Boot位于eMMC,从eMMC启动;而kernel和rootfs位于SD卡,从SD卡启动。常用于切换不同的kernel和rootfs版本

    c). U-Boot位于eMMC,从eMMC启动;而kernel从TFTP加载,rootfs从NFS加载。常用于kernel和application开发调试阶段

     

    4). 不同启动方式演示

    这里使用Toradex Apalis i.MX6Q 计算机模块配合Apalis Eva 开发载板来进行测试,平台基本的操作上手指南请见这里。

    软件使用Toradex官方发布的Linux V2.5beta3版本,请从这里下载。

    a). 全部从eMMC启动

    模块默认的U-Boot设置即为全部从eMMC启动,开机上电即可

    b). Kernel和rootfs从SD卡启动

    ./ 准备SD卡:将SD卡(几百MB容量以上,这里使用8GB)分为2个分区,第一个分区为FAT32格式,一般几十MB即可,这里演示操作为1GB;另外一个分区为ext3格式,分配为剩下SD卡容量。

    ----------------------------------

    $ sudo fdisk /dev/sdc

    ...

    命令(输入 m 获取帮助): p

     

    Disk /dev/sdc: 7744 MB, 7744782336 bytes

    255 heads, 63 sectors/track, 941 cylinders, total 15126528 sectors

    Units = 扇区 of 1 * 512 = 512 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disk identifier: 0x00000000

     

       设备 启动      起点          终点     块数   Id  系统

    /dev/sdc1            2048     2099199     1048576    c  W95 FAT32 (LBA)

    /dev/sdc2         2099200    15126527     6513664   83  Linux

     

    $ sudo mkfs.vfat -F 32 -n boot /dev/sdc1

    $ sudo mkfs.ext3 -L fs /dev/sdc2

    ----------------------------------

     

    ./ 制作启动SD卡

    // 复制Linux image 压缩包里面的kernel和device tree文件到FAT32分区

    ----------------------------------

    $ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

    $ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /media/username/boot/uImage

    $ cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /media/simon/boot/imx6q-apalis-eval.dtb

    ----------------------------------

    // 复制Linux image 压缩包里面的rootfs文件夹内容到ext3分区

    ----------------------------------

    $ cd .../Apalis_iMX6_LinuxImageV2.5

    $ sudo cp -Ppr rootfs/* /media/simon/fs/

    ----------------------------------

     

    ./ 将SD卡插入Apalis Eva载板8-bit SD卡插槽, 开机上电进入uboot

    ----------------------------------

    Apalis iMX6 # printenv

    ...

    fdt_file=imx6q-apalis-eval.dtb //确保device tree文件和上面FAT32分区里面的命名一致

    ...

     

    Apalis iMX6 # run sdboot

    ----------------------------------

    ./ 启动后就可以进行正常的应用开发测试了.

     

    c). TFTP/NFS加载kernel/file system启动

    ./ 默认目标版系统和开发主机已经在同一局域网内并通过网内DHCP服务器自动取得IP地址,如果需要手动搭建DHCP服务器,请参考这里。

     

    ./ 配置TFTP Server

    // 在Ubuntu 开发主机通过下面命令建立TFTP Server

    ----------------------------------

    $ sudo apt-get install tftpd-hpa

    $ sudo vi /etc/default/tftpd-hpa

     

    //默认tftp server配置,也可以更换目录,不过需要修改目录group为”nogroup”

     

    $ sudo vi /etc/default/tftpd-hpa

     

    TFTP_USERNAME="tftp"

    TFTP_DIRECTORY="/var/lib/tftpboot"

    TFTP_ADDRESS="[::]:69"

    TFTP_OPTIONS="--secure"

     

    $ sudo service tftpd-hpa start

    //如已经启动,重新加载配置,则可运行

    $ sudo service tftpd-hpa force-reload

    ----------------------------------

    // 复制kernel和device tree文件到TFTP Server文件夹

    ----------------------------------

    $ cd .../Apalis_iMX6_LinuxImageV2.5/apalis-imx6_bin

    $ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-apalis-imx6-20151215145612.bin /var/lib/tftpboot/uImage

    $ sudo cp uImage--3.14.28+gitr0632def1c9981e3974f724025f39b2c1588d8ee6-V2.5b3-imx6q-apalis-eval-20151215145612.dtb /var/lib/tftpboot/imx6q-apalis-eval.dtb

    ----------------------------------

     

    ./ 配置NFS Server

    // 在Ubuntu 开发主机通过下面命令建立NFS Server

    ----------------------------------

    $ sudo apt-get install nfs-kernel-server

    $ sudo vi /etc/exports

    //增加下面NFS配置, ‘10.20.1.111/24’为开发主机IP/Mask配置

    /srv/nfs 10.20.1.111/24(no_root_squash,no_subtree_check,rw,fsid=root)

     

    $ sudo service nfs-kernel-server restart

    ----------------------------------

    // 复制rootfs文件到NFS Server文件夹

    ----------------------------------

    $ cd .../Apalis_iMX6_LinuxImageV2.5

    $ sudo cp -Ppr rootfs/* /srv/nfs/

    ----------------------------------

     

    ./ 配置Apalis i.MX6目标系统

    //开机上电进入Uboot,修改如下参数

    ----------------------------------

    # setenv serverip ‘10.20.1.111’  //TFTP Server IP

    # setenv nfsargs ‘ip=10.20.1.115:10.20.1.111:10.20.1.1:255.255.255.0::eth0:on root=/dev/nfs nfsroot=10.20.1.111:/srv/nfs rw netdevwait’

    // ip = 目标板IP:NFS Server IP:网关:Mask

    // 启动NFS boot

    # run nfsboot

    ----------------------------------

     

    5). 总结

    由上可见,在ARM平台使用和开发的时候可以灵活利用各种启动方式,提供更为方便和高效的开发或使用过程。

  • 相关阅读:
    通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数
    通过游戏学python 3.6 第一季 第七章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号
    通过游戏学python 3.6 第一季 第六章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第五章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第四章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第三章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码 可复制直接使用 娱乐 可封装 函数
    通过游戏学python 3.6 第一季 第二章 实例项目 猜数字游戏--核心代码--猜测次数 可复制直接使用 娱乐 可封装 函数
    C# Thread test demo
    Judicial review(征审系统)Architecture design of the system(系统架构设计)
    SqlServer全局变量是系统预定义的
  • 原文地址:https://www.cnblogs.com/huty/p/8517026.html
Copyright © 2011-2022 走看看