b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

理解uboot源码的组成(uboot原理)

hacker2022-08-09 00:55:33明日新闻118
本文目录一览:1、作为一个新手,我该如何看懂UBOOT的源代码,我看了几天,还是分析不出那些函数的作用

本文目录一览:

作为一个新手,我该如何看懂UBOOT的源代码,我看了几天,还是分析不出那些函数的作用

拿到代码都是先从整体再到局部的

先看框架 任何symbian复杂的代码都是从UI生产view,view创建container的

很大一部分代码都会和container打交道的,因为它是控件的容器嘛。

不要太去专注人家的算法 先没必要浪费那时间 知道这个类是干什么的 都有什么方法 基本就可以了 还有类与类之间的关系呢 也要搞明白 这个呢 通常调试跟一下 会有所明白吧

代码里肯定会有你不认识不了解陌生的API 你英语好的话 查SDK 英语不好的话 google一下 或多或少都有些答案的

以上是我看代码的一个基本流程吧 当然拿到一分陌生又复杂的代码头很大 但还是有规律可循的 抓住主干UI-

uboot、内核、操作系统、根文件系统他们之间到底是什么关系,求大神指点!!

uboot是个引导启动程序。BIOS自检完成后就把电脑控制权交给uboot,由uboot来加载并引导操作系统运行。

内核就是最最最核心的那部份。操作系统内核就是操作系统的最最最最核心的那些程序。新安装的操作系统中,一些自带的小工具啊,小游戏啊,甚至连键盘鼠标控制功能,这些都不属于内核。内核是不包括硬件驱动程序的。

操作系统就是控制计算机硬件的软件系统。它与内核的区别是它包含硬件驱动和一些基本的实用功能。

根文件系统这个名词很少出现在windows中。在计算机存储中,目录结构都是以树形结构表示的,根就是指这棵树的根部。其他所有目录都是在这个“根”上面逐级分配而来。“根文件系统”因为你加了“系统”二字,所以可以解释为是指“整棵树”,整个“树形结构的文件系统”

它们之间的关系是:BIOS自检---uboot引导----加载内核----操作系统启动---启动完成,系统待机。这几个步骤所需要用到的文件与程序什么的全部存贮在文件系统中。在这几个名词来说,文件系统可以独立存在,但其他几样则无法脱离文件系统而存在。

uboot是什么?

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

拓展资料:

选择U-Boot的理由:

① 开放源码;

② 支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;

③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS;

④ 较高的可靠性和稳定性;

⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;

⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;

⑦ 较为丰富的开发调试文档与强大的网络技术支持。

uboot 引导程序的运行

uboot可以再很多种cpu架构上运行,同时也支持很多开发板,但是每种cpu架构之间有差别,或者开发板的资源不同,假如在某款开发板上能正常引导启动操作系统的话,并不意味着在其他款就能引导启动,建立一款统一的bootloader几乎是不可能的,但是经过大师们的努力,能够实现通过简单的配置改动,就可以实现引导启动很多操作系统(也就是bootloader移植)(uboot是bootloader中的一种,因为其源码是公开的,广受欢迎)

android 源码里有u-boot吗

本人用的android平台用的bootloader用的是uboot,貌似大多数手持设备平台都不用这个,因为功能过于强大用不上,反而显得太复杂了。不知道这个平台开发者是怎么想的。既然用了那就来分析一下,顺便修改一下其中的几个小问题,以符合我们的要求。

uboot等同于其他所有的bootloader程序,从根本上讲是一个稍复杂的裸机程序,是最底层的东西,要分析裸机程序我们要从它的连接文件开始。连 接文件(.lds文件)定义了程序编译之后整个连接过程,这样我们就可以找到这个程序的第一句汇编代码,进而来下一步分析。uboot的链接文件代码在 android\bootable\bootloader\uboot-imx\u-boot.lds

[cpp] view plaincopy

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //文件输出格式

OUTPUT_ARCH(arm)

ENTRY(_start) //首地址标示符

SECTIONS

{

. = 0x00000000; //其实地址0

. = ALIGN(4); //4字节对齐

.text : //代码段

{

board/freescale/mx6q_sabresd/flash_header.o (.text.flasheader) //第一个文件是board/freescale/mx6q_sabresd/flash_header.o

cpu/arm_cortexa8/start.o //第二个cpu/arm_cortexa8/start.o

board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)

lib_arm/libarm.a (.text)

net/libnet.a (.text)

drivers/mtd/libmtd.a (.text)

drivers/mmc/libmmc.a (.text)

. = DEFINED(env_offset) ? env_offset : .;

common/env_embedded.o(.text)

*(.text) //剩余的所有代码

}

