- 1、本文档共31页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PMON的pci设备初始化
第二章 PCI设备初始化
系统刚上电时,CPU从0xbfc0.0000开始执行。这个地址在Rom空间中,在完成TLB,Cache,UART等初始化后,CPU就将代码拷到0x8010.0000开始的RAM空间(这个地址是编译Pmon时分配符号_start的),然后跳转到initmips(),开始在内存空间的执行。
执行initmips之前,CPU做的初始化只是初步的,其作用只是为CPU在内存中运行做一些必要的准备。主要的初始化工作:PCI设备的扫描、空间映射、资源分配都是initmips()函数所完成的。
下面我们跟踪initmips的执行来观察系统初始化的过程。
void
initmips(unsigned int memsz)
{
/*
* Set up memory address decoders to map entire memory.
* But first move away bootrom map to high memory.
*/
memorysize=(memsz0x0000ffff) 20;//recover to original size:256M
memorysize_high=((memsz0xffff0000)16) 20;//0
/*
* Probe clock frequencys so delays will work properly.
*/
tgt_cpufreq();
SBD_DISPLAY(DONE,0);
/*
* Init PMON and debug
*/
cpuinfotab[0] = DBGREG;
dbginit(NULL);
/*
* Set up exception vectors.
*/
SBD_DISPLAY(BEV1,0);
bcopy(MipsException, (char *)TLB_MISS_EXC_VEC, MipsExceptionEnd - MipsException);
bcopy(MipsException, (char *)GEN_EXC_VEC, MipsExceptionEnd - MipsException);
CPU_FlushCache();
CPU_SetSR(0, SR_BOOT_EXC_VEC);
SBD_DISPLAY(BEV0,0);
/* Launch! */
main();
}
首先是获取CPU的时钟频率,这是tgt_cpufreq()完成的。它定义在tgt_machdep.c中。主要的方法就是先读取COP0中的count寄存器,然后延时一段时间,再读取count寄存器。两次的差值乘以2就是这段时间内cpu的时钟周期数。另外,CMOS中有个实时钟,在延时前后读取当前时间该相减,就可以知道延时的准确时间。从而计算出cpu的时钟频率。全局变量md_cpufreq记录了cpu频率值,md_pipefreq是流水线的频率,它们的值分别是500MHZ和1000MHZ;
接着调用的是dbginit(),这是最要的一个函数,几乎所有的初始化代码都由他直接或间接调用。
构造函数(constructor)的执行。
Dbginit()调用的第一个函数是__init()。这个函数的过程很简单,它就是将所有的constructor的函数执行一遍,建立一些基本的数据结构。在pmon中有三类constructor函数,它们都是静态函数。
命令处理初始化函数,位于pmon/cmds目录下,其名称都叫init_cmd()。
文件系统初始化函数。pmon/fs目录下。函数名称叫init_fs()或者init_xxxfs()。
可执行文件类型初始化。在pmon/loader目录下。函数名称叫init_exec()
Pmon中定义了大量的命令,每个命令都对应一个Cmd类型的结构。该结构的含义如下。
typedef struct Cmd {
const char *name; //命令的名称
const char *opts; //参数
const Optdesc *optdesc; //命令参数的option
const char *desc; //命令描述
int (*func) __P((int, char *[])); //处理函数
int minac; //最小参数个数
int maxac; //最大参数个数
int fla
文档评论(0)