本文对ramstage阶段的设备初始化过程进行跟踪。设备初始化是在dev_initialize函数中完成的,代码如下:

void dev_initialize(void)
{struct bus *link;printk(BIOS_INFO, "Initializing devices...\n");#if CONFIG_ARCH_X86/* Ensure EBDA is prepared before Option ROMs. */setup_default_ebda();
#endif/* First call the mainboard init. */// 先调用mainboard的init -- 注: 如没有定义,则使用弱链接,参考static.cinit_dev(&dev_root);/* Now initialize everything. */for (link = dev_root.link_list; link; link = link->next){init_link(link);}post_log_clear();printk(BIOS_INFO, "Devices initialized\n");show_all_devs(BIOS_SPEW, "After init.");
}

从该函数看出大概有几个步骤:

1、先调用init_dev初始化根设备dev_root。

2、遍历根设备下的所有设备,调用init_link。

3、最后将所有设备打印出来。

其中,init_dev调用调用具体设备的device_operations结构体指针函数init。当设备有link时,调用init_link函数,该函数再调用init_dev进行初始化,直到所有设备均遍历完毕。如果阅读过编译时生成的static.c文件,就会发现,有的设备link_list成员变量被赋值,有的设备则为NULL。这个文件实际上就是组成了目标板上的设备树。在ramstage阶段很多的操作,实际就是遍历这个设备树,找对应的设备类型,调用对应的操作函数。

下面跟踪一下CPU的初始化过程。CPU设备操作函数集定义如下:

static struct device_operations cpu_bus_ops = {.read_resources   = DEVICE_NOOP,.set_resources    = DEVICE_NOOP,.enable_resources = DEVICE_NOOP,.init             = cpu_bus_init,.scan_bus         = cpu_bus_scan,
};

在调用init时,会调用到cpu_bus_init函数。该函数如下:

static void cpu_bus_init(device_t dev)
{initialize_cpus(dev->link_list);
}

而initialize_cpus会调用到cpu_initialize。该函数主要是读取CPU信息,如family、model、stepping,然后调用对应的驱动的init函数。文中使用qemu i440fx,因而最终会调用到qemu_cpu_init函数。

代码如下:

void cpu_initialize(unsigned int index)
{/* Because we busy wait at the printk spinlock.* It is important to keep the number of printed messages* from secondary cpus to a minimum, when debugging is* disabled.*/struct device *cpu;struct cpu_info *info;struct cpuinfo_x86 c;info = cpu_info();printk(BIOS_INFO, "Initializing CPU #%d\n", index);cpu = info->cpu;if (!cpu) {die("CPU: missing cpu device structure");}if (cpu->initialized)return;post_log_path(cpu);/* Find what type of cpu we are dealing with */identify_cpu(cpu); // 获取cpu信息printk(BIOS_DEBUG, "CPU: vendor %s device 0x%x\n",cpu_vendor_name(cpu->vendor), cpu->device);get_fms(&c, cpu->device); // fms难道是family model stepping的意思?/* 打印CPU family、model,例如0x06_0x37表示atom e3000系列(e3800也在其中),参考IA32手册卷3第35章表格1 */printk(BIOS_DEBUG, "CPU: family 0x%02x, model 0x%02x, stepping 0x%02x\n",c.x86, c.x86_model, c.x86_mask);printk(BIOS_DEBUG, "DisplayFamily_DisplayModel: %02X_%02XH\n", c.x86, c.x86_model);// testmsr_t platform_id = rdmsr(0x17);printk(BIOS_DEBUG, "platform_id: %x %x\n", platform_id.hi, platform_id.lo);// my test...char processor_name[49];/* Print processor name */fill_processor_name1(processor_name);// 打印CPU,如qemu会打印:QEMU Virtual CPU version 2.0.0printk(BIOS_INFO, "LLDEBUG CPU: %s.\n", processor_name);/* Lookup the cpu's operations */set_cpu_ops(cpu);if(!cpu->ops) {/* mask out the stepping and try again */cpu->device -= c.x86_mask;set_cpu_ops(cpu); // 设置操作函数cpu->device += c.x86_mask;if(!cpu->ops) die("Unknown cpu");printk(BIOS_DEBUG, "Using generic cpu ops (good)\n");}/* Initialize the cpu */if (cpu->ops && cpu->ops->init) {cpu->enabled = 1;cpu->initialized = 1; // 已经初始化好了cpu->ops->init(cpu); // 调用具体的init函数 如baytrail的为baytrail_init_cpus, qemu为qemu_cpu_init}post_log_clear();printk(BIOS_INFO, "CPU #%d initialized\n", index);return;
}

在前面学习CPUID指令时,实际上就是在这个函数中做试验的。

根据代码整理的流程图如下:

(此处留空)

附上此过程的打印信息:

[LL DEBUG]: in bs_dev_init()...
Initializing devices...
Root Device init ...
POST: 0x75
CPU_CLUSTER: 0 init ...
Initializing CPU #0
CPU: vendor Intel device 0x663
CPU: family 0x06, model 0x06, stepping 0x03
DisplayFamily_DisplayModel: 06_06H
platform_id: 0 0
LLDEBUG CPU: QEMU Virtual CPU version 2.0.0.
Setting up local apic... apic_id: 0x00 done.
POST: 0x9b
CPU #0 initialized
POST: 0x75
POST: 0x75
POST: 0x75
PCI: 00:00.0 init ...
Assigning IRQ 10 to 0:1.3
Assigning IRQ 11 to 0:3.0
POST: 0x75
PCI: 00:01.0 init ...
RTC Init
POST: 0x75
PCI: 00:01.1 init ...
IDE: Primary IDE interface: on
IDE: Secondary IDE interface: on
IDE: Access to legacy IDE ports: off
POST: 0x75
POST: 0x75
PCI: 00:02.0 init ...
POST: 0x75
PCI: 00:03.0 init ...
Devices initialized
Show all devs... After init.
Root Device: enabled 1
CPU_CLUSTER: 0: enabled 1
APIC: 00: enabled 1
DOMAIN: 0000: enabled 1
PCI: 00:00.0: enabled 1
PCI: 00:01.0: enabled 1
PCI: 00:01.1: enabled 1
PCI: 00:01.3: enabled 1
PCI: 00:02.0: enabled 1
PCI: 00:03.0: enabled 1

李迟 2016.4.4 周一 清明节

coreboot学习9:ramstage阶段之设备初始化流程相关推荐

  1. coreboot学习7:ramstage阶段之设备枚举流程

    本文主要针对ramstage阶段的设备枚举的过程进行分析.限于精力,就直接使用qemu-i440fx作为分析,baytrail就免了吧.在分析时,不一定会根据顺序,也不一定会详细到每个函数.如果要详细 ...

  2. coreboot学习6:ramstage阶段之芯片初始化流程

    从本文开始,就根据前文给出的ramstage的主干线索分析每个小阶段执行的过程.依然以qemu-i440fx为主做分析--因为当前条件只有这个"主板"才能在通过打印跟踪其过程.另外 ...

  3. DPDK — L2 Forwarding 与网卡设备初始化流程

    目录 文章目录 目录 L2 Forwarding Application 安装部署 部署拓扑 编译运行 L2fwd 测试 L2 转发功能 实现分析 L2 转发原理 代码注释 函数调用关系图 网卡设备初 ...

  4. AHCI sata设备初始化流程

    检测sata设备: 检测hba的存在 根据hba的port挨个检测是否连接.根据intel文档,需要检测的项有:pxssts.det=03h,pxssts.ipm=02h或06h 检测signatur ...

  5. coreboot学习5:启动流程跟踪之ramstage阶段主干分析

    ramstage阶段涉及比较多的操作,比如枚举板子上的外围设备,分配资源(PCI),使能设备.本文根据该阶段的主干函数流程做分析,细节方面不涉及.理顺这个主干,从全局上把控大致流程. romstage ...

  6. coreboot学习4:启动流程跟踪之romstage阶段

    romstage是coreboot的第二个执行阶段.本文分别介绍基于qemu模拟环境的x86的跟踪,以及基于Intel baytrail平台的跟踪. 在romstage阶段,由于内存还未初始化好,所以 ...

  7. coreboot学习0:二度相逢是初识

    第一次听到coreboot是在大约一年半多以前,当时因为工作需要进行x86的底层开发,无意中接触到coreboot项目.现在再次对其进行学习.一来让自己也学习一下x86的BIOS开发,二来算对微机原理 ...

  8. Python学习的十个阶段,学完大成,对应一下看看你自己在哪个阶段

    大家好,我是梦雅. \ 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. \ \ \ 阶段一:Python基础[ 初入江湖] \ Li ...

  9. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

    深度学习 Caffe 初始化流程理解(数据流建立) 之前在简书的文章,搬迁过来 ^-^ 本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处. #Caffe FeatureMap数据流的建 ...

最新文章

  1. 首创模拟电子计算机,指导日本原子弹投射,这个大佬有点牛
  2. Vivado下几条 Verilog 综合规则
  3. 传送门骑士修改服务器数据,传送门骑士修改经验 | 手游网游页游攻略大全
  4. python3 Django框架报错(备忘录)
  5. LVS+Keepalived实现负载均衡和双机热备
  6. 追寻终极数据库 - 事务/分析混合处理系统的交付挑战 (3)
  7. 牛客题霸 [合并两个有序的数组] C++题解/答案
  8. windows 64位 安装mvn提示 不是内部或外部命令
  9. android开发隐藏软键盘,Android开发之完全隐藏软键盘的方法
  10. android系统(107)---Android路由表设置(route amp; DNS)
  11. vuetify中文文档_我们为什么选择Vuetify作为前端框架
  12. 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
  13. Pycharm安装完出现interpreter field is empty
  14. 智能语音机器人系统介绍
  15. 主流PCB画图软件的对比区别(AD、Pads、Allegro)
  16. TeamViewer正版许可证到底多少钱?
  17. win10计算机管理如何分区,如何给win10磁盘分区?教你一招快速给win10磁盘分区的方法...
  18. 如何用powershell安装2345推广软件
  19. kali 运行wifite时遇到的问题及解决办法
  20. 自动白平衡也即:color constancy (色彩恒常)研究总结

热门文章

  1. 你能抱我一下,好吗?
  2. 京东11.11携手小米上线“信用试”服务 手机先试用满意再付款
  3. 旷视科技IPO过会,AI技术“立业”难言轻松
  4. 网友疯买、雷军力撑,又一家国货站起来了!
  5. 小米平板5系列共三款机型:全系搭载2K/120Hz屏幕
  6. 华为高管预告手机鸿蒙OS下月上线,华为手机部:我们没说过
  7. 收购YY直播,百度重返高位的关键布局
  8. 大量违规投放,青桔单车被紧急约谈
  9. 中芯国际能靠14nm工艺翻身么?
  10. 微信喊你来找工作:上千家企业将提供超10万个就业岗位