. = ALIGN(4);

.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } //readonly data 段

. = ALIGN(4);

.data : { *(.data) } //所有的readonly data

. = ALIGN(4);

.got : { *(.got) }

. = .;

__u_boot_cmd_start = .; //u_boot_cmd段,里面是所有uboot命令的一个列表

.u_boot_cmd : { *(.u_boot_cmd) }

__u_boot_cmd_end = .;

. = ALIGN(4);

_end_of_copy = .;

__bss_start = .; //bss段 就是内存数据段

.bss : { *(.bss) }

_end = .;

}

从上面的代码可以看出我们编译生成的二进制应用程序组成是:代码段-rodata段-uboot命令列表-bss段。我们启动这个应用程序时候是从,0地址开始的,因此我们来看

board/freescale/mx6q_sabresd/flash_header.s这个文件。

这个文件中除了分配内存和宏定义的伪汇编指令以外,真正执行的命令有一条

[cpp] view plaincopy

.section ".text.flasheader", "x"

b _start

.org CONFIG_FLASH_HEADER_OFFSET

也就是说,这个文件一执行就直接跳到_start 位置处。_start 在android\bootable\bootloader\uboot-imx\cpu\arm_cortexa8\ start.S中,因此我们来看这个文件代码

[cpp] view plaincopy

.globl _start

_start: b reset

这里直接跳转的reset中接下来看

[csharp] view plaincopy

reset:

/*

* set the cpu to SVC32 mode cpu设置成32位管理模式

*/

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3

msr cpsr,r0

#if (CONFIG_OMAP34XX) //因为我们的cpu不是ompa的 所以这段不会编译

.............................

#endif

/* the mask ROM code should have PLL and others stable */

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

bl cpu_init_crit

#endif

这里接下来执行cpu_init_crit

[csharp] view plaincopy

/*************************************************************************

*

* CPU_init_critical registers

*

* setup important registers

* setup memory timing

*

*************************************************************************/

cpu_init_crit:

/*

* Invalidate L1 I/D

*/

mov r0, #0 @ set up for MCR

mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs

mcr p15, 0, r0, c7, c5, 0 @ invalidate icache

/*

* disable MMU stuff and caches //关闭mmu

*/

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002000 @ clear bits 13 (--V-)

bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)

orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align

orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB

mcr p15, 0, r0, c1, c0, 0

/*

* Jump to board specific initialization...

* The Mask ROM will have already initialized

* basic memory. Go here to bump up clock rate and handle

* wake up conditions.

*/

mov ip, lr @ persevere link reg across call

bl lowlevel_init @ go setup pll,mux,memory//执行lowlevel_init这个函数代码在

@\bootloader\uboot-imx\board\freescale\mx6q_sabresd\lowlevel_init.S中

@主要对时钟,外部ram,rom等进行了初始化代码不贴了。

mov lr, ip @ restore link

mov pc, lr @ back to my caller

初始化完成后,接下来执行

[csharp] view plaincopy

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate: @ relocate U-Boot to RAM 将uboot重新定位到内存中

adr r0, _start @ r0 - current position of code

ldr r1, _TEXT_BASE @ test if we run from flash or RAM

cmp r0, r1 @ don't reloc during debug测试当前代码是否已经在内存中

beq stack_setup @如果在的话就直接跳转到stack_setup

ldr r2, _armboot_start @如果不在的话,加载_armboot_start地址到r2中。_armboot_start是uboot执行的主体c函数。

ldr r3, _bss_start

sub r2, r3, r2 @ r2 - size of armboot计算bss_start-armboot_start 保存到R2中,也就是uboot的总大小

add r2, r0, r2 @ r2 - source end address 计算出uboot代码和rodata地址

copy_loop: @ copy 32 bytes at a time //开始拷贝

ldmia r0!, {r3 - r10} @ copy from source address [r0]

stmia r1!, {r3 - r10} @ copy to target address [r1]

cmp r0, r2 @ until source end addreee [r2]

ble copy_loop

#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

uboot是什么意思

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

发表评论

评论列表

  • 忿咬风渺(2022-08-09 09:49:59)回复取消回复

    ) lib_arm/libarm.a (.text) net/libnet.a (.text) drivers/mtd/libmtd.a (.text) drivers/mmc/libmmc.a

  • 鸢旧笙痞(2022-08-09 05:19:14)回复取消回复

    目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。拓展资料:选择U-Boot的理由:① 开放源码;② 支持

  • 痛言扮乖(2022-08-09 03:41:58)回复取消回复

    c1, c0, 0 bic r0, r0, #0x00002000 @ clear bits 13 (--V-) bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)