android bootloader lk阶段能读取文件吗

android bootloader lk阶段能读取文件吗,第1张

1.主要功能,红色部分是android特有的纳答一些功能,如fastboot,recovery模式等:

* Variety of nand devices for bootup

* USB driver to enable upgrading images over usb during development

* Keypad driver to enable developers enter ‘fastboot’消改 mode for image upgrades

* Display driver for debugging and splash screen

* Enable Android recovery image and image upgrades

2.配置dram内存大小,供linux kernel使用

The memory tags can be customized inlk/target/<target_name>/atags.c

3.fastboot模式,可以自行打开或洞桥慧者关闭

如,在boot中关闭按键或者usb 驱动,都可以达到此目的

相关文件

k/app/aboot/fastboot.c

lk/app/aboot/aboot.c

4.MTD block setting

可以配置各个mtd image 分区在如下 文件中

lk\target\tcc8900_evm\init.c

static struct ptentry board_part_list[]

5.打开或者关闭splash screen in the bootloader

DISPLAY_SPLASH_SCREEN功能可以来打开关闭

开机时候,boot会从’splash’ MTD分区中读取原始的文件到framebuffer中显示,所以也需要加载display 的驱动

入口函数在 kernel/main.c 中的 kmain(), 以下就来读读这一段 code.

void kmain(void)

{

// get us into some sort of thread context

thread_init_early()

// early arch stuff

arch_early_init()

// do any super early platform initialization

platform_early_init()

// do any super early target initialization

target_early_init()

dprintf(INFO, "welcome to lk/n/n")

// deal with any static constructors

dprintf(SPEW, "calling constructors/n")

call_constructors()

// bring up the kernel heap

dprintf(SPEW, "initializing heap/n")

heap_init()

// initialize the threading system

dprintf(SPEW, "initializing threads/n")

thread_init()

// initialize the dpc system

dprintf(SPEW, "initializing dpc/n")

dpc_init()

// initialize kernel timers

dprintf(SPEW, "initializing timers/n")

timer_init()

#if (!ENABLE_NANDWRITE)

// create a thread to complete system initialization

dprintf(SPEW, "creating bootstrap completion thread/n")

thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE))

// enable interrupts

exit_critical_section()

// become the idle thread

thread_become_idle()

#else

bootstrap_nandwrite()

#endif

}

In include/debug.h: 我们可以看到 dprintf 的第一个参数是代表 debug level.

/* debug levels */

#define CRITICAL 0

#define ALWAYS 0

#define INFO 1

#define SPEW 2

In include/debug.h:

view plainprint?

#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x)} } while (0)

所以 dprintf 会依 DEBUGLEVEL 来判断是否输出信息.

来看第一个 call 的函数: thread_init_early, define in thread.c

view plainprint?

void thread_init_early(void)

{

int i

/* initialize the run queues */

for (i=0i <NUM_PRIORITIESi++)

list_initialize(&run_queue[i])

/* initialize the thread list */

list_initialize(&thread_list)

/* create a thread to cover the current running state */

thread_t *t = &bootstrap_thread

init_thread_struct(t, "bootstrap")

/* half construct this thread, since we're already running */

t->priority = HIGHEST_PRIORITY

t->state = THREAD_RUNNING

t->saved_critical_section_count = 1

list_add_head(&thread_list, &t->thread_list_node)

current_thread = t

}

#define NUM_PRIORITIES 32 in include/kernel/thread.h

list_initialize() defined in include/list.h: initialized a list

view plainprint?

static inline void list_initialize(struct list_node *list)

{

list->prev = list->next = list

}

run_queue 是 static struct list_node run_queue[NUM_PRIORITIES]

thread_list 是 static struct list_node thread_list

再来要 call 的函数是: arch_early_init() defined in arch/arm/arch.c

view plainprint?

void arch_early_init(void)

{

/* turn off the cache */

arch_disable_cache(UCACHE)

/* set the vector base to our exception vectors so we dont need to double map at 0 */

#if ARM_CPU_CORTEX_A8

set_vector_base(MEMBASE)

#endif

#if ARM_WITH_MMU

arm_mmu_init()

platform_init_mmu_mappings()

#endif

/* turn the cache back on */

arch_enable_cache(UCACHE)

#if ARM_WITH_NEON

/* enable cp10 and cp11 */

uint32_t val

__asm__ volatile("mrc p15, 0, %0, c1, c0, 2" : "=r" (val))

val |= (3<<22)|(3<<20)

__asm__ volatile("mcr p15, 0, %0, c1, c0, 2" :: "r" (val))

/* set enable bit in fpexc */

val = (1<<30)

__asm__ volatile("mcr p10, 7, %0, c8, c0, 0" :: "r" (val))

#endif

}

现代 *** 作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,

内存管理单元)提供支持。

CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地

址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA

MMU将VA映射到PA是以页(Page)为单位的,32位处理器的页尺寸通常是4KB。例如,MMU可以通过一个映射项将VA的一页

0xb7001000~0xb7001fff映射到PA的一页0x2000~0x2fff,如果CPU执行单元要访问虚拟地址0xb7001008,则实际访问到的物理地

址是0x2008。物理内存中的页称为物理页面或者页帧(Page Frame)。虚拟内存的哪个页面映射到物理内存的哪个页帧是通过页

表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定一个VA应该映射到什么PA。

*** 作系统和MMU是这样配合的:

1. *** 作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU页表在物理内存中

的什么位置。

2. 设置好之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换 *** 作,地址转换 *** 作由硬件自动完成,不需要用指令

