注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Perfect-World

以無法為有法,以無限為有限!

 
 
 

日志

 
 

Eboot和OAL实验  

2013-04-06 18:39:55|  分类: 学习历程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

BootLoaderOEM Abstraction Layer代码浏览

 

  1. 实验1:BootLoader代码浏览

    1. 目标:

在这个实验中,您将理解到:

  • 理解BootLoader的结构
  • 理解BootLoader的大致流程
  • OEM实现OEM的主要工作
  1. 预备知识:

在进行这个实验之前,您应该首先:

  • 在您的机器上安装了Platform Builder
  • 理解Eboot的使用方法,作用和主要功能
  1. 实验预计时间

30分钟

  1. 实验步骤

  1. 打开Platform Builder。
  2. 选择"Edit"菜单中的"Find in Files…",使用Find in Files功能搜索下列代码。
  3. 浏览到$(_WINCEROOT)\PLATFORM\CEPC\EBOOT,文件类型选择*.*,查找Startup函数,找到Startup函数之后,查看从此函数是如何跳转到C语言实现的某个函数的。
  4. 查看Eboot目录下的SOURCES文件,看Eboot是如何被构造的。
  5. 查看SOURCES文件中所链接的lib文件,从Startup的跳转到的C语言函数就存在于这些lib文件中的某一个,指出是哪一个库。

提示:绝大多数blcommon库的源代码都存在于Windows CE的目录:$(_WINCEROOT)\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON下。下面将会查看BLCOMMON目录下的代码。

  1. 查看BootloaderMain()函数。这是BootLoader的主函数,它控制了整个BootLoader的执行流程。仔细阅读代码,填写5个实现如下功能的函数:

初始化调试端口: ________________________

初始化硬件平台: ______________________

OEM特指的下载前函数: __________________

下载OS映像: _____________________

启动映像: ______________________

  1. 搜索Download部分的源代码。BootloaderMain()调用DownloadImage()函数来下载内核。找到DownloadImage所调用的函数,跟踪它的使用。
  2. 通过跟踪如下的代码注释,查看函数是如何读写数据包的。

{

// read the 7 byte "magic number"

// read image start/length

// give the OEM a chance to verify memory

// check for flash image. Start erasing if it is.

// read records (start with address, length, and

checksum)

// check for last record

// update launch address

// write to flash if it's flash image

// finish the flash erase

// map the record address (FLASH data is cached, for

example)

// read data block

// verify partial checksum

}

  1. 在x86 CSP目录$(_WINCEROOT)\public\common\oak\csp\i486\romboot中找到OEMWriteFlash()函数。写Flash函数在x86平台下并没有实现,因为CEPC上没有Flash部分。其他体系结构的CPU的BSP下面有这个函数的实例。(例如ARMINTEGRATOR中有Intel Strata Flash)
  2. 打开文件$(_WINCEROOT)\PLATFORM\CEPC\EBOOT\boot.bib,查看Boot Loader的内存使用情况。
    1. 作业:

整理并且画出BootLoader中函数调用的顺序图,区分OEM函数和微软提供的库函数。最好使用Rational Rose等工具。

  1. 实验2:查看OAL

    1. 目标

通过本实验,您将学会:

  • OAL的基本结构
  • 理解OAL不同部分的功能与作用
  1. 预备知识

OAL在Windows CE操作系统中的基本功能

  1. 实验预计时间

90到120分钟

  1. 实验步骤

    1. 浏览OAL源代码

在这个实验中,您将在OAL中搜索如下核心功能的代码,包括:

  • 初始化代码
  • 中断代码
  • 调试I/O代码

提示:CEPC中与OAL相关的代码大多存在于如下两个目录中,搜索的时候定位在此目录中即可:

$(_WINCEROOT)\PLATFORM\CEPC\KERNEL\HAL

$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL

--> 以下是OAL的初始化代码:

  1. 打开Platform Builder。
  2. 选择"Edit"菜单中的"Find in Files…",使用Find in Files功能搜索下列代码。
  3. 搜索Startup函数。这是一个使用汇编语言实现的函数,BootLoader下载内核映像之后,就跳转到此处执行,Startup是OAL中执行的第一个函数。在"Find in Files"对话框中,把搜索文件的类型改为"*.ASM",然后搜索目录改为:$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL。
  4. 在$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL\OEMINIT.ASM文件中,我们可以找到Startup函数。函数的前面会有一个下划线。双击oeminit.asm打开此文件,查看Startup函数的内容。
  5. 第二个函数是KernelInitialize。Startup函数会跳转到此函数。我们找不到此函数的源代码,微软以二进制代码的形式提供了KernelInitialize的实现。

