CFE Bootloader详解 — 引导过程
CFE命令

CFE引导过程
系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型、设置时钟、初始化缓存、把自身加载进RAM等任务后,跳转到c_main()(src/shared/load.c)
void c_main (unsigned long ra)
{
……
/* Load binary */
load (); /* 加载CFE,并解压 */
……
((void (*) (void)) LOADADDR) (); /* 跳转到CFE中执行cfe_main() */
}
在执行cfe_main () (cfe/cfe/main/cfe_main.c)前,更低级别的初始化工作已经完成,而此函数主要完成硬件初始化,包括ether driver,PCI,Console等外部设备的初始化,image更新,引导kernel等任务。
void cfe_main (int a, int b)
{
/*
* By the time this routine is called, the following things have
* already been done:
*
* 1. The processor(s) is(are) initialized.
* 2. The caches are initialized.
* 3. The memory controller is initialized.
* 4. BSS has been zeroed.
* 5. The data has been moved to R/W space.
* 6. The "C" Stack has been initialized.
*/
……
cfe_bg_init(); /* 后台处理初始化 */
cfe_attach_init (); /* 初始化CFE device list */
cfe_timer_init ();
cfe_bg_add (cfe_device_poll, NULL); board_console_init (); /* 硬件初始化,包括LED的初始化 */
cfe_say_hello (); /* CFE开始信息 */
cfe_arena_init (); /* 创建物理内存的初始映射 */
board_device_init (); /* 设备初始化 */
cfe_startup_info (); /* 输出信息,例如存储空间使用情况 */
cfe_init_ui (); /* 接口初始化,包括Console命令行初始化 */
board_final_init (); /* 硬件部分初始化 */
cfe_autostart (); /* image更新,加载kernel */
cfe_command_loop (); /* 如果上一步按了Ctrl-C,则进入CFE命令行模式 */
……
}
后台轮询
CFE没有使用中断做任何事情,而是使用轮询的方式。后台维护一个叫cfe_bg_tasklist的函数指针数组,数组元素中的函数指针指向后台任务处理函数的首地址,后台的任务数量是16。cfe_bg_init()初始化后台任务列表,cfe_bg_add()、cfe_bg_remove()负责在后台的定期轮询循环中添加或删除任务。
#define MAX_BACKGROUND_TASK 16
static void (*cfe_bg_tasklist [MAX_BACKGROUND_TASKS]) (void *)
CFE设备管理
cfe_attach_init()用于初始化CFE设备列表,这是一条双向队列,用来保存外部设备的信息。在设备嗅探时,cfe_attach ()将被调用,用于把设备添加进CFE设备列表中。在CFE中,用cfe_device_t (cfe/cfe/include/cfe_device.h)这个结构体来描述一个设备示例。
/*
* The Device structure defines a particular instance of a device.
* They are generated as a result of calling the cfe_attach call.
*/ typedef struct cfe_device_s {
queue_t dev_next;
char *dev_fullname;
void *dev_softc;
int dev_class;
const cfe_devdisp_t *dev_dispatch;
int dev_opencount;
char *dev_description;
} cfe_device_t;
cfe_devdisp_s (cfe/cfe/include/cfe_device.h)这个结构体由一系列函数指针构成,定义了对设备的常规操作。
struct cfe_devdisp_s {
int (*dev_open)(cfe_devctx_t *ctx);
int (*dev_read)(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
int (*dev_inpstat)(cfe_devctx_t *ctx,iocb_inpstat_t *inpstat);
int (*dev_write)(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
int (*dev_ioctl)(cfe_devctx_t *ctx,iocb_buffer_t *buffer);
int (*dev_close)(cfe_devctx_t *ctx);
void (*dev_poll)(cfe_devctx_t *ctx,int64_t ticks);
void (*dev_reset)(void *softc); /* called when device is closed, so no devctx_t */
};
CFE Bootloader详解 — 引导过程的更多相关文章
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- BootLoader 详解(1)
1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...
- BootLoader 详解(3)
BootLoader的stage2 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性.它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时, ...
- BootLoader 详解(2)
BootLoader的stage1 1.基本的硬件初始化 这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通 常包括以下 ...
- MapReduce:详解Shuffle过程(转)
/** * author : 冶秀刚 * mail : dennyy99@gmail.com */ Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapRedu ...
- MapReduce:详解Shuffle过程
Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定的阀值,则写到磁盘上,否则直接放到内存中. 官方的Shuffl ...
- Hadoop_10_shuffle02_详解Shuffle过程【来源网络】推荐更为详细
网址:http://www.cnblogs.com/felixzh/p/4680808.html Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据, ...
- MapReduce:详解Shuffle过程
Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑, ...
随机推荐
- Linux服务器上ftp的搭建和使用
知识点: 1. FTP的简介.工作原理 2.在Linux上搭建FTP服务器 参考: 阿里云文档:https://help.aliyun.com/knowledge_detail/60152.html ...
- c++之初级的消息队列及线程池模型
1.最近项目不是很忙,结合之前看的一些开源代码(skynet及其他github代码)及项目代码,抽空写了一个简单的任务队列当做练习. 2.介绍: 1)全局队列中锁的使用:多线程下,全局队列需要加锁,本 ...
- 锁(3)-- DB锁
1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一 ...
- MATLAB 2014a (8.3) Compiler Runtime (MCR)
在安装的时候可以 ./install -H 界面化安装到自己目录下 MATLAB 2014a (8.3) Runtime Compiler (MCR) Errors when trying to la ...
- [转]检测SQLSERVER数据库CPU瓶颈及内存瓶颈
在任务管理器中看到sql server 2000进程的内存占用,而在sql server 2005中,不能在任务管理器中查看sql server 2005进程的内存占用,要用 以下语句查看sql se ...
- 数据库建表char(10)和VARCHAR(10)
1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHA ...
- ItemsControl的ItemContainerStyle属性
ItemsControl:ListBox,ComboBox,TreeView ItemContainerStyle是用来设置每一个集合控件的Item的样式的属性(即设置每一个项的样式). 使用It ...
- Ngix
Ngix安装 官网地址,下载为源码,需要编译安装 http://nginx.org/ 环境 1.需要安装gcc的环境. yum install gcc-c++ 2.第三方的开发包. PCRE PCRE ...
- 第六天 文件的基本管理和xfs文进系统备份恢复
1.1 Linux系统目录结构,相对路径/绝对路径 1.1.1 Linux系统目录结构 在linux系统中一切都是文件 / 根目录,一切的起点,就像是一个树杈一样,他是所有叉的根 /bin 在单用户模 ...
- 【转】ubuntu下如何将笔记本自带的键盘关闭
想必大家都经历过这样的情况:在使用usb接口的外接键盘的时候,很容易按到笔记本自带的键盘,从而导致输入错误.尤其是你将外接键盘放在笔记本键盘上面的时候.怎么解决这个问题呢? 搜索之后,找到了答案.注意 ...