Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544347
  • 博文数量: 1345
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 14830
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-14 20:32
文章分类

全部博文(1345)

文章存档

2010年(1345)

我的朋友

分类:

2010-10-06 15:42:16

  应该说startup.s是oal最开始的入口,就像eboot中的startup.s一样,它也是wince内核最开始运行的代码。一般在bsp中,eboot的startup.s和oal的startup.s的功能应该是一样的,但是还是会有些区别,很多情况取决于bsp的开发者,两个startup.s之间可以共享很多代码,也可以部分共享或者彼此独立。   oal中的startup的起始位置定义如下:   leaf_entry   startup   …   主要就是初始化cpu,对于arm来说,大致步骤如下:   1. 设置cpu为supervisor模式   2. 禁用irq和fiq中断   3. 关闭mmu和指令数据cache   4. 刷新cache和tlb,清空write buffer   5. 确认启动原因,可能是eboot跳转过来启动,冷启动,热启动,watchdog复位等   6. 配置gpio来点亮led   7. 配置memory控制器及时序   8. 配置中断控制器,清除所有中断   9. 初始化rtc   10. 配置cpu的电源管理   11. 设置cpu的时钟及相关的外设的时钟   12. 将oemaddresstable的起始地址写入r0寄存器   13. 跳转到kernelstart中   程序最后会跳转到kernelstart中,在private目录下的armstart.s中,这里仍然是汇编,大致步骤如下:   1. 基于传入的oemaddresstable初始化一级页表   2. 使能mmu和cache   3. 为每一种arm模式建立堆栈   4. 调用arminit函数获得kernel.dll的入口,该函数在arminit.c中定义   5. 返回kernel.dll的入口为nkstartup,在mdarm.c中定义,跳转到kernel.dll入口开始运行   6. 在nkstartup中读取cpu的id判断armv6架构,初始化内核的全局变量   7. 调用oeminitdebugserial初始化调试串口   8. 调用oeminit初始化相关的外设接口   9. 调用oemcacherangeflush刷新cache和tlb   10. 调用kernelfindmemory来划分对象存储空间和程序内存空间   11. 调用kernelstart函数,它与最开始的kernelstart不同,它在armtrap.s中定义   到此应该说cpu相关的初始化基本完成了,下面就是要开始wince内核的初始化了,大致步骤如下:   1. 跳转到armstrap.s中的kernelstart继续执行   2. 调用kernelinit函数,在nkinit.c中定义,主要完成api集的初始化,内核heap的初始化,内存池的初始化,进程和线程的初始化,最后是映射文件的初始化   3. 在执行完kernelinit之后,会跳转到firstschedule进行第一次系统调度,到此内核已经运行起来了。   这里把整个的初始化过程介绍了一下,实际上startup.s只是wince启动最开始的部分,完成cpu级别的初始化,这段代码都是汇编,调试起来也简单也困难,简单是因为都是顺序执行的,只是初始化cpu,困难是因为没有好的调试手段,一般在这里都是通过点led的方式来判断程序执行的位置。 如果喜欢wince oal中的startup.s介绍请收藏或告诉您的好朋友.
阅读(158) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~