注意:这个函数的名称是与平台相关的,在其他平台上(例如ARM),与之等同的函数是KernelStart

  1. 第三个函数是OEMInit。它负责OAL的主要初始化工作。它是用C语言实现的,在"Find in Files"对话框中,指定要搜索的文件类型为"*.c",然后进行搜索。你将在文件$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL\CFWPC.C中找到该函数。打开此函数。解释此函数的主要功能。查看其具体实现。
  2. 剩下的一个函数是OEMGetExtensionDRAM。同样在CFWPC.C中,这个函数让内核知道除了在NK.Bin中的定义之外,还有多少内存可以使用。

 

--> 以下是OAL中的中断代码:

  1. 在CFWPC.C文件中查找OEMInterruptEnable函数。这个函数第一次调用的时候会打开所有的中断。也就是说,当中断服务线程调用InterruptInitialize函数的时候,内核通过调用OEMInterruptEnable函数通知OAL启动中断。
  2. 在CFWPC.C文件中查找OEMInterruptDisable函数。当中断发生的时候,内核调用这个函数来请求OAL从硬件级别把中断关掉。
  3. 在CFWPC.C文件中查找OEMInterruptDone函数。这个函数用来在驱动程序已经处理了前一个中断之后重新开启所有的中断。驱动程序调用InterrruptDone,这导致内核调用OEMInterruptDone函数。

 

--> 以下是调试I/O的函数

  1. 查找下列串口调试函数:

OEMInitDebugSerial

OEMWriteDebugString

你应该可以在$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL\DEBUG.C中找到它们。

  1. 查找下列并口调试函数:

OEMParallelPortInit

OEMParallelPortSendByte

你应该可以在$(_WINCEROOT)\PUBLIC\COMMON\OAK\CSP\I486\OAL\MDPPFS.C中找到它们。

  1. 查找下列以太网调试函数:

OEMEthInit

OEMEthSendFrame

你应该可以在$(_WINCEROOT)\PLATFORM\CEPC\KERNEL\HAL\HALETHER.C中找到它们。

 

  1. 作业:

整理并且画出OAL中函数调用的顺序图,区分OEM函数和微软提供的库函数。最好使用Rational Rose等工具。

  1. 创建新的I/O Control代码

在本实验中,您将创建新的I/O Control代码,然后应用程序可以使用它直接与OAL交互,您将会:

  • 找到OEMIoControl 函数
  • 增减新的控制码
  • 创建应用程序来测试您的工作

 

--> 查找OEMIoControl函数

  1. 选择PB中"Edit"菜单中的"Find in Files…",使用Find in Files功能搜索OEMIoControl。您将在$(_WINCEROOT)\PLATFORM\CEPC\KERNEL\HAL\OEMIOCTL.C中找到此函数。查看此函数是如何组织大的switch语句的。

 

--> 增加新的控制码

  1. 在文件开始的地方设置新的全局变量:

static DWORD dwControlCounter = 0;

  1. 你需要给新的控制码一个未被使用的整数值。下面是一个例子:

#define IOCTL_HAL_INC_COUNTER CTL_CODE( FILE_DEVICE_HAL,0x1000, METHOD_BUFFERED, FILE_ANY_ACCESS)

  1. 在OEMIoControl函数中增加一个新的case语句,增加计数器的值。使用RETAILMSG宏把当前计数器的值发送到调试输出中去。

case IOCTL_HAL_INC_COUNTER:

dwControlCounter++;

RETAILMSG(1,(_T("Lab: Count is now %u\n\r"),dwControlCounter));

if (nOutBufSize < sizeof(dwControlCounter))

{

SetLastError(ERROR_INVALID_PARAMETER);

retval = FALSE;

}

else

{

memcpy(lpOutBuf, &dwControlCounter, sizeof(dwControlCounter));

*lpBytesReturned = sizeof(dwControlCounter);

retval = TRUE;

}

break;

 

--> 创建应用程序测试I/O control的功能

  1. 使用Platform Builder创建一个新的CEPC平台。
  2. 使用Project Wizard创建基于命令行的应用程序。
  3. 添加对kfuncs.h头文件的包含。

#include <kfuncs.h>

  1. 添加OAL控制码的定义

#define IOCTL_HAL_INC_COUNTER CTL_CODE( FILE_DEVICE_HAL,0x1000, METHOD_BUFFERED, FILE_ANY_ACCESS)

  1. 通过KernelIoControl函数调用OAL的I/O代码,参考代码如下:

KernelIoControl(IOCTL_HAL_INC_COUNTER, NULL, 0, &dwCount, sizeof(dwCount), &dwNumRead);

RETAILMSG(1, (_T("CALLOAL: Count is %u\n\r"),dwCount));

注意:在编译和运行代码之前,必须在Project -> Setting定义WINCEOEM和附加引用路径。否则会出错。附加的引用路径为:

$(_PROJECTROOT)\cesysgen\oak\inc

$(_TARGETPLATROOT)\inc

  1. 编译和运行测试程序,查看程序的输出。

 

 

  评论这张
 
阅读(410)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016