目录

一、点亮开发板:移植uboot、Linux内核、文件系统

1.1 配置上位机交叉编译环境

1.2 制作U-boot镜像文件

1.3 通过oflash.exe / openJTAG 烧写u-boot.bin到nand flash

1.4 U-boot的参数设置

1.5  制作Linux kernel镜像文件

1.6 制作文件系统镜像文件

1.7 配置上位机环境服务器环境

1.8 在U-boot下通过网络下载烧写Linux内核和文件系统

二、U-boot启动Linux内核原理简析

一、点亮开发板:移植uboot、Linux内核、文件系统

1.1 配置上位机交叉编译环境,

上位机:Ubuntu 16.04.2

1. 下载交叉编译工具: arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2

2. 解压: tar -xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2

3. 查看解压后的路径: pwd

4. 配置环境变量:sudo vim /etc/profile 在文件最后加上 export PATH=$PATH:/home/qingzhu/Download/gcc/bin/

5. 使新的环境变量生效: source /etc/profile

6. 验证:执行 arm-linux-gcc -v 能看到打印出版本信息说明成功     (如果执行./arm-linux-gcc -v 都报错:no such file or directory, 可能是64位系统兼容问题,执行 sudo apt-get install lib32ncurses5 lib32z1)

1.2 制作U-boot镜像文件:

1. 下载源代码与补丁文件:u-boot-1.1.6.tar.bz2    u-boot-1.1.6_jz2440.patch(开发板配套光盘里有)

2. 解压源代码: tar -xvf u-boot-1.1.6.tar.bz2

3. 打补丁:进入解压后的目录,执行 patch -p1 < ../u-boot-1.1.6_jz2440.patch (实际上就是配置u-boot使其能驱动JZ2440)

3. 修改提示信息(这里是实验u-boot的参数可以通过 CFG_XXX 来配置):/include/configs/100ask24x0.h

4. 返回根目录执行配置: make 100ask24x0_config

5. 编译: make

6. 编译完成会在源代码根目录生成: u-boot.bin(用于下载到开发板),同时在tools目录下生成 mkimage工具(用来制作uImage)

1.3 通过oflash.exe / openJTAG 烧写u-boot.bin到nand flash:

1. 安装:OpenOCD with GUI setup.exe

2. 把u-boot.bin复制到oflash.exe的同目录,运行oflash.exe按提示操作(或者修改cfg.txt:oflash.exe的配置文件)

3.开机,看到新的u-boot的提示信息变成OpenJTAG-qingzhu(如下)

1.4 U-boot的参数设置:

1. 下面显示的是在 /include/configs/100ask24x0.h 中设置的一些u-boot的参数:

2. 下图是在u-boot的命令行下通过 print 命令查看u-boot的参数设置:

1.5  制作Linux kernel镜像文件:

1. 获取源代码linux-2.6.22.6.tar.bz2  和补丁文件linux-2.6.22.6_jz2440.patch

2. 解压源代码,进入解压后的目录,打补丁:patch -p1 < ../linux-2.6.22.6_jz2440.patch

3. 打完补丁根目录下会有config_ok的文件,把它重命名为.config(如果我们自己执行make menuconfig来配置内核,最终也是为了生成.config)

4. 编译:make

5. 编译完成,会生成:/arch/arn/boot/zImage(经过压缩的可直接运行的内核镜像)

6. 制作uImage(为了能被u-boot引导):uImage方式是uboot本身发明的支持linux启动的镜像格式 

  mkimage -A arm -O linux -T kernel -e 0x30007fc0 -a 0x30007fc0 -n linux-2.6.22.6 -d zImage uImage
  (0x30007fc0是从u-boot中获取的,在u-boot中执行 print查看)

1.6 制作文件系统镜像文件:

1. 下载解压busybox源代码,修改Makefile(比如:修改平台为arm,编译工具为arm-linux-等);

