coreboot学习8:ramstage阶段之资源分配流程
来源:互联网 发布:怖客用哪个软件可以看 编辑:程序博客网 时间:2024/06/05 16:49
设备枚举后就是资源分配了,在dev_configure函数中完成,代码如下:
void dev_configure(void){struct resource *res;struct device *root;struct device *child;set_vga_bridge_bits();printk(BIOS_INFO, "Allocating resources...\n");root = &dev_root; // 根设备/* * Each domain should create resources which contain the entire address * space for IO, MEM, and PREFMEM resources in the domain. The * allocation of device resources will be done from this address space. *//* Read the resources for the entire tree. */// 先读一次printk(BIOS_INFO, "Reading resources...\n");read_resources(root->link_list);printk(BIOS_INFO, "Done reading resources.\n");// 打印设备树的资源print_resource_tree(root, BIOS_SPEW, "After reading.");/* Compute resources for all domains. */// 计算资源for (child = root->link_list->children; child; child = child->sibling) {if (!(child->path.type == DEVICE_PATH_DOMAIN))continue;post_log_path(child);for (res = child->resource_list; res; res = res->next) {if (res->flags & IORESOURCE_FIXED)continue;if (res->flags & IORESOURCE_MEM) {compute_resources(child->link_list, res, IORESOURCE_TYPE_MASK, IORESOURCE_MEM);continue;}if (res->flags & IORESOURCE_IO) {compute_resources(child->link_list, res, IORESOURCE_TYPE_MASK, IORESOURCE_IO);continue;}}}/* For all domains. */for (child = root->link_list->children; child; child=child->sibling)if (child->path.type == DEVICE_PATH_DOMAIN)avoid_fixed_resources(child); // 此函数作用? 感觉是对范围的限制/* Store the computed resource allocations into device registers ... */printk(BIOS_INFO, "Setting resources...\n");for (child = root->link_list->children; child; child = child->sibling) {if (!(child->path.type == DEVICE_PATH_DOMAIN))continue;post_log_path(child);// 分mem和io两种资源for (res = child->resource_list; res; res = res->next) {if (res->flags & IORESOURCE_FIXED)continue;if (res->flags & IORESOURCE_MEM) {allocate_resources(child->link_list, res, IORESOURCE_TYPE_MASK, IORESOURCE_MEM);continue;}if (res->flags & IORESOURCE_IO) {allocate_resources(child->link_list, res, IORESOURCE_TYPE_MASK, IORESOURCE_IO);continue;}}}assign_resources(root->link_list);printk(BIOS_INFO, "Done setting resources.\n");print_resource_tree(root, BIOS_SPEW, "After assigning values.");printk(BIOS_INFO, "Done allocating resources.\n");}
从该函数看出大概有几个步骤:
1、先读一次设备树上的资源,并打印出来。
2、计算资源,compute_resources。
3、对资源范围做限制,avoid_fixed_resources。
4、申请资源,allocate_resources。
5、分配资源,assign_resources。
6、打印分配好的资源(注:此时设备树的资源有部分是第1步骤打印的不同)。
根据代码整理的流程图如下:
(此处留空)
附上此过程的打印信息:
[LL DEBUG]: in bs_dev_resources()...found VGA at PCI: 00:02.0Setting up VGA for PCI: 00:02.0Setting PCI_BRIDGE_CTL_VGA for bridge DOMAIN: 0000Setting PCI_BRIDGE_CTL_VGA for bridge Root DeviceAllocating resources...Reading resources...Root Device read_resources bus 0 link: 0CPU_CLUSTER: 0 read_resources bus 0 link: 0CPU_CLUSTER: 0 read_resources bus 0 link: 0 doneQEMU: 8 files in fw_cfgQEMU: etc/boot-fail-wait [size=4]QEMU: etc/e820 [size=20]QEMU: genroms/kvmvapic.bin [size=9216]QEMU: etc/system-states [size=6]QEMU: bootorder [size=0]QEMU: etc/acpi/tables [size=8192]QEMU: etc/table-loader [size=4096]QEMU: etc/acpi/rsdp [size=36]QEMU: e820/ram: 0x00000000 +0x08000000QEMU: reserve ioports 0x0510-0x0511 [firmware-config]QEMU: reserve ioports 0x5658-0x5658 [vmware-port]QEMU: reserve ioports 0xae00-0xae0f [pci-hotplug]QEMU: reserve ioports 0xaf00-0xaf1f [cpu-hotplug]QEMU: reserve ioports 0xafe0-0xafe3 [piix4-gpe0]DOMAIN: 0000 read_resources bus 0 link: 0DOMAIN: 0000 read_resources bus 0 link: 0 doneRoot Device read_resources bus 0 link: 0 doneDone reading resources.Show resources in subtree (Root Device)...After reading. Root Device child on link 0 CPU_CLUSTER: 0 CPU_CLUSTER: 0 child on link 0 APIC: 00 APIC: 00 DOMAIN: 0000 child on link 0 PCI: 00:00.0 DOMAIN: 0000 resource base 0 size 0 align 0 gran 0 limit ffff flags 40040100 index 10000000 DOMAIN: 0000 resource base 0 size 0 align 0 gran 0 limit ffffffff flags 40040200 index 10000100 DOMAIN: 0000 resource base 0 size a0000 align 0 gran 0 limit 0 flags e0004200 index a DOMAIN: 0000 resource base c0000 size 7f40000 align 0 gran 0 limit 0 flags e0004200 index b DOMAIN: 0000 resource base 510 size 2 align 0 gran 0 limit ffff flags e0000100 index c DOMAIN: 0000 resource base 5658 size 1 align 0 gran 0 limit ffff flags e0000100 index d DOMAIN: 0000 resource base ae00 size 10 align 0 gran 0 limit ffff flags e0000100 index e DOMAIN: 0000 resource base af00 size 20 align 0 gran 0 limit ffff flags e0000100 index f DOMAIN: 0000 resource base afe0 size 4 align 0 gran 0 limit ffff flags e0000100 index 10 DOMAIN: 0000 resource base fec00000 size 100000 align 0 gran 0 limit ffffffff flags e0000200 index 2 DOMAIN: 0000 resource base fee00000 size 10000 align 0 gran 0 limit ffffffff flags e0000200 index 3 PCI: 00:00.0 PCI: 00:01.0 PCI: 00:01.0 resource base 0 size 1000 align 0 gran 0 limit ffff flags c0000100 index 1 PCI: 00:01.0 resource base ff800000 size 800000 align 0 gran 0 limit 0 flags d0000200 index 2 PCI: 00:01.1 PCI: 00:01.1 resource base 0 size 10 align 4 gran 4 limit ffff flags 100 index 20 PCI: 00:01.3 PCI: 00:01.3 resource base e400 size 40 align 0 gran 0 limit ffff flags d0000100 index 1 PCI: 00:01.3 resource base f00 size 10 align 0 gran 0 limit ffff flags d0000100 index 2 PCI: 00:02.0 PCI: 00:02.0 resource base 0 size 2000000 align 25 gran 25 limit ffffffff flags 1200 index 10 PCI: 00:02.0 resource base 0 size 1000 align 12 gran 12 limit ffffffff flags 200 index 14 PCI: 00:02.0 resource base 0 size 10000 align 16 gran 16 limit ffffffff flags 2200 index 30 PCI: 00:03.0 PCI: 00:03.0 resource base 0 size 20000 align 17 gran 17 limit ffffffff flags 200 index 10 PCI: 00:03.0 resource base 0 size 40 align 6 gran 6 limit ffff flags 100 index 14 PCI: 00:03.0 resource base 0 size 40000 align 18 gran 18 limit ffffffff flags 2200 index 30DOMAIN: 0000 io: base: 0 size: 0 align: 0 gran: 0 limit: ffffPCI: 00:03.0 14 * [0x0 - 0x3f] ioPCI: 00:01.1 20 * [0x40 - 0x4f] ioDOMAIN: 0000 io: base: 50 size: 50 align: 6 gran: 0 limit: ffff doneDOMAIN: 0000 mem: base: 0 size: 0 align: 0 gran: 0 limit: ffffffffPCI: 00:02.0 10 * [0x0 - 0x1ffffff] prefmemPCI: 00:03.0 30 * [0x2000000 - 0x203ffff] memPCI: 00:03.0 10 * [0x2040000 - 0x205ffff] memPCI: 00:02.0 30 * [0x2060000 - 0x206ffff] memPCI: 00:02.0 14 * [0x2070000 - 0x2070fff] memDOMAIN: 0000 mem: base: 2071000 size: 2071000 align: 25 gran: 0 limit: ffffffff doneavoid_fixed_resources: DOMAIN: 0000avoid_fixed_resources:@DOMAIN: 0000 10000000 limit 0000ffffavoid_fixed_resources:@DOMAIN: 0000 10000100 limit ffffffffconstrain_resources: DOMAIN: 0000 0a base 00000000 limit 0009ffff mem (fixed)constrain_resources: DOMAIN: 0000 0b base 000c0000 limit 07ffffff mem (fixed)constrain_resources: DOMAIN: 0000 0c base 00000510 limit 00000511 io (fixed)constrain_resources: DOMAIN: 0000 0d base 00005658 limit 00005658 io (fixed)constrain_resources: DOMAIN: 0000 0e base 0000ae00 limit 0000ae0f io (fixed)constrain_resources: DOMAIN: 0000 02 base fec00000 limit fecfffff mem (fixed)avoid_fixed_resources:@DOMAIN: 0000 10000000 base 00005659 limit 0000adffavoid_fixed_resources:@DOMAIN: 0000 10000100 base fc000000 limit febfffffSetting resources...DOMAIN: 0000 io: base:5659 size:50 align:6 gran:0 limit:adffPCI: 00:03.0 14 * [0x5800 - 0x583f] ioPCI: 00:01.1 20 * [0x5840 - 0x584f] ioDOMAIN: 0000 io: next_base: 5850 size: 50 align: 6 gran: 0 doneDOMAIN: 0000 mem: base:fc000000 size:2071000 align:25 gran:0 limit:febfffffPCI: 00:02.0 10 * [0xfc000000 - 0xfdffffff] prefmemPCI: 00:03.0 30 * [0xfe000000 - 0xfe03ffff] memPCI: 00:03.0 10 * [0xfe040000 - 0xfe05ffff] memPCI: 00:02.0 30 * [0xfe060000 - 0xfe06ffff] memPCI: 00:02.0 14 * [0xfe070000 - 0xfe070fff] memDOMAIN: 0000 mem: next_base: fe071000 size: 2071000 align: 25 gran: 0 doneRoot Device assign_resources, bus 0 link: 0DOMAIN: 0000 assign_resources, bus 0 link: 0PCI: 00:01.1 20 <- [0x0000005840 - 0x000000584f] size 0x00000010 gran 0x04 ioPCI: 00:02.0 10 <- [0x00fc000000 - 0x00fdffffff] size 0x02000000 gran 0x19 prefmemPCI: 00:02.0 14 <- [0x00fe070000 - 0x00fe070fff] size 0x00001000 gran 0x0c memPCI: 00:02.0 30 <- [0x00fe060000 - 0x00fe06ffff] size 0x00010000 gran 0x10 romemPCI: 00:03.0 10 <- [0x00fe040000 - 0x00fe05ffff] size 0x00020000 gran 0x11 memPCI: 00:03.0 14 <- [0x0000005800 - 0x000000583f] size 0x00000040 gran 0x06 ioPCI: 00:03.0 30 <- [0x00fe000000 - 0x00fe03ffff] size 0x00040000 gran 0x12 romemDOMAIN: 0000 assign_resources, bus 0 link: 0Root Device assign_resources, bus 0 link: 0Done setting resources.Show resources in subtree (Root Device)...After assigning values. Root Device child on link 0 CPU_CLUSTER: 0 CPU_CLUSTER: 0 child on link 0 APIC: 00 APIC: 00 DOMAIN: 0000 child on link 0 PCI: 00:00.0 DOMAIN: 0000 resource base 5659 size 50 align 6 gran 0 limit adff flags 40040100 index 10000000 DOMAIN: 0000 resource base fc000000 size 2071000 align 25 gran 0 limit febfffff flags 40040200 index 10000100 DOMAIN: 0000 resource base 0 size a0000 align 0 gran 0 limit 0 flags e0004200 index a DOMAIN: 0000 resource base c0000 size 7f40000 align 0 gran 0 limit 0 flags e0004200 index b DOMAIN: 0000 resource base 510 size 2 align 0 gran 0 limit ffff flags e0000100 index c DOMAIN: 0000 resource base 5658 size 1 align 0 gran 0 limit ffff flags e0000100 index d DOMAIN: 0000 resource base ae00 size 10 align 0 gran 0 limit ffff flags e0000100 index e DOMAIN: 0000 resource base af00 size 20 align 0 gran 0 limit ffff flags e0000100 index f DOMAIN: 0000 resource base afe0 size 4 align 0 gran 0 limit ffff flags e0000100 index 10 DOMAIN: 0000 resource base fec00000 size 100000 align 0 gran 0 limit ffffffff flags e0000200 index 2 DOMAIN: 0000 resource base fee00000 size 10000 align 0 gran 0 limit ffffffff flags e0000200 index 3 PCI: 00:00.0 PCI: 00:01.0 PCI: 00:01.0 resource base 0 size 1000 align 0 gran 0 limit ffff flags c0000100 index 1 PCI: 00:01.0 resource base ff800000 size 800000 align 0 gran 0 limit 0 flags d0000200 index 2 PCI: 00:01.1 PCI: 00:01.1 resource base 5840 size 10 align 4 gran 4 limit 584f flags 60000100 index 20 PCI: 00:01.3 PCI: 00:01.3 resource base e400 size 40 align 0 gran 0 limit ffff flags d0000100 index 1 PCI: 00:01.3 resource base f00 size 10 align 0 gran 0 limit ffff flags d0000100 index 2 PCI: 00:02.0 PCI: 00:02.0 resource base fc000000 size 2000000 align 25 gran 25 limit fdffffff flags 60001200 index 10 PCI: 00:02.0 resource base fe070000 size 1000 align 12 gran 12 limit fe070fff flags 60000200 index 14 PCI: 00:02.0 resource base fe060000 size 10000 align 16 gran 16 limit fe06ffff flags 60002200 index 30 PCI: 00:03.0 PCI: 00:03.0 resource base fe040000 size 20000 align 17 gran 17 limit fe05ffff flags 60000200 index 10 PCI: 00:03.0 resource base 5800 size 40 align 6 gran 6 limit 583f flags 60000100 index 14 PCI: 00:03.0 resource base fe000000 size 40000 align 18 gran 18 limit fe03ffff flags 60002200 index 30Done allocating resources.
注:
由于coreboot方面资料较少,笔者第一次尝试分析代码,还有众多未能参透的地方,难免出错。任何问题,欢迎一起交流学习。
李迟 2016.4.4 周一 清明节
0 0
- coreboot学习8:ramstage阶段之资源分配流程
- coreboot学习6:ramstage阶段之芯片初始化流程
- coreboot学习7:ramstage阶段之设备枚举流程
- coreboot学习9:ramstage阶段之设备初始化流程
- coreboot学习5:启动流程跟踪之ramstage阶段主干分析
- coreboot学习3:启动流程跟踪之bootblock阶段
- coreboot学习4:启动流程跟踪之romstage阶段
- coreboot学习10:coreboot第一阶段学习小结
- live555学习阶段二之二SDP流程(H264)
- coreboot基础——基础流程
- coreboot学习0:二度相逢是初识
- 资源视频学习JavaSE阶段整理笔记
- 软件开发流程之需求阶段
- python学习之--阶段小结
- spark性能调优之分配资源
- hadoop之yarn的资源分配详解
- 产品流程规划的8个阶段
- coreboot学习2:项目源码的初步了解
- 我对java线程同步的理解
- openwrt 平均负载的含义 Load Average
- Gray Code实现
- 分析Linux内核创建一个新进程的过程
- Swift中实现ruby中字符串乘法倍增的功能
- coreboot学习8:ramstage阶段之资源分配流程
- 各种大数模板
- 编译原理 (预处理>编译>汇编>链接)(转)
- lintcode:Convert Sorted List to Balanced BST
- 二分图匹配
- C语言
- 有返回值的线程
- 电源设计之buck变换(一)
- A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS(试译)