控制MMU去做。

MMU除了做地址转换之外,还提供内存保护机制。各种体系结构都有用户模式(User Mode)和特权模式(Privileged Mode)之分,

*** 作系统可以在页表中设置每个内存页面的访问权限,有些页面不允许访问,有些页面只有在CPU处于特权模式时才允许访问,有些页面

在用户模式和特权模式都可以访问,访问权限又分为可读、可写和可执行三种。这样设定好之后,当CPU要访问一个VA时,MMU会检查

CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令,如果和 *** 作系统设定的页面权限相符,就允许访

问,把它转换成PA,否则不允许访问,产生一个异常(Exception)

常见的 segmentation fault 产生的原因:

用户程序要访问一段 VA, 经 MMU 检查后无权访问, MMU 会产生异常, CPU 从用户模式切换到特权模式, 跳转到内核代码中执行异常服务程序.

内核就会把这个异常解释为 segmentation fault, 将引发异常的程序终止.

安卓系统bootloader模式是什么?如何进入bootloader

在嵌入式 *** 作系统中,BootLoader是在 *** 作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用 *** 作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地粗轿址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

在安卓系统当中,我们可以看出bootloader在系统当中是很底层的东西,如果在刷机的时候损坏了bootloader那肯定是无法开机的,如果问题严重的话可能需要重写底层,所以新手朋友们在刷机之前还是要了解一些刷机的专业知识。俗话说磨刀不误砍柴工,做好之前的学习准备,在刷机遇到问题的时候就更加游刃有余了。

当然有的品牌的手机bootloader是加了锁的,其目的就是为了防止用户私自刷机从而导致系统不稳定。虽然加了锁。但是在用户强烈的要求下还是能对bootloader的解锁。比如:HTC、华为、索尼等机器都能官方解锁,而三星则直接没有给bootloader加锁。

1、何为“Bootloader”?

Bootloader是一个Rom里的固件管理工具。使用它可以让你恢复出厂设置,用Fastboot刷机,加载Recovery工具。

在Bootloader里你也可以查看S-ON/S-OFF的状态,固件和Radio的版本等等。

进入Bootloader无需root或S-OFF。在每台HTC出厂的手机里都有。

2、如何进入Bootloader?

关机,然后按住音量-和电源键。(需要把“快速开机”关闭,在“设置”》“应用程序”里改。或者拔掉电池,让手机真正的关机。)

你可以直接拔电池来退出Bootloader。

如果你装了自制recovery的话,可以进入recovery,然后重启手机。

Android BootLoader及两种刷机模式fastboot和recovery

对于一个android手机用户加软件工程师,刷机而不知道它的内部原理,那是很痛苦的。本着学习的心态,还是去研究了一番。

首先,你要知道智能手机就是一台小电脑,如果你恰好用的是linux系统,那可以说两者在系统层面没有区别。因为android就是linux内核外加java虚拟机。当你开机时,机器首先要启动,CPU最先执行的一段程序就是BootLoader,这和电脑上的BIOS是一个玩意儿。它所做的事情就是初始化硬件,CPU时钟之类的,以及加载内核文件。BootLoader可以分为两个阶段。在阶段一,做了一些初始化,在阶段二,如果发现按键有特殊的组合,比如htc g2是回退键和开机键,就会进入fastboot模式。这里要说的是,内核还没有加载,所以更谈不上多进程任务调度之类的概念,机器只是在顺序执行一条条的指令。

BootLoader既然要做硬件初始化之类的,必然和硬件相关,所以它的代码并非通用的,不同的硬件需要不同的BootLoader代码,各大厂商可能都有自己的,并且加入开机画面之类的。最常听说的是uboot和hboot,后者是htc的bootloader。我们常说的刷机,是不会动bootloader的,只会动这之后的系统部分。

再说fastboot,它是bootloader后期进入的一个特殊阶段。可以通过数据线与电脑连接,然后在电脑上执行一些命令,如刷系统镜像到手机上。fastboot可以理解为实现了一个简单正游的通信协议岩清肆,接收命令并更新镜像文件,其他什么的干不了。

如果没有进入fastboot,bootloader继续执行,如果又发现有特殊的按键组合,比如htc g2上是home键和开机键,则会进入recovery模式。分析recovery.img镜像文件就会发现,它里面包含了一个kernel以及一个可执行程序recovery,以及一些初始化文件。从某种意义来说,这就是一个小型 *** 作系统,和正常启动进入的系统的kernel是一样的,只是init及之后干的事情不同。这里的kernel和我们常说的linux内核还是有差异的,linux内核是包括kernel以及调度器内存管理等除显示界面外完整系统。而kernel只是指内核init进程启动前的那一段逻辑。

在recovery模式下,会加载了部分文件系统,所以才可以读sdcard中的update.zip进行刷机,当然,也可以清除cache和用户数据。

讲到这里,我想说的是,既然recovery是一个小型 *** 作系统并且有手机这样现成的设备,我们可以基于它做些有趣的事,比如移植网络协议及无线网络连接逻辑,然后开发一个命令行版的新浪微博客户端,这样就可以用自己改造的系统发微博了。当然,先改一个hello world版的recovery再说。也许还可以基于这些实践写一些帮助学习 *** 作系统的教程。

如果排除了硬件问题,请检查派袜顷BOOTLOADER中NANDFLASH驱动。我尘陆以前也出现过类似的问题,对NANDFLASH控制器内的寄存器读写问题(时序、参数等问题好碰)可以看看


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8169433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存