1.1标准输入、输出、错误重定向

标准输入文件描述符: 0 默认重定向到键盘
标准输出文件描述符: 1 默认重定向到屏幕
标准错误文件描述符: 2 默认重定向到屏幕
在执行任意一个进程时,默认就会打开这3个标准文件。
(1) 输出重定向格式: <命令> 文件描述符>重定向的文件
命令示例1:
ls 1.c 1>log.txt //重定向标准输出到log.txt
ls 1.c 2>log.txt //重定向标准错误到log.txt
&标准 同等于
ls 2.c >log.txt 2>&1 //标准输出和错误重定向
代码示例2:
#include <stdio.h>
int main()
{
printf(“123456\n”); //输出到标准输出
perror(“abcdefg\n”); //输出到标准错误
return 0;
}
(2) 对输出的文件内容进行排序
示例1:sort 1.c
(3) NFS shell脚本实现目录下载到本地
代码示例:
#!/bin/bash
if [ $# != 3 ]
then
printf “参数格式:./shell.sh IP:目录 <挂载本地目录> <下载目录> \n”
exit 0
fi

mount $1 $2 >log.txt 2>&1

if [ $? != 0 ]
then
printf “mount挂载错误!\n”
exit 0
fi

mkdir $3 >log.txt 2>&1

for file in $2*
do
cp $file $3 -fv >>log.txt 2>&1
data=stat $file
done

umount $2 >log.txt 2>&1
if [ $? != 0 ]
then
printf “取消挂载失败!\n”
exit 0
fi

1.2 程序运行流程分析
(1)程序结构分析:
└── led
├── led.lds //链接文件。创建可执行文件。
├── led-main.c //C语言的源文件
├── Makefile //编译C语言
├── sd_fuse
│ ├── E4412_N.bl1.bin //三星提供的启动文件
│ ├── Makefile //编译生成BL2
│ ├── sd_write.sh //烧写程序到SD卡脚本
│ └── V310-EVT1-mkbl2.c //生成bl2文件的源代码
└── start.S //汇编文件(设置栈空间地址、再调用main函数)

(2).lds链接文件
SECTIONS
{
. = 0x02020000;
.text : { (.text) } //文本段
.rodata ALIGN(4) : {
(.rodata*)} //只读数据段
.data ALIGN(4) : { (.data) } //读写数据段
.bss ALIGN(4) : { *(.bss) *(COMMON) } //BSS段
}
BSS段: 存放未初始化的静态变量和全局变量
ALIGN(4) :4个字节内存对齐
(3)Makefile文件
代码分析:
CC=arm-linux-gcc
led_sp.bin: start.o led-main.o
arm-linux-ld -T led.lds -o led_sp.elf $^ //生成目标文件
arm-linux-objcopy -O binary led_sp.elf led.bin //生成最终开发板运行的文件
arm-linux-objdump -D led_sp.elf > led_sp_elf.dis
//反汇编,led_sp.elf将该反汇编
%.o : %.S
$(CC) -o $@ $< -c
%.o : %.c
$(CC) -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis -f

(4) 分析程序存放的位置:
SD卡: 以扇区单位作为容量。
SD/MMC : 1 Block = 512B //1块的大小512字节
BL1(第一个引导加载程序)位于SD卡512Byte的偏移处连续16个扇区大小8k,IROM仅将8K的BL1代码加载到内部存储器
BL2(第二个引导加载程序)仅位于BL1连续的16个扇区后面从第17个扇区开始连续32个扇区。
查看块设备的大小:# cat /sys/block/sdb/size
dd命令示例:
#烧录命令
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=1seek=1 seek=1seek=signed_bl1_position
解释:
iflag=dsync :输入的文件同步输入
oflag=dsync :输出的文件同步输出
if=./E4412_N.bl1.bin :输入的文件
of=1:输出的位置seek=1 :输出的位置 seek=1:输出的位置seek=signed_bl1_position :设置块的位置
dd iflag=dsync oflag=dsync if=./E4412_N.bl1.bin of=/dev/sdb seek=1
sync :刷新缓冲区,将缓冲区里的数据写入到SD卡里。

问:代码烧写到SD为何不会破坏文件系统?
答:在SD制作启动的时候就已经进行分区.,查看我们知道sd卡的前151M是空出来了没有分配空间,而文件系统是在第151M后开始进行分区的。

如何查看程序是否烧写成功?
可以用磁盘分区工具。查看SD卡扇区的写入情况。与源文件进行对比。,源文件可以用记事本等打开。

1.3 Uboot启动流程
(1) 概述:Uboot: 属于一种引导程序,引导操作系统的启动
(2)过程:IROM、BL1、BL2、UBOOT、启动Linux操作系统、挂载根文件系统
我们使用du –h Uboot.bin查看uboot发现size=272k,而BL2只能存放14Kb-16byte大小,所以BL2.bin存放的是部分uboot
(3) UBOOT主要做什么事情?如何引导操作系统?
作用1:初始化硬件设备,对CPU进行初始化配置。
作用2:主要是初始化DDR内存条,拷贝SD卡第49个扇区之后的代码到DDR内存条,运行DDR指定位置完整的Uboot代码。
(5) Uboot启动内核步骤?
1.将编译好的操作系统内核存储到SD卡的指定位置
2.Uboot启动之后从SD卡指定位置读取内核代码拷贝到DDR内存条里,再执行。
3.操作系统启动完成之后uboot就没用了。
4总结:
操作系统启动之后就会挂载根文件系统,制作根文件系统起始就是自己制作编译linux各种命令。
当内核启动完成之后,就会通过NFS挂载根文件系统,或者将根文件系统放在SD卡或者是EMMC指定分区然后进行挂载。

疑问?
1.uboot如何引导内核?
先从SD卡指定位置读取内核数据,放到DDR,再去执行。
2. uboot如何去指定位置读数据?
3. 将数据读取到DDR指定位置之后,CPU如何去执行?
4. 如何设置UBOOT到指定位置去读取内核数据?1057
5. uboot可以给内核传递参数。通过环境变量。
6. 自己设计自己的uboot命令?
(1)如何使用uboot引导内核,实现更改UBOOT上电自动执行的命令?
(2) 学习如何使用uboot执行LED的程序。测试多种方法?
(3)如何通过uboot给SD卡分区,如何指定文件系统?
(4)如何通过UBOOT读取SD卡上的文件?

(5)如何通过EMMC启动uBOOT和内核,实现EMMC启动?

1.4 Uboot详细启动流程

(1)Uboot简介:
Uboot:是一种开源的bootloader,作用是用来引导操作,给开发人员提供开发调试工具。本身算是1个精简的linux操作系统,主要负责硬件的初始化和引导,本身还带有一些工具,作为引导程序,常作为嵌入式设备的引
导。当真正的系统开始运行的时候 U-boot 就把管理权限交了出去。
(2)选择UBOOT的理由

① 开放源码;
② 支持多种嵌入式操作系统内核,如 Linux、 NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多个处理器系列,如 PowerPC、 ARM、 x86、 MIPS;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合 U-Boot 调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、 SDRAM、 FLASH、 LCD、 NVRAM、 EEPROM、 RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
(3)UBOOT 目录介绍

  • board 目标板相关文件,主要包含 SDRAM、 FLASH 驱动;
  • common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
  • cpu 与处理器相关的文件。如 mpc8xx 子目录下含串口、网口、 LCD 驱动及中断初始化等文件;
  • driver 通用设备驱动,如 CFI FLASH 驱动(目前对 INTEL FLASH 支持较好)
  • doc U-Boot 的说明文档;
  • examples 可在 U-Boot 下运行的示例程序;如 hello_world.c,timer.c;
  • include U-Boot 头文件;尤其 configs 子目录下与目标板文件;相关的配置头文件是移植过程中经常要修改的
    lib_xxx 处理器体系相关的文件,如 lib_ppc, lib_arm 目录分别包含与 PowerPC、ARM 体系结构相关的文件;
  • net 与网络功能相关的文件目录,如 bootp,nfs,tftp;
  • post 上电自检文件目录。尚有待于进一步完善;
  • rtc RTC 驱动程序;
  • tools 用于创建 U-Boot S-RECORD 和 BIN 镜像文件的工具;
    (4) U-BOOT 主要的功能
    *系统引导支持 NFS 挂载、 RAMDISK(压缩或非压缩)形式的根文件系统;支持 NFS 挂载、从 FLASH 中引导压缩或非压缩系统内核;
  • 基本辅助功能强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤以 Linux 支持最为强劲;支持目标板环境参数多种存储方式,如 FLASH、NVRAM、 EEPROM;
  • CRC32 校验可校验 FLASH 中内核、 RAMDISK 镜像文件是否完好;
  • 设备驱动串口、 SDRAM、 FLASH、以太网、 LCD、 NVRAM、 EEPROM键盘、 USB、 PCMCIA、 PCI、RTC 等驱动支持;
  • 上电自检功能 SDRAM、 FLASH 大小自动检测; SDRAM 故障检测; CPU 号;
  • 特殊功能 XIP 内核引导;

(5)U-BOOT 工作模式
U-Boot 的工作模式有启动加载模式和下载模式。启动加载模式是 Bootloader 的正常工作模式,嵌入式产品
发布时, Bootloader 必须工作在这种模式下, Bootloader 将嵌入式操作系统从 FLASH 中加载到 SDRAM 中运行,
整个过程是自动的。下载模式就是 Bootloader 通过某些通信手段将内核映像或根文件系统映像等从 PC 机中下载
到目标板的 FLASH 中。用户可以利用 Bootloader 提供的一些命令接口来完成自己想要的操作
(6)U-BOOT 启动流程
一般 arm 构架 CPU 的流程:
首 arch/arm/cpu/xxx/start.S 进行系统初始化和将 UBOOT 拷贝到其它地方运行。
然后通过调用 start_armboot(arch/arm/lib/board.c)进行一系列的初始化。如果系统没有输入就直接引导统,如果有调用 main_loop(common/main.c)进行处理,并由 common/comand.c 来处 理用户输入命令,来调用具体命令进行操作。
大多数 BootLoader 都分为 stage1 和 stage2 两大部分, U-boot 也不例外。依赖于 cpu 体系结构的代码(如设备初始化代码等)通常都放在 stage1 且可以用汇编语言来实现,而 stage2 则通常用 C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

(1)stage1(start.s 代码结构) arch/arm/cpu/xxx/start.S

U-boot 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口。由于一个可执行的 image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放在 rom(Flash)的 0x0 地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(exception vector)。
(3)设置 CPU 的速度、时钟频率及中断控制寄存器。
(4)初始化内存控制器 。
(5)将 rom 中的程序复制到 ram 中。
(6)初始化堆栈 。
(7)转到 ram 中执行,该工作可使用指令 ldrpc 来完成。
(2)stage2(C 语言代码部分) arch/arm/lib/board.c

lib_arm/board.c 中的 start armboot 是 C 语言开始的函数,也是整个启动代码中 C 语言的主函数,同时还是整个 u-boot(armboot)的主函数,该函数主要完成如下操作:
(1)调用一系列的初始化函数。
(2)初始化 flash 设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有 nand 设备,则初始化 nand 设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写 ip,c 地址等。
(7)进入命令循环(即整个 boot 的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

1.5 UBOOT命令的添加与环境变量分析
1.1增么防止重定义(static关建字使用)
用static函数修饰的函数时静态函数,也是局部函数只能在当前的.c文件使用,是不能被外部所调用的。
1.2 Uboot的命令分析
分析方法:不是每行代码都去看,看重点,关建字,看不懂的值是可以通过print打印出来。
清楚环境变量起始就是在指定位置写入非法值,环境变量是存放在SD卡的指定扇区。居然存放这么多环境变量,肯定是一个结构体来存放的,我们知道设置了环境变量如果不保存的话是不会生效的。如果不保存的话环境变量暂时是存在我们的缓冲区的。我们分析了,按下复位键,环境变量还有说明是写在SD卡指定扇区
步骤:
1.
=> saveenv
Saving Environment to MMC…
Writing to MMC(0)… done
=>
2.搜索字符串“Saving Environment”,source insight查找参考,搜索不到就一个一个查找

S3C4412学习笔记相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. python中查询某个函数的使用方法
  2. “互联网+”从业务本质重构业务形态
  3. static,inline,volatile的作用
  4. WinUsbNet: A managed interface to WinUSB.sys
  5. r9270公版bios_华硕R9270显卡开机不显示故障维修
  6. 超市商品管理系统php,超市商品管理系统(含附源代码)超市商品管理系统(含附源代码).doc...
  7. 广义线性模型和线性回归
  8. 如何加声调口诀_拼音顺口溜儿歌和口诀 学拼音的重点难点详解
  9. SRT软体机器人:等风来不如追风去,“万米蓝海”的探索才刚开始
  10. 不一样的短视频直播软件开发?
  11. Vue实例--音乐播放器:歌单数据接口分析
  12. 在线升级,下载升级包过程中提示网络异常导致升级失败。
  13. 受约束的 Delaunay 2D
  14. 外包?第一份软件测试工作就一路高歌猛进,读书学Z渣一个现在生龙活虎
  15. 三星s20Android11怎么退回10,三星已经开始在GALAXY S20+上测试安卓11系统
  16. please tell me who you are?
  17. PTA 7-32 说反话-加强版 (20分)
  18. 使用vxe-table 制作编辑表格
  19. antd pro 使用
  20. 杨永智:创业者需具备的六大基因 五大攻略(上)

热门文章

  1. 如果了解有10分,对于垃圾邮件你了解几分......
  2. Python中graphics不存在,解决办法
  3. 清华系激光雷达公司,成了量产元年最大的黑马
  4. java初级联系_Java基础练习1(数据类型转换)
  5. 什么是高维组合特征?
  6. 【胖虎的逆向之路】02——Android整体加壳原理详解实现
  7. Python csv 跳过第一行
  8. 微信公众号中图文素材如何实现各种边框等样式
  9. 安卓仿iphone-ibooks的反转视图特效
  10. 操龙兵:非独立同分布学习