- 1、本文档共31页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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
您可能关注的文档
最近下载
- 结构化学期末复习试题15套.pdf VIP
- SY/T 6610-2017 硫化氢环境井下作业场所作业安全规范.pdf VIP
- 胸腔闭式引流管意外脱落的应急预案PPT医学课件.pptx VIP
- 成本费用管理制度(最终版).pdf VIP
- 3海港总体设计规范_培训讲义-航道、锚地分析报告.pdf VIP
- 电力设备预防性试验规程QCSG114002-2011版资料.doc VIP
- Legally Blonde Scripts 律政俏佳人(中英对照).pdf VIP
- 浙江省消防技术规范难点问题操作技术指南-2025修订稿(定稿).pdf VIP
- 中华人民共和国民法典系列第七编侵权责任解读PPT课件.pptx VIP
- OWASP大语言模型人工智能应用Top10安全威胁2025.docx
文档评论(0)