2.执行配置:make menuconfig(如果make版本太高会出现兼容性问题,需修改Makefile,并安装libncurses5-dev);

3. 编译:make

4. 安装:make install(指定一个目录,这样不会破坏pc的环境);

5. 在指定目录下会生成 /bin/ /sbin/ /usr/ linuxrc;

6. 创建其他必须的目录:/etc/ /dev/ /lib/ ....

7. 制作文件系统镜像文件:
  mkyaffs2image 目录 xxx.yaffs2

1.7 配置上位机环境服务器环境

现在JZ2440的nand flash已经被我们烧录好了u-boot,通过uboot的网络功能 tftp

>>>>>>>>>
搭建 tftp 服务器:

1. 在线安装:apt-get install tftp-hpa tftpd-hpa
2. 建立传输目录:mkdir /tftpboot
3. 设置访问权限:chmod 777 /tftpboot
4. 修改配置文件:vim /etc/default/tftpd-hpa3

TFTP_USERNAME = "tftp"
TFTP_DIRECTORY = "/tftpboot"
TFTP_ADDRESS = "[::]:69"
TFTP_OPTIONS = "-l -c -s"

Note:
1. tftp下载文件的命令:tftp 服务器IP -g 待下载文件名 -l 目标文件名(比如:tftp 192.168.1.101 -g ledtest -l ./ledtest)
2. 如果下载出现“TFTP ERROR: ‘Permission denied’”,更改服务器上待下载文件的权限:chmod 777 待下载文件
3. 重启tftp服务: sudo service tftpd-hpa restart

ARM开发板的IP地址以及访问的tftp服务器的地址是在uboot里面写死的;
所以要在上位机上安装tftp服务器并配置静态ip地址;

配置eth0静态IP:

比如要设置静态IP为 192.168.1.101:在vim /etc/network/interfaces文末加上如下代码:

auto eth0
iface eth0 inet static
address 192.168.1.101
gateway 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0

1.8 在U-boot下通过网络下载烧写Linux内核和文件系统:
现在我们已经做备好linux内核和文件系统的镜像文件:uImage和xxx.yaffs2
u-boot也已经烧录到nand flash里面(开发板烧录好u-boot之后,就“活了”,因为接下来的linux内核和文件系统的烧录都可以通过u-boot提供的命令来实现)

下面显示的是nand flash的分区信息:是在u-boot的源代码里面写死的


         bootloader              params                            kernel                                           root
|------ 256KB ------|----- 128KB -----|---------------- 2MB -----------------|------------.....------------------|
0                        4_0000              6_0000                                             26_0000

开机进入u-boot shell:
// 烧写Linux kernel
  tftp 30000000 uImage // 把内核镜像下载到内存30000000
  nand erase kernel // 擦除kernel分区
  nand write.jffs2 30000000 kernel // 把内存30000000的内容烧写到kernel分区

// 烧写文件系统(yaffs2)
  tftp 30000000 xxx.yaffs2 // 把文件系统镜像下载到内存30000000
  nand erase root // 擦除root分区
  nand write.yaffs2 30000000 0x260000 $(filesize) // 把内存30000000的内容烧写到root分区,0x260000是root分区的起始地址,$(filesize)表示只烧写文件大小的区域(否则默认会烧写整个root分区,这样可以节省时间)

二、U-boot启动Linux内核原理简析

2.1 uImage结构与U-boot的命令行:

u-boot的使用的是busybox的hush shell,自带了很多命令,比如当我们在u-boot shell环境下执行命令 boot,他会去启动linux,简单分析一下这个过程:
1. 首先获取环境变量 bootcmd;
  
2. nand命令把内核读到内存中,bootm命令表示从内存的某个位置启动。
3. 在u-boot命令行输入:boot (会根据bootcmd参数来启动Linux Kernel)
4. 下图是红色部分是uImage比zImage多出来的文件头(在u-boot/include/image.h中定义了uImage的文件头结构,共64bytes):   

