- 论坛徽章:
- 0
|
vivi bootloader
一:bootloader有两种模式:
1:autoboot mode.一段时间后自动加载引导Linux核心。
2:prompt mode.接收用户输入来完成一些其它的功能。
二:在prompt mode下有下面一些命令,当然这些都是可配置的,根据实际情况还可能有其它命令。
1:load [partname | ]
2:part show
part add name offset size flag
part del name
part save
3:param show
param set paramname val
4:boot [partname | ]
三:工作过程
主要分成两步,汇编部分的stag1及C语言部分的stage2.
stage1:
1:建立导常向量表。
2:关闭看门狗。
3:关闭所有的中断。
4:初始化系统时钟。
5:初始化RAM控制寄存器。
6:初始化UART控制寄存器。
7:将bootloader拷贝到VIVI_RAM_BASE处(一般是位于RAM的最高地址处)。
8:设置堆栈指针sp为STACK_BASE+STACK_SIZE-4,并跳转到stage2.
stage2:
1:打印版本信息等vivi_banner.
2:硬件初始化,主要是定时器和GPIO。
3:初始化内存映射,主要包括两部分内容,一是建立MMU的TLB,在MMU_TABLE_BASE处建立存储映射表;二是调用汇编函数arm920_setup()来初始化CP15寄存器以及便能MMU?????
4:堆栈初始化。堆空间的分配都位于HEAP_BASE处,主要是mmalloc_init函数,以后bootload调用malloc或free函数的时间都是对这HEAP_SIZE这段空间的操作,主要的数据结构是blockhead_t的双向链表(其实严格来讲并不是标准的双向链表)。
5:MTD设备的初始化。主要是对建立对nandflash的读写函数.????
6:初始化priv数据。priv数据主要包括三种,即bootloader参数(VIVI_PRIV),Linux_CMD参数和MTD分区参数。bootload会首先从程序中读取默认的参数值,如果在config时选择了自定义参数,则会去读取已经存储的用户参数。 三种数据的初始化就是将各自的默认参数读取到相应的地址处. 在读取用户自定义参数时,会首先把param分区拷贝到DRAM_BASE处,然后从DRAM_BASE处读取三种参数分别拷贝到VIVI_PRIV_RAM_BASE处.
7:注册基本的用户命令. 包括cpu_info reset param part mem load dump boot help call go 等。其中注册的每一个用户命令都会被加入到一个单链表中,在命令行模式中会从这个链表中查找用户输入的命令以便执行相应的操作。
8:决定执行boot模式还是cmd模式。如果是boot模式,会首先从参数区中读取media_type类型,然后从mtd_partions表中读取kernel的offsize及size,然后从vivi_part参数区中读取boot_mem_base,接下来从mtd的kernel分区处将size个长度的内核拷贝到boot_mem_base+LINUX_KERNEL_OFFSET(0x08000)处,作一magic验证,最后从linux_cmd处读内核启动参数,拷贝到LINUX_PARAM_OFFSET处并启动内核。。。
RAM_BASE/DRAM_BASE
|---------------------64M----------------------|
|----|VIVI_RAM_SIZE-|(1M) |VIVI_RAM_BASE
|----|HEAP_SIZE(1M) |HEAP_BASE
|---|MMU_TABLE_SIZE(16K)
|MMU_TABLE_BASE
[color="#ff9999"]|---|VIVI_PRIV_SIZE(16K*3)
|VIVI_PRIV_RAM_BASE
|---|STACK_SIZE(32K)
|STACK_BASE
|----RAM_SIZE------------|
RAM_BASE/DRAM_BASE
VIVI_PRIV_RAM_BASE
|--------------------------------------------|VIVI_PRIV_SIZE(16K*3)
|--------------|LINUX_CMD_SIZE(16K)
|LINUX_CMD_OFFSET(0x00008000)
|------------|PARAMETER_TLB_SIZE(16K)
|PARAMETER_TLB_OFFSET(0x00004000)
|--------------|MTD_PART_SIZE(16K)
|MTD_PART_OFFSET(0x0)
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/92532/showart_1914464.html |
|