首先声明,俺并非android的开发人员,连业余的爱好者都算不上;俺是一负责手机营销的市场经理。所以,以下问题,请大家不要见笑关于智能手机,特别是安卓,一直有若干技术疑问:1.智能手机的启动顺序,在进入Android、Windows Phone等手机操作系统之前之前,CPU内核加电之后,有如同电脑BIOS一样的一个环节吗?那部分的技术名字?以什么格式写成?存储于手机内何位置?是独立的芯片吗?2.存储“问题1”中这段启动引导程序的芯片与手机主板/CPU间数据交换的通道?速率?这一段引导程序,与手机操作系统的关系?不同机型是不同的吗?还是基本一样?3.让手机开机先读取“问题5”中那段引导程序、的程序是什么指令,在何芯片?是内置于CPU的吗?4.有些山寨智能机,可以同时装Android、Windows Phone,每次开机时使用者可以选,是在这个环节吗?
2、启动代码的正常放置位置,与其它的所有代码一样都存于nand flash中,也许有早期系统需要额外的nor flash来存放它,现在应该没有这样的落后系统了(多个器件,成本问题)。这些代码都是指令相关的自然码,开发者一般用elf格式打包。不同CPU体系芯片的bootloader代码自然不一样(因为指令体系)但原理不外乎就是加载操作系统。它与操作系统无关,操作系统是被加载的东西。
3、芯片内部,必有一ROM CODE掩膜区域,很短的代码但是最基础的,至少包含对芯片局部时钟和外部flash通道的初始化代码,按工业标准的通信格式去读最初的一个或几个基本存储块,此后被读到的代码运行,系统就象滚雪球般长大了。
4、bootloader做大改动就可达此目的。
2. bootloader主要是对硬件的初始化,为操作系统的启动做准备工作,之后它会负责把kernel加载到内存,跳转到kernel的入口点,这样kernel就会启动起来。bootloader与机型无关,原因如3楼所言
3. 如果我们分析uboot中的start.s就会发现,在入口处都是一些中断向量,每个向量占用4个字节,其中第一个就是复位向量,也就是占用nandflash的0x00 - 0x03这个地址的向量。对于arm来说,上电(即复位)后执行的第一条指令就是这四个字节(arm每条汇编指令占据4字节),我们通常会在此处放置一个跳转指令,跳转到另一段初始化的代码处。
4. 首先我们要分清bootloader和kernel是两段不同的程序(我们假设文件系统都是编译到内核中去的,忽略掉),通常会烧写到nandflash的不同位置,这里假设nandflash地址由低到高划分为3个空间,A,B,C,我们可以把bootloader烧写到A处(最低地址),剩下B,C分别烧写不同的kernel,启动B还是C完全由A来决定,我们只要在bootloader中稍做修改即可实现启动不同kernel
您是说bootloader与使用者自行下载的某个APK应用都放置在同一块nand flash中吗(从物理的角度看)?只是,把bootloader烧写到最低地址?也就是,从手机消费者的角度说,智能手机无论是bootloader,还是ANDROID的的系统文件,还是某个APK,或者一张照片(不考虑外置TF卡),都存储于同一块"8G机身内存"中?
对大多数硬件体系,bootloader会在最低地址,因为cpu的指令寄存器PC复位后是0x00,指向最低地址,我们要保证复位后第一条指令是bootloader来提供的。这里其实有更复杂的过程,因为涉及到不同启动方式以及nandflash通常不会映射到CPU物理地址的最低处,但可以简单的这么理解。
我不太清楚8G机身内存是如何计算的,如果指的是CPU上的rom和外部nandflash的总和的话,是的
如您所说,若bootloader与apk文件在多数情况下,并不存储于物理上同一块nandflash;那么:
1.存储bootloader的nandflash与其他nandflash是否一样?它的大小?2.特别是存储bootloader的nandflash与CPU之间数据交换的通道与速率,和其他块nandflash与CPU的数据交换是否一样?
bootloader只会占据nandflash的一小块空间,其他空间可以存储其他东西,其实就是一个nandflash分成几个分区的意思,这由开发者决定。譬如,你可以在同一块nandflash上存储bootloader,kernel和根文件系统。apk是存在于文件系统中,简单起见,我们假设根文件系统占据了nandflash的一个分区,但其他设备仍然可以挂接到根文件系统,譬如sd卡,通常是挂接在根文件系统的/mnt/sdcard下的。
如果存在多块nandflash,其与cpu交换数据的速率是一样的,速度很大程度取决于nandflash的性能。