包含如下信息:0x27051956是uImage的魔数;包含OS的类型,架构等等信息。

2.2 U-boot启动的大致流程:
1. u-boot在源代码里配置了一些参数(比如串口的波特率,命令行的提示信息等)给自己用(类似BIOS的 setup menu里面配置的参数);
2. 同时u-boot也会传递参数给Linux kernel(比如 noinitrd 就是告诉linux kernel在加载文件系统时没有initrd可用);

JZ2440使用笔记之熟悉uboot和Linux的移植的更多相关文章

  1. 驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

    驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflas ...

  2. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  3. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  4. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  5. 【linux】U-BOOT与linux kernel通信: struct tag

      欢迎转载,转载时需保留作者信息. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://b ...

  6. uboot引导linux内核过程详解【转】

    http://blog.chinaunix.net/uid-7828352-id-4472376.html 写的不错,尤其是uboot向linux内核传递参数的过程写的比较详细.

  7. Tutorial 01_熟悉常用的Linux操作和Hadoop操作

    (一)熟悉常用的Linux 操作cd 命令:切换目录 (1) 切换到目录“/usr/local” (2) 切换到当前目录的上一级目录 (3) 切换到当前登录Linux 系统的用户的自己的主文件夹  ...

  8. Linux 学习笔记之超详细基础linux命令(the end)

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...

  9. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

随机推荐

  1. linux命令中的字符串中间增加指令,例如路径中增加日期变量,实时获取当前的日期

    `command` 倒引号 (backticks) 在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行.要处理这种情况,我们得用倒单引号来做.fdv=`date +%F` ...

  2. Centos7 启动脚本

    Centos7 启动脚本 启动脚本.如果进程已存在,输出错误信息后退出: #! /bin/bash PIDS=`ps -ef | grep '/usr/bin/node ./index.js' | g ...

  3. go语言学习笔记1 Go开发环境

    什么是Go?Go是一门并发支持.垃圾回收的编译型系统编程语言,旨在创造一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡的一门编程语言. Go的主要特点有哪些?* 类型安全 和 内存安 ...

  4. python程序如何脱离ide而在操作系统上执行

    IDE就像一个婴儿的摇篮,当程序开发好了之后,打包成一个在OS运行的软件,这是算法落地的重要一步.如果只能在IDE上运行,那这个软件有什么意义呢?接下来我就得想办法,把我的程序迁移到win操作系统上执 ...

  5. Eclipse的设置、调优、使用(解决启动卡顿等问题)----转

    eclipse调优 一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善. 加快启动速度 1. ...

  6. HttpClient学习记录-系列1(tutorial)

    1. HttpClient使用了facade模式,如何使用的? 2. HTTP protocol interceptors使用了Decorator模式,如何使用的? URIBuilder respon ...

  7. windows环境下MySQL mysql-5.7.17-winx64 (社区服务版,community server)安装教程

    根据网上查询的资料显示,MySQ在版本5.7开始根目录下没有dada目录,需要额外的“初始化数据库”的操作自动生成data目录. 1.    下载地址: https://cdn.mysql.com// ...

  8. Python----Windous下安装python

    一.  python 安装 1. 下载安装包 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi # 2.7安装包 htt ...

  9. 我对于B-树索引的内部结构与索引类型所做的笔记

    图 3-1 B-树索引的内部结构 分支块和页块 B-树索引有两种类型的块: 用于查找的分支块和用于存储值的叶块.B-树索引的上层分支块包含指向下层索引块的索引数据.在图 3-1 中,根分支块包含条目 ...

  10. 《Mysql 分区分表》

    一:分区/分表 为了什么? - 当MySQL单表的数据量过大时,数据库的访问速度会下降,需要处理大量数据,所以需要把数据分散存储. - 常用 "水平" 切分 二:MySQL常见的水 ...