天天看点

内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND

内核启动全攻略——小白学ARM(九)

  • 网络环境搭建
  • 下载内核
  • 启动内核
  • 内存与NAND

网络环境搭建

上一篇博客这块写的有些乱,这里重写:

要启动内核,得先下载内核,内核下载离不开uboot,用uboot自带的tftp网络下载功能,可以将内核下载到板上。

怎么搭建tftp环境呢,

  1. 用普通网线将mini2440连接到路由器的LAN口,即图上黄色接口。
  2. 确保你连上的路由器是可以上网的(其实不能上网也没事)
  3. 笔记本电脑连上该路由器的wifi,这样你的板子和电脑就在同一个网段了。(台式机连上该路由器拉出的网线)
    内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND
  4. 确保板子和电脑可以互相ping通:进入uboot命令行模式(不知道怎么进入该模式参考上篇博客),输入

    print

    可以查看板子的IP地址,如图,ipaddr就是板子的ip地址,一般默认的ip不正确,需要修改
    内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND
    运行cmd,输入命令

    ipconfig

    ,查看电脑的ip地址,如图所示,电脑ip地址为192.168.1.100,那么我们就将板子的地址改为192.168.1.120,保证前三段一致,这个“120”是我随便设的,只要不是100就行。

    修改方法为:在uboot命令行下输入:

修改好板子IP,再修改服务器ip,修改为电脑的ip

完了之后再保存一下

saveenv
           

这样修改的内容就保存到nand里了,掉电不丢失,否则只是修改了内存中的环境变量,再上电会发现修改的内容又变回去了。

内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND
内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND

至此,tftp环境基本搭建完成,可以在uboot命令行中输入,ping电脑的ip

内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND

可以看到最后一句:host 192.168.1.100 is alive

说明板子和电脑可以通过网络通信了。

下载内核

这步比较简单,电脑先安装一个小软件:Tftpd64

打开大概是这样的

内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND

上面的路径里,存放着你要用TFTP传输的文件,这里我们吧uImage.bin文件放进去,

这个uImage.bin文件就是传说中的内核。

确保这个软件打开,IP地址栏选择本机的ip

进入uboot命令行,确保板子ip和服务器IP都修改正确后

输入:

tftp 0x31000000 uImage
           

稍等片刻,可以看到uImage正在传输,待传输完成,内核就下载到板子里了。

启动内核

紧接着,在uboot命令行中输入:(注意,地址与上面下载地址“0x31000000”要一致)

可以看到内核自行启动。

至此内核启动完成。

如果启动过程卡在“starting kernel…”

很可能是你下载的内核与板子不匹配,或者内核规定的下载地址并不是“0x31000000”。

内存与NAND

为甚讲这个呢,因为tftp下载到板子的数据,并不是直接存储在nand里,更不是nor flash里,而是存在内存里,是会断电丢失的,这也就能解释为什么下载时需要指定一个“0x31000000”这样的内存地址。

mini2440的nand flash 分区如下图所示,代码部分说明各分区起始地址和分区大小。

目前我们的uboot,即图上bootloader,是存放在nor flash中,方便我们下载其他文件。

内核文件我们下载到内存中,都没有放到flash对应位置,等学会了内核剪裁,uboot编译,驱动编写后,最后成品,也即交给用户的产品是要按下图所示分区存放的,这里只是扩展一下,以防要素过多,搞不清各数据到底存放在哪里。

内核启动全攻略——小白学ARM(九)网络环境搭建下载内核启动内核内存与NAND
static struct mtd_partition friendly_arm_default_nand_part[] = {
         [0] = {
                   .name = "supervivi",
                   .size = 0x00040000,
                   .offset = 0,
         },
         [1] = {
                   .name = "param",
                   .offset = 0x00040000,
                   .size = 0x00020000,
         },
         [2] = {
                   .name = "Kernel",
                   .offset = 0x00060000,
                   .size = 0x00500000,
         },
         [3] = {
                   .name = "root",
                   .offset = 0x00560000,
                   .size = 1024 * 1024 * 1024, //
         },
         [4] = {
                   .name = "nand",
                   .offset = 0x00000000,
                   .size = 1024 * 1024 * 1024, //
         }
};