IORESOURCE_X 对应含义
来源:互联网 发布:程序员 app 编辑:程序博客网 时间:2024/05/18 19:22
我们知道IORESOURCE_X 有很多种,但是每种代表的意思有时候不是很明确,还是需要看code才能知道具体的意思
这里以request_standard_resources为例
static void __init request_standard_resources(void)
{
struct memblock_region *region;
struct resource *res;
kernel_code.start = virt_to_phys(_text);
kernel_code.end = virt_to_phys(__init_begin - 1);
kernel_data.start = virt_to_phys(_sdata);
kernel_data.end = virt_to_phys(_end - 1);
for_each_memblock(memory, region) {
res = alloc_bootmem_low(sizeof(*res));
if (memblock_is_nomap(region)) {
res->name = "reserved";
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
} else {
res->name = "System RAM";
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
}
res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
request_resource(&iomem_resource, res);
if (kernel_code.start >= res->start &&
kernel_code.end <= res->end)
request_resource(res, &kernel_code);
if (kernel_data.start >= res->start &&
kernel_data.end <= res->end)
request_resource(res, &kernel_data);
}
}
可以看出如果memblock_is_nomap 返回true 则认为这段memory是reserved,其flag就对应的是IORESOURCE_MEM | IORESOURCE_BUSY。反之如果memory含有IORESOURCE_MEM | IORESOURCE_BUSY也就说明这个memory是reserved
同理可以看出系统memory是IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;的,反之既然。
从这里看出region中memblock_type为memory的就分为两类,reserved和 system ram
static inline bool memblock_is_nomap(struct memblock_region *m)
{
return m->flags & MEMBLOCK_NOMAP;
}
其判断标准就是看是否有MEMBLOCK_NOMAP。
从acpi_dev_filter_resource_type 可以看出其他几个IORESOURCE赋值的情况
int acpi_dev_filter_resource_type(struct acpi_resource *ares,
unsigned long types)
{
unsigned long type = 0;
switch (ares->type) {
case ACPI_RESOURCE_TYPE_MEMORY24:
case ACPI_RESOURCE_TYPE_MEMORY32:
case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
type = IORESOURCE_MEM;
break;
case ACPI_RESOURCE_TYPE_IO:
case ACPI_RESOURCE_TYPE_FIXED_IO:
type = IORESOURCE_IO;
break;
case ACPI_RESOURCE_TYPE_IRQ:
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
type = IORESOURCE_IRQ;
break;
case ACPI_RESOURCE_TYPE_DMA:
case ACPI_RESOURCE_TYPE_FIXED_DMA:
type = IORESOURCE_DMA;
break;
case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
type = IORESOURCE_REG;
break;
case ACPI_RESOURCE_TYPE_ADDRESS16:
case ACPI_RESOURCE_TYPE_ADDRESS32:
case ACPI_RESOURCE_TYPE_ADDRESS64:
case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
if (ares->data.address.resource_type == ACPI_MEMORY_RANGE)
type = IORESOURCE_MEM;
else if (ares->data.address.resource_type == ACPI_IO_RANGE)
type = IORESOURCE_IO;
else if (ares->data.address.resource_type ==
ACPI_BUS_NUMBER_RANGE)
type = IORESOURCE_BUS;
break;
default:
break;
}
return (type & types) ? 0 : 1;
}
这里以request_standard_resources为例
static void __init request_standard_resources(void)
{
struct memblock_region *region;
struct resource *res;
kernel_code.start = virt_to_phys(_text);
kernel_code.end = virt_to_phys(__init_begin - 1);
kernel_data.start = virt_to_phys(_sdata);
kernel_data.end = virt_to_phys(_end - 1);
for_each_memblock(memory, region) {
res = alloc_bootmem_low(sizeof(*res));
if (memblock_is_nomap(region)) {
res->name = "reserved";
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
} else {
res->name = "System RAM";
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
}
res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
request_resource(&iomem_resource, res);
if (kernel_code.start >= res->start &&
kernel_code.end <= res->end)
request_resource(res, &kernel_code);
if (kernel_data.start >= res->start &&
kernel_data.end <= res->end)
request_resource(res, &kernel_data);
}
}
可以看出如果memblock_is_nomap 返回true 则认为这段memory是reserved,其flag就对应的是IORESOURCE_MEM | IORESOURCE_BUSY。反之如果memory含有IORESOURCE_MEM | IORESOURCE_BUSY也就说明这个memory是reserved
同理可以看出系统memory是IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;的,反之既然。
从这里看出region中memblock_type为memory的就分为两类,reserved和 system ram
static inline bool memblock_is_nomap(struct memblock_region *m)
{
return m->flags & MEMBLOCK_NOMAP;
}
其判断标准就是看是否有MEMBLOCK_NOMAP。
从acpi_dev_filter_resource_type 可以看出其他几个IORESOURCE赋值的情况
int acpi_dev_filter_resource_type(struct acpi_resource *ares,
unsigned long types)
{
unsigned long type = 0;
switch (ares->type) {
case ACPI_RESOURCE_TYPE_MEMORY24:
case ACPI_RESOURCE_TYPE_MEMORY32:
case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
type = IORESOURCE_MEM;
break;
case ACPI_RESOURCE_TYPE_IO:
case ACPI_RESOURCE_TYPE_FIXED_IO:
type = IORESOURCE_IO;
break;
case ACPI_RESOURCE_TYPE_IRQ:
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
type = IORESOURCE_IRQ;
break;
case ACPI_RESOURCE_TYPE_DMA:
case ACPI_RESOURCE_TYPE_FIXED_DMA:
type = IORESOURCE_DMA;
break;
case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
type = IORESOURCE_REG;
break;
case ACPI_RESOURCE_TYPE_ADDRESS16:
case ACPI_RESOURCE_TYPE_ADDRESS32:
case ACPI_RESOURCE_TYPE_ADDRESS64:
case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
if (ares->data.address.resource_type == ACPI_MEMORY_RANGE)
type = IORESOURCE_MEM;
else if (ares->data.address.resource_type == ACPI_IO_RANGE)
type = IORESOURCE_IO;
else if (ares->data.address.resource_type ==
ACPI_BUS_NUMBER_RANGE)
type = IORESOURCE_BUS;
break;
default:
break;
}
return (type & types) ? 0 : 1;
}
阅读全文
0 0
- IORESOURCE_X 对应含义
- ADO错误码对应含义
- ADO错误码对应含义
- ImmGetProperty 对应的常量含义
- 参考:大部分ADO错误代码对应含义说明
- IBatis初识_例子字段对应含义
- Log调试对应的各种含义
- C的errno对应的含义
- info.plist各个键值对应含义
- linux系统中errno对应的含义
- HTML常用标签含义及对应中英文
- 大部分的ADO的错误码对应的含义
- 大部分的ADO的错误码对应的含义
- 系统路径含义和系统路径对应的绝对路径
- 等待事件对应的p1,p2,p3含义
- wParam 和 lParam对应不同消息的含义
- 服务器常用的状态码及其对应的含义
- 等待事件对应的p1,p2,p3含义
- python安装LightGBM
- Trafodion 单表迁移
- gcc中的-Wl,rpath=<your_lib_dir>选项
- Java的比较接口 Comparable与Comparator
- C#动态执行函数:利用反射实现
- IORESOURCE_X 对应含义
- [HDU-5979] [Problem I]水题(16大连站)计算几何
- 学写个Python爬虫都被这世界针对
- 设计模式-抽象工厂模式
- iOS 之 UIControl 的 Block 响应方式
- How to use IO BAR in linux PCIe device driver
- Sicily 1198 Substring
- html标签里的onclick的时候总是报错:Uncaught ReferenceError: dosave is not defined(…)
- Hadoop2.7.1 集群环境搭建(虚拟机)