2017-9-13-Linux移植:bootloader烧写
首先看一下Linux启动过程:
Linux启动过程
刚开始最重要的是Bootloader的启动,Bootloader因你改改存放到哪?怎么执行?作用是啥?
bootloader的烧写:
所谓烧写也就是往没有操作系统、更没有文件系统的存储器内copy文件的过程。
先转载一段关于s3c2440 nandflash启动过程的文章:http://mcuos.com/thread-7137-1-1.html
学习一下硬件方面的启动过程,这个非常有必要。
《s3c2440 nandflash启动过程分析》
大部分ARM9的CPU内部都集成有一个SRAM,SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。这样他不需要初始化就能够直接使用。这与我们在外部扩展的大容量的SDRAM是不一样的,外部大容量的SDRAM是需要初始化后才能使用的,这点大家务必要搞清楚。这点在我做过移植的处理器:s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是这样的。在s3c2440这颗CPU上这个SRAM大小为4KB,datasheet里把它叫做Stepping Stone,江湖人称“起步石”。
Nandflash和Norflash是不同的:Norflash像内存一样是直接挂在系统总线上的,这样有足够多的地址线使得CPU能够寻址到每一个存储单元上去,这也意味着CPU能够直接通过总线访问Norflash上存储的内容,同时他还支持XIP(即片上执行,不用将代码搬到内存中,直接在Norflash上就能运行)。 而Nandflash它并不是直接挂载系统总线上,而是通过Nandflash控制器(这个一般集成在CPU内部)来完成读写操作的。如果我们把Norflash的那种寻址方式叫直接寻址的话(不是汇编里的那个直接寻址,这里指CPU能够直接通过地址线访问存储器的存储单元),那么这里的Nandflash就是间接寻址(这里需要Nandflash控制器来寻址)。所以我们在使用Nandflash之前,一定要初始化Nandflash控制器。
理解上面的这点后,就不难理解,为什么系统能够从Norflash直接启动,而不能直接从Nandflash启动。这是因为,ARM在CPU复位时,CPU默认会到0x0000 0000地址处去取指令,而如果我们是从Norflash启动的话(一般Norflash会挂到Bank0,nGCS0上),s3c2440 CPU就会把Norflash的空间挂接到0x0000 0000这段内存空间上。这时CPU就能够直接从Norflash上取指令运行,启动了。而如果是Nandflash, 因为Nandflash他不能直接挂到系统总线上,并且他的读写,擦除操作必须依赖Nandflash控制器,这也就意味着Nandflash的存储空间永远不能映射到0x0000 0000这个地址上去。另外,Nandflash的读写操作也不是这样直接寻址的,有兴趣的同学可以自己看看Nandlfash的datasheet,写一个RAW的Nandflash 擦除,读写操作程序就明白了。我就写过这么一个程序,对理解Nandflash究竟是怎么操作的非常有帮助。
而如果这些CPU要从Nandflash上启动,那该怎么办呢?这就要用到我之前提到的CPU的内部SRAM了。
在S3C2440的datasheet里有提到,如果我们配置从Nandflash启动的话,那么CPU会自动将内部SRAM的地址映射到0x0000 0000这个地址空间上了,而如果不是从Nandflash启动,那么挂载Bank0(nGCS0)上的设备就会被映射到0x0000 0000地址空间上,如我们之前提到的Norflash。如下图所示:
简而言之就是:如果从Nandflash启动,那么CPU内部SRAM被映射到0x0000 0000地址空间上,这时Norflash就不可用了。而如果是从Norflash启动的话,那么Norflash被映射到0x0000 0000地址空间上。我们之前提到ARM CPU在复位时,会默认到0x0000 0000地址上取指令。这样也就是如果从Nandflash启动的话,那么CPU默认会从内部SRAM中取第一条指令;而如果从Norflash启动的话,那么CPU默认从Norflash中取第一条指令。
那如果从SRAM启动的话,那么SRAM中的指令(也就是代码)从哪里来的呢?在s3c2440处理器(arm920t和arm926t的核应该都是这样的,另外我看S3C6410也是如此)上电时,CPU会自动将Nandflash的前4K代码(或叫指令)拷贝到内部SRAM中,这是由CPU自动完成的,不需要我们干预。这也就意味着,SRAM中的内容就是我们Nandflash上前4K的代码了。
这样,如果是在我们的bootloader如u-boot中就要确保,我们编译出來的前4K代码完成以下功能:
1, 初始化CPU,外部SDRAM,Nandflash控制器等基本功能;
2, 将Nandflash上剩余的u-boot代码拷贝到外部的SDRAM中
3, 调到外部的SDRAM中来运行u-boot代码再来看一篇文章:http://blog.csdn.net/sno_guo/article/details/7677148
了解一下bootloader一般怎么少写道nandflash里面。
ARM开发板是依赖 bootloader启动的,是1段小程序,等同x86系统的BIOS,作用是检测硬件并读取内核到内存
bootloader通常需要开发人员手动烧写到ARM板上,而BIOS通常固化在某个硬件里;
通常bootloader是不用自己写的,别人已写好,最多自己改一下,有时候直接就用了;
嵌入式Linux的bootloader最常用的是U-Boot,版本经常更新;
WinCE的bootloader当然是微软自己写的EBoot
向开发板烧写U-Boot之前,开发板的Nand Flash是空的,没有操作系统,更没有文件系统
向没有文件系统的目标板copy文件的过程也就是"烧写"
为了解决这个问题,三星公司在硬件上提供了一种烧写机制,叫dnw,
就是通过USB线把PC机的U-Boot文件上传到目标板上;dnw是基于libusb标准库做的
同时烧写也需要两端都有软件支持,一端是u-boot(u-boot里有dnw),另一端是一个专门的dnw小软件;
烧写的过程:
①usb线连接pc机和目标板;
②此时目标板是空的,需要设置sd卡启动,事先制做的sd卡有个uboot,这样目标板的uboot就起来了
③在PC端通过超级终端等串口软件操作目标板的uboot,输入命令 # dnw 50008000
这句话意思是启动目标板的usb连接并设置目标板接收USB数据的内存起始地址为0x50008000
④在PC端启动那个dnw软件,有windows版也有linux版的,道理相同,都需要libusb库支持
⑤PC端dnw软件:与目标板的USB线路连通后,再发送u-boot.bin文件到目标板
这里发送文件是指发到目标板的内存中,起始地址是0x50008000,注意,这时并没有写到目标板的rand flash
⑥在PC端通过超级终端等串口软件操作目标板的uboot,把目标板内存中的u-boot.bin文件写到rand flash
⑦把目标板内存数据写到rand flash也是uboot命令提供的,其实这时也只有uboot能用;
⑧这里目标板的rand flash里已经烧写好u-boot.bin了,关掉目标板,再设置rand启动就可以了;
在windows下有个dnw软件,是超级终端和dnw和合集用起来很方便,
在Linux下分别用到 minicom 和 dnw 这两个软件
从上面连篇文章中大致可以看到bootloader编译好之后是一个bin文件,需要放到nandflash里面,具体怎么放进去的可能跟具体的ARM芯片相关。编译后的bootloader可执行文件最好小于4k,这样arm9启动之后就可以完整执行bootloader的指令(注意,可执行文件不要说代码,说指令)。
周立功的《iMX283 Linux 开发指南V1.06.01》上面第二章安装Linux系统中可以通过TF卡启动U盘启动的方式给nandflash烧写Linux系统,甚至可以通过网络进行烧写。。Linux太有意思了。。
2017-9-13-Linux移植:bootloader烧写的更多相关文章
- Linux下USB烧写uImage kernel
Linux下USB烧写uImage kernel 1.启动开发板,进入u-boot:(如果开发板中没有系统,可以通过用SD卡方式启动开发板进入) U-Boot 2011.06 (Mar 19 ...
- tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109 版权声明:本文为博主原创文章,转载请注明http://blog.c ...
- [2017.02.13] linux平台下统计C++项目文件个数和代码行数
#输出排序后文件名 file='find . -name "*.[ch]" | sort' #统计文件个数 filecnt='find . -name "*.[ch]&q ...
- 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...
- Arduino 烧写bootloader
什么是bootloader 一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader.这样每次 ...
- tiny6410 烧写uboot 转载
#烧录 参考: 03- Tiny6410刷机指南.pdf 假设拿到的Tiny6410开发板没有提前下载任何程序,包括Bootloader. ##Bootloader - Superboot Super ...
- 【图像处理】【SEED-VPM】5.uImage的烧写 & NFS烧写文件系统
基于 TFTP 烧写 uImage 当用户对 SEED-VPM6467 下的内核驱动源码进行调整或者添加新的设备驱动后,需要对内核进行重新编译配置,编译生成内核镜像后,可以通过 tftp 下载到 SE ...
- 友善之臂tiny4412-1306开发板安卓系统烧写
折腾了很久,终于烧写成功.不废话,咱们说说流程吧. 首先,我们需要有一个基于tiny4412的kernel,从友善之臂官网获取. 然后解压: 1.tar -xvf linux-3.5 .... 然后 ...
- nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?
我用的是ramdisk.image.gz,烧写在flash的0x10140000处 我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的? 如果ramdisk.image.gz在flas ...
随机推荐
- bzoj2200拓扑排序+最短路+联通块
自己写的不知道哪里wa了,明明和网上的代码差不多.,. /* 给定一张图,有的边是无向边,有的是有向边,有向边不会出现在环中,且有可能是负权值 现在给定起点s,求出s到其余所有点的最短路长度 任何存在 ...
- ajax之全局函数
1.全局函数:$.each(array,function(){1,value}),通过$/jQuery直接调用 对象函数:$("#name").val(); jQuery UI:$ ...
- C++ Primer 笔记——标准库类型string
1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...
- 卸载列表信息——Uninstall注册表
今天用InstallShield打包了一个安装程序,安装顺利完成了,但是当我去控制面板准备卸载时,发现我的程序没有详细的信息,正常的软件信息如下图: 而我的程序没有发布者,大小和版本,也没有图标,于是 ...
- Python面向对象 三大特性 综合案例+1(视频里的作业)
class Dog: # 在创建一个小狗实例的时候,给它设置几个属性 def __init__(self, name, age = 1): self.name = name self.age = ag ...
- RHEL7恢复root密码
RHEL7恢复root密码 首先关闭SELINUX [root@panda ~]# getenforce Disabled 然后重启,按↑↓键,进入如下界面,选择第一项,按下e键进行编辑 在此界面找到 ...
- XmlSerializer 实现序列化CDATA
[XmlIgnore] public string GuestRemarks { get; set; } [XmlElement("GuestRemarks")] public X ...
- org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.
1.启动hive的过程中,[hadoop@slaver1 soft]$ hive --service metastore &错误如下所示: 原因:之前启动hive失败了,但是进程以及启动起来, ...
- 一脸懵逼学习keepalived(对Nginx进行热备)
1:Keepalived的官方网址:http://www.keepalived.org/ 2:Keepalived:可以实现高可靠: 高可靠的概念: HA(High Available), 高可用性集 ...
- Javascript中函数提升和变量提升
词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active ...

