coreboot学习9:ramstage阶段之设备初始化流程
本文对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阶段之设备初始化流程相关推荐
- coreboot学习7:ramstage阶段之设备枚举流程
本文主要针对ramstage阶段的设备枚举的过程进行分析.限于精力,就直接使用qemu-i440fx作为分析,baytrail就免了吧.在分析时,不一定会根据顺序,也不一定会详细到每个函数.如果要详细 ...
- coreboot学习6:ramstage阶段之芯片初始化流程
从本文开始,就根据前文给出的ramstage的主干线索分析每个小阶段执行的过程.依然以qemu-i440fx为主做分析--因为当前条件只有这个"主板"才能在通过打印跟踪其过程.另外 ...
- DPDK — L2 Forwarding 与网卡设备初始化流程
目录 文章目录 目录 L2 Forwarding Application 安装部署 部署拓扑 编译运行 L2fwd 测试 L2 转发功能 实现分析 L2 转发原理 代码注释 函数调用关系图 网卡设备初 ...
- AHCI sata设备初始化流程
检测sata设备: 检测hba的存在 根据hba的port挨个检测是否连接.根据intel文档,需要检测的项有:pxssts.det=03h,pxssts.ipm=02h或06h 检测signatur ...
- coreboot学习5:启动流程跟踪之ramstage阶段主干分析
ramstage阶段涉及比较多的操作,比如枚举板子上的外围设备,分配资源(PCI),使能设备.本文根据该阶段的主干函数流程做分析,细节方面不涉及.理顺这个主干,从全局上把控大致流程. romstage ...
- coreboot学习4:启动流程跟踪之romstage阶段
romstage是coreboot的第二个执行阶段.本文分别介绍基于qemu模拟环境的x86的跟踪,以及基于Intel baytrail平台的跟踪. 在romstage阶段,由于内存还未初始化好,所以 ...
- coreboot学习0:二度相逢是初识
第一次听到coreboot是在大约一年半多以前,当时因为工作需要进行x86的底层开发,无意中接触到coreboot项目.现在再次对其进行学习.一来让自己也学习一下x86的BIOS开发,二来算对微机原理 ...
- Python学习的十个阶段,学完大成,对应一下看看你自己在哪个阶段
大家好,我是梦雅. \ 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. \ \ \ 阶段一:Python基础[ 初入江湖] \ Li ...
- caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)
深度学习 Caffe 初始化流程理解(数据流建立) 之前在简书的文章,搬迁过来 ^-^ 本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处. #Caffe FeatureMap数据流的建 ...
最新文章
- 首创模拟电子计算机,指导日本原子弹投射,这个大佬有点牛
- Vivado下几条 Verilog 综合规则
- 传送门骑士修改服务器数据,传送门骑士修改经验 | 手游网游页游攻略大全
- python3 Django框架报错(备忘录)
- LVS+Keepalived实现负载均衡和双机热备
- 追寻终极数据库 - 事务/分析混合处理系统的交付挑战 (3)
- 牛客题霸 [合并两个有序的数组] C++题解/答案
- windows 64位 安装mvn提示 不是内部或外部命令
- android开发隐藏软键盘,Android开发之完全隐藏软键盘的方法
- android系统(107)---Android路由表设置(route amp; DNS)
- vuetify中文文档_我们为什么选择Vuetify作为前端框架
- 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
- Pycharm安装完出现interpreter field is empty
- 智能语音机器人系统介绍
- 主流PCB画图软件的对比区别(AD、Pads、Allegro)
- TeamViewer正版许可证到底多少钱?
- win10计算机管理如何分区,如何给win10磁盘分区?教你一招快速给win10磁盘分区的方法...
- 如何用powershell安装2345推广软件
- kali 运行wifite时遇到的问题及解决办法
- 自动白平衡也即:color constancy (色彩恒常)研究总结