LV.13 D6 Linux内核安装及交叉编译 学习笔记

一、tftp加载Linux内核及rootfs

1.1 uboot内核启动命令

bootm    

        启动指定内存地址上的Linux内核并为内核传递参数     

        bootm kernel-addr ramdisk-addr dtb-addr     

        注:         

                kernel-addr:    内核的下载地址           

                ramdisk-addr:    根文件系统的下载地址               

                dtb-addr:        设备树的下载地址         

                若不使用相应的地址,对应的位置写“-”     

        eg:         

                bootm 0x41000000 - 0x42000000    

1.2 uboot自启动参数环境变量

bootargs    

        eg:    

        setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs 

        rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***    

        注:     

                root        根文件系统类型(nfs)     

                nfsroot        网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs)     

                rw          操作网络文件系统的权限(rw)     

                console        控制台(使用串口2,波特率115200)     

                init            init进程的位置(/linuxrc)     

                ip              linux启动后自身的IP(***.***.***.***)

1.3 通过tftp加载内核和根文件系统

实验内容:

        先把Linux内核、设备树、根文件系统放到tftp服务器上(即上次实验创建的根目录下的/tftpboot)。通过设置自启动环境变量,uboot进入自启动模式后。通过tftp,从ubuntu上把Linux内核、设备树、根文件系统加载到内存,然后运行。

实验步骤:

1 、 将资料中“ Linux 内核镜像”目录下的“ uImage ”和“ exynos4412-fs4412.dtb ”拷贝到ubuntu 中 tftp
工作目录下。
将资料中“根文件系统镜像”目录下的“ ramdisk ”也拷贝到 ubuntu tftp 工作目录下
修改这些文件的权限
$ sudo chmod 777 /tftpboot/*
2 tftp 服务器
$ sudo service tftpd-hpa restart
3 、 连接开发板与电脑,在 uboot 交互模式下,设置 uboot 的启动参数
# setenv ipaddr ***.***.***.***
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;tftp 0x43000000 ramdisk.img\;bootm 0x41000000 0x43000000 0x42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
1 xxx.xxx.xxx.xxx ubuntu 主机的 ip ***.***.***.*** 为开发板的 ip ,必须和 ubuntu主机的 ip 在同一个网段(根据自己电脑情况进行设置)
2 :以上设置手动输入,命令粘贴可能会有中文符号
设置完成后保存这些参数
# saveenv
  
        这块开发板外扩了1个G的内存,所以地址0x40000000-0x80000000这段内存是给内存条用的,所以我们把文件下载到这段空间。0x40000000-0x41000000这段空间预留给uboot给内核传递的参数,所以我们从0x41000000开始用。
4 、 检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之后观察 uboot 是否能通过 tftp 加载和启动内核,启动时是否能挂载根文件系统( ext2 ),启动完成后在终端上输入 linux 下的 shell 命令测试是否正常
LV.13 D6 Linux内核安装及交叉编译 学习笔记_第1张图片

二、EMMC加载Linux内核及roofs

        通过上面的方式我们虽然可以加载 Linux 内核和根文件系统并正常运行,但上述方式我们是把内核镜像、设备树、根文件系统镜像都放到了 tftp 服务器上,然后开发板上电之后再通过
tftp 去下载这些文件到开发板的内存中运行;但在实际做一个产品的时候我们不可能每次开
机都通过网络去服务器上下载这些镜像,所以以下步骤我们就将这些镜像安装到开发板上
EMMC 中,然后从 EMMC 启动内核。
1 给开发板重新上电, uboot 交互模式下 ,去下载并安装这些镜像
        下载内核镜像到内存中
# tftp 0x41000000 uImage
将内核镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x800 0x2000
显示如下信息表示安装成功

下载设备树到内存中

# tftp 0x41000000 exynos4412-fs4412.dtb
将设备树写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x2800 0x800
显示如下信息表示安装成功
下载根文件系统镜像到内存中
# tftp 0x41000000 ramdisk.img

将根文件系统镜像写入到 EMMC 中指定的扇区

# mmc write 0 0x41000000 0x3000 0x2000
显示如下信息表示安装成功

 2、 因为要从 EMMC 驱动,所以还要修改 uboot 的启动参数

# setenv bootcmd mmc read 0 0x41000000 0x800 0x2000\;mmc read 0 0x42000000 0x2800 0x800\;mmc read 0 0x43000000 0x3000 0x2000\;bootm 0x41000000 0x43000000 0x42000000
若设置无法保存可尝试如下格式
# setenv bootcmd 'mmc read 0 0x41000000 0x800 0x2000;mmc read 0 0x42000000 0x2800 0x800;mmc read 0 0x43000000 0x3000 0x2000;bootm 0x41000000 0x43000000 0x42000000'
设置完成后保存这些参数
# saveenv
3 、 给开发板重新上电,上电之后观察内核是否能通过 EMMC 加载和启动内核,启动完成后是否能挂载根文件系统(ext2 ),在终端上输入 linux 下的 shell 命令测试是否正常
LV.13 D6 Linux内核安装及交叉编译 学习笔记_第2张图片

 

三、tftp加载Linux内核nfs挂载rootfs

3.1 通过tftp加载内核,通过nfs挂载根文件系统

        在后续的课程中我们会经常修改内核和设备数的源码,也会经常向根文件系统中添加一些
驱动或应用程序,这样每次修改之后我们都要重新将内核或根文件系统安装到 EMMC 中,
步骤会比较繁琐,开发效率也比较低,所以在 开发阶段 我们经常使用的方式是通过 tftp
载内核和设备树再通过 nfs 挂载根文件系统(后续课程都是使用这种方式),这样步骤
简单,效率也比较高,待产品定型之后在安装到 EMMC
实验步骤:
1 、 将资料中“根文件系统镜像”目录下的“ rootfs.tar ”拷贝到 ubuntu nfs 工作目录下
解压根文件系统到nfs工作目录
$ sudo tar xvf rootfs.tar.xz
解压完成后删除原有压缩包
$ sudo rm rootfs.tar.xz
2 、 修改 uboot 的启动参数
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
设置完成后保存这些参数
# saveenv
3 nfs 服务器
$ sudo service nfs-kernel-server restart
4 给开发板重新上电,上电之后观察内核是否能通过 tftp 加载和启动内核,启动完成后是
否能挂载根文件系统( nfs ),在终端上输入 linux 下的 shell 命令测试是否正常,若启动正常我们向 nfs 的工作目录中添加了新的文件之后可以在开发板直接看到
LV.13 D6 Linux内核安装及交叉编译 学习笔记_第3张图片

 

开发板这些文件是通过ubuntu远程共享给开发板的

 test文件在ubuntu上可以执行,而在开发板上无法执行。因为不同架构的机器码和汇编语言是不同的。

如果使用gcc进行编译,则默认生成的可执行文件是x86的

LV.13 D6 Linux内核安装及交叉编译 学习笔记_第4张图片

 如果想在开发板运行。则需用交叉编译器编译

LV.13 D6 Linux内核安装及交叉编译 学习笔记_第5张图片

 

开发板挂载根文件系统时,为什么开发板能精确的挂载到这台电脑的这个目录下的文件?

 答:因为在设置bootargs时设置好了。

LV.13 D6 Linux内核安装及交叉编译 学习笔记_第6张图片

四、EMMC加载uboot

4.1 将uboot安装到EMMC

        以上的几种方式中我们既可以通过网络启动内核也可以将内核安装到 EMMC 中从本地启动,但是对于 uboot 我们一直使用的是从 SD 卡启动,所以我们也可以将 uboot 安装到 EMMC 中然后从 EMMC 启动 uboot ,这样就可以不使用 SD 卡了
1 将资料中“ u-boot 镜像”目录下的“ u-boot-fs4412.bin ”拷贝到 ubuntu tftp 工作目录

 

2、 给开发板重新上电,在 uboot 交互模式下,去下载并安装 uboot

# tftp 0x41000000 u-boot-fs4412.bin

        将内核镜像安装到 EMMC 中指定的扇区

# emmc open 0    //需要先把EMMC打开
# mmc write 0 0x41000000 0x0 0x800
# emmc close 0

之前几次实验,留出了0x0-0x800的这块空间, 就是给uboot留的。

之前给SD卡刷uboot时,是从第1块扇区开始的,因为SD卡的第0块是存储分区表的。这块芯片如果使用SD卡启动,则默认从第1块开始搬移uboot,如果使用EMMC启动,则是默认从第0块开始搬移uboot。

LV.13 D6 Linux内核安装及交叉编译 学习笔记_第7张图片

        显示如下信息表示安装成功

3 、 关闭开发板电源,调整拨码开关位置为 EMMC 启动
4 、 给开发板重新上电,观察 uboot 是否能正常启动
LV.13 D6 Linux内核安装及交叉编译 学习笔记_第8张图片

 因为启动的是 EMMC 中的 uboot 所以环境变量还需要重新设置

LV.13 D6 Linux内核安装及交叉编译 学习笔记_第9张图片

 

你可能感兴趣的:(linux,学习,笔记,arm开发)