关闭

lk boot bootimg

278人阅读 评论(0) 收藏 举报
分类:
在aboot.c 中
APP_START(aboot)
.init = aboot_init,
APP_END
会为aboot_init new 一个thread(前面已经讲过了)
void aboot_init(const struct app_descriptor *app)
{
if (keys_get_state(KEY_BACK) != 0)
goto fastboot;


boot_linux_from_flash();
dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
"to fastboot mode.\n");


fastboot:
}


这个函数首先判断用户是否按下back key,如果按下就进入fastboot ,否则就从flash上copy bootimg到dram中。其中fastboot 中有个continue的命令也是调用boot_linux_from_flash 来从flash上将booting copy到dram。
fastboot_register("continue", cmd_continue);
void cmd_continue(const char *arg, void *data, unsigned sz)
{
boot_linux_from_flash();
}
看到了吧
我们继续看boot_linux_from_flash 


int boot_linux_from_flash(void)
{
struct boot_img_hdr *hdr = (void*) buf;
unsigned n;
struct ptentry *ptn;
struct ptable *ptable;
unsigned offset = 0;
const char *cmdline;


首先得到flashlayout
ptable = flash_get_ptable();
if (ptable == NULL) {
dprintf(CRITICAL, "ERROR: Partition table not found\n");
return -1;
}
从flashlayout 中找到boot partition
ptn = ptable_find(ptable, "boot");
if (ptn == NULL) {
dprintf(CRITICAL, "ERROR: No boot partition found\n");
return -1;
}
先读取bootimg 2k的head
if (flash_read(ptn, offset, buf, 2048)) {
dprintf(CRITICAL, "ERROR: Cannot read boot image header\n");
return -1;
}
offset += 2048;
看bootimg是否有Android这个字样
if (memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
dprintf(CRITICAL, "ERROR: Invaled boot image heador\n");
return -1;
}
从bootimg中的得到kernel size
n = ROUND_TO_PAGE(hdr->kernel_size);
if (flash_read(ptn, offset, (void *)hdr->kernel_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read kernel image\n");
return -1;
}
offset += n;


从bootimg中的得到ramdisk size,并copy到dram中


n = ROUND_TO_PAGE(hdr->ramdisk_size);
if (flash_read(ptn, offset, (void *)hdr->ramdisk_addr, n)) {
dprintf(CRITICAL, "ERROR: Cannot read ramdisk image\n");
return -1;
}
offset += n;


dprintf(INFO, "\nkernel  @ %x (%d bytes)\n", hdr->kernel_addr,
hdr->kernel_size);
dprintf(INFO, "ramdisk @ %x (%d bytes)\n", hdr->ramdisk_addr,
hdr->ramdisk_size);


检查bootimg中是否包含cmdline


if(hdr->cmdline[0]) {
cmdline = (char*) hdr->cmdline;
} else {
cmdline = DEFAULT_CMDLINE;
}
dprintf(INFO, "cmdline = '%s'\n", cmdline);


/* TODO: create/pass atags to kernel */


dprintf(INFO, "\nBooting Linux\n");
boot_linux((void *)hdr->kernel_addr, (void *)TAGS_ADDR,
  (const char *)cmdline, LINUX_MACHTYPE,
  (void *)hdr->ramdisk_addr, hdr->ramdisk_size);


return 0;
}




调用boot_linux 继续boot kernel
void boot_linux(void *kernel, unsigned *tags, 
const char *cmdline, unsigned machtype,
void *ramdisk, unsigned ramdisk_size)
{
unsigned *ptr = tags;
给entry赋值,就等于hdr->kernel_addr。
void (*entry)(unsigned,unsigned,unsigned*) = kernel;
struct ptable *ptable;


/* CORE */
*ptr++ = 2;
*ptr++ = 0x54410001;


传递ramdisk 给的size 和 address 给kernel,其中0x54410001是个magic number.


if (ramdisk_size) {
*ptr++ = 4;
*ptr++ = 0x54420005;
*ptr++ = (unsigned)ramdisk;
*ptr++ = ramdisk_size;
}


传递flashlayout给kernel,其中0x4d534d70是个magic number.


if ((ptable = flash_get_ptable()) && (ptable->count != 0)) {
int i;
*ptr++ = 2 + (ptable->count * (sizeof(struct atag_ptbl_entry) /
      sizeof(unsigned)));
*ptr++ = 0x4d534d70;
for (i = 0; i < ptable->count; ++i)
ptentry_to_tag(&ptr, ptable_get(ptable, i));
}


传递(cmdline 给kernel,类似uboot的bootargs 。其中0x54410009是个magic number.


if (cmdline && cmdline[0]) {
unsigned n;
/* include terminating 0 and round up to a word multiple */
n = (strlen(cmdline) + 4) & (~3);
*ptr++ = (n / 4) + 2;
*ptr++ = 0x54410009;
memcpy(ptr, cmdline, n);
ptr += (n / 4);
}


/* END */
*ptr++ = 0;
*ptr++ = 0;


dprintf(INFO, "booting linux @ %p, ramdisk @ %p (%d)\n",
kernel, ramdisk, ramdisk_size);
if (cmdline)
dprintf(INFO, "cmdline: %s\n", cmdline);


enter_critical_section();
platform_uninit_timer();
关掉cache和mmu
arch_disable_cache(UCACHE);
arch_disable_mmu();
调到entry开始执行kernel,传递三个参数,第一个固定为0,第二个machtype被定义成LINUX_MACHTYPE,一般在对应平台的init.c中定义,第三个参数tags,就是传给给kernel的参数.
entry(0, machtype, tags);
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

漫谈android系统(2)androidLK启动过程1

andoid的启动过程1通过audio口所吐出的log,我们可以发现android的启动还是非常之有趣的,因而在此对它的启动做相应的分析。在此分析LK的启动过程,LK就是bootloader。现在只截...
  • u013983194
  • u013983194
  • 2016-04-28 10:07
  • 1439

lk启动流程详细分析

转载请注明来源:cuixiaolei的技术博客  这篇文章是lk启动流程分析(以高通为例),将会详细介绍下面的内容:1).正常开机引导流程2).recovery引导流程3).fastboot引导流程4...
  • LoongEmbedded
  • LoongEmbedded
  • 2016-08-29 19:58
  • 3198

ubuntu下修改boot.img的方法

一下操作的前提是手机以获得root权限 1、备份boot.img     首先 adb shell 进入手机终端,然后执行 cat /proc/mtd 命令,察看机器的分区情况。如下图: 可以看到...
  • ydt_lwj
  • ydt_lwj
  • 2014-03-18 11:04
  • 2814

深入MTK平台bootloader启动之【 lk -> kernel】分析笔记

接上一篇分析: 《深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记》 Pre-loader 运行在ISRAM,待完成 DRAM 的初始化后,再将lk载入DRA...
  • forever_2015
  • forever_2015
  • 2016-11-05 22:18
  • 5628

MTK lk源码解析5( lk 阶段aboot.c 解析)

http://blog.csdn.net/xichangbao/article/details/51484610 现在开始分析关键函数aboot_init(),岔开一句lk在分区表的名称...
  • ffmxnjm
  • ffmxnjm
  • 2017-04-18 17:24
  • 284

MTK cmdline传递过程

1. Preloader部分  Platform.h(mediatek\platform\[$platform]\preloader\src\drivers\inc\platform.h)  在如...
  • kevin_hcy
  • kevin_hcy
  • 2015-11-19 11:37
  • 4902

OpenCV21(金字塔LK光流算法)

最好的教程,就是看Blog,然后最后一定要回归书本。   一、LK算法提到了三个假设 (高深:就是用你认识的字写你看不懂的东西。办法:多看几遍,查阅Blog上接地气的说法) 1.灰度不变  ...
  • u014488388
  • u014488388
  • 2016-10-20 22:13
  • 684

(转)Android bootloader(LK)启动流程

转自:http://blog.csdn.net/jmq_0000/article/details/7378348 LK是什么            LK 是 Little Kernel 它是 ...
  • wangbin344
  • wangbin344
  • 2016-08-05 13:41
  • 1025

android源码编译

在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序。在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文...
  • LK1105010206
  • LK1105010206
  • 2015-10-27 09:21
  • 781

LK源码解析 2 main.c

kmain()。 /* called from crt0.S */ void kmain(void) __NO_RETURN __EXTERNALLY_VISIBLE; void...
  • xichangbao
  • xichangbao
  • 2016-05-23 20:38
  • 1320
    个人资料
    • 访问:261058次
    • 积分:12909
    • 等级:
    • 排名:第1244名
    • 原创:1069篇
    • 转载:0篇
    • 译文:11篇
    • 评论:9条
    最新评论