首先声明,俺并非android的开发人员,连业余的爱好者都算不上;俺是一负责手机营销的市场经理。所以,以下问题,请大家不要见笑关于智能手机,特别是安卓,一直有若干技术疑问:1.智能手机的启动顺序,在进入Android、Windows Phone等手机操作系统之前之前,CPU内核加电之后,有如同电脑BIOS一样的一个环节吗?那部分的技术名字?以什么格式写成?存储于手机内何位置?是独立的芯片吗?2.存储“问题1”中这段启动引导程序的芯片与手机主板/CPU间数据交换的通道?速率?这一段引导程序,与手机操作系统的关系?不同机型是不同的吗?还是基本一样?3.让手机开机先读取“问题5”中那段引导程序、的程序是什么指令,在何芯片?是内置于CPU的吗?4.有些山寨智能机,可以同时装Android、Windows Phone,每次开机时使用者可以选,是在这个环节吗?

解决方案 »

  1.   

    bootloader存储于手机内何位置?是独立的芯片吗?储存它的芯片与手机主板/CPU间数据交换的通道?速率?让手机开机先读取bootloader的是什么指令,在何芯片?是内置于CPU的吗?
      

  2.   

    1、就是1楼所说。类似于PC的bois但功能远弱于bios。
    2、启动代码的正常放置位置,与其它的所有代码一样都存于nand flash中,也许有早期系统需要额外的nor flash来存放它,现在应该没有这样的落后系统了(多个器件,成本问题)。这些代码都是指令相关的自然码,开发者一般用elf格式打包。不同CPU体系芯片的bootloader代码自然不一样(因为指令体系)但原理不外乎就是加载操作系统。它与操作系统无关,操作系统是被加载的东西。
    3、芯片内部,必有一ROM CODE掩膜区域,很短的代码但是最基础的,至少包含对芯片局部时钟和外部flash通道的初始化代码,按工业标准的通信格式去读最初的一个或几个基本存储块,此后被读到的代码运行,系统就象滚雪球般长大了。
    4、bootloader做大改动就可达此目的。
      

  3.   

    1. 这部分叫bootloader,不同的硬件体系结构已经有一些不同的实现,譬如arm中常见的uboot,mips中的eboot。它的主要作用如其名字,boot,load。格式如3楼所言,通常做成elf格式,通常会把它存放在nandflash的起始位置。
    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
      

  4.   


    您是说bootloader与使用者自行下载的某个APK应用都放置在同一块nand flash中吗(从物理的角度看)?只是,把bootloader烧写到最低地址?也就是,从手机消费者的角度说,智能手机无论是bootloader,还是ANDROID的的系统文件,还是某个APK,或者一张照片(不考虑外置TF卡),都存储于同一块"8G机身内存"中?
      

  5.   

    我觉得有必要分清bootloader,kernel,文件系统三者的关系,apk文件通常是放在/system/app下,是存在于文件系统中,根文件系统和kernel可以编译到一起,也可以分开。如果分开,就要烧写到nandflash的三个不同地址空间处。但是不意味着同一块nandflash,因为大部分cpu可以外接不止一块nandflash,但所有外接的nandflash不会占据同样的地址空间。
    对大多数硬件体系,bootloader会在最低地址,因为cpu的指令寄存器PC复位后是0x00,指向最低地址,我们要保证复位后第一条指令是bootloader来提供的。这里其实有更复杂的过程,因为涉及到不同启动方式以及nandflash通常不会映射到CPU物理地址的最低处,但可以简单的这么理解。
    我不太清楚8G机身内存是如何计算的,如果指的是CPU上的rom和外部nandflash的总和的话,是的
      

  6.   

    非常感谢上面的回复!还有以下一些细节,希望了解,不要笑话俺啊
    如您所说,若bootloader与apk文件在多数情况下,并不存储于物理上同一块nandflash;那么:
    1.存储bootloader的nandflash与其他nandflash是否一样?它的大小?2.特别是存储bootloader的nandflash与CPU之间数据交换的通道与速率,和其他块nandflash与CPU的数据交换是否一样?
      

  7.   

    我想你理解错我的意思了,我并不是说bootloader和apk文件在多数情况下不存储在同一块nandflash上。
    bootloader只会占据nandflash的一小块空间,其他空间可以存储其他东西,其实就是一个nandflash分成几个分区的意思,这由开发者决定。譬如,你可以在同一块nandflash上存储bootloader,kernel和根文件系统。apk是存在于文件系统中,简单起见,我们假设根文件系统占据了nandflash的一个分区,但其他设备仍然可以挂接到根文件系统,譬如sd卡,通常是挂接在根文件系统的/mnt/sdcard下的。
    如果存在多块nandflash,其与cpu交换数据的速率是一样的,速度很大程度取决于nandflash的性能。