При итерации объектов IOService итератор переходит в дочерние узлы? - PullRequest
1 голос
/ 27 июня 2019

Например, если я хочу найти все IOPCIDevice, я использую

CFMutableDictionaryRef dict = IOServiceMatching("IOPCIDevice");
IOServiceGetMatchingServices(kIOMasterPortDefault,matchDict,
                                     &iterator) == kIOReturnSuccess

После этого итератор указывает на узел, который является IOPCIDevice.

      iterator
         |
Parent (IOPCIDevice) <--- child of ---- Child(IOPCIDevice)
         |
         |
Another parent (IOPCIDevice)
         |
         ---------------- ...

Мой вопрос таков: будет ли этот итератор идти в дочерние узлы? Как это перебирает все совпадающие узлы?

1 Ответ

1 голос
/ 27 июня 2019

Мой вопрос таков: будет ли этот итератор помещаться в дочерние узлы?

Да, если какие-либо дочерние узлы также соответствуют критериям соответствия.

Как это повторяет все совпадающие узлы?

Я не думаю, что есть какая-либо гарантия того, в каком порядке будут возвращены объекты, если это то, что вы спрашиваете.

Довольно просто продемонстрировать поведение, используя следующий код:

#include <IOKit/IOKitLib.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{
    CFMutableDictionaryRef matching_dict = IOServiceMatching("IOPCIDevice");
    io_iterator_t match_iter = IO_OBJECT_NULL;
    IOReturn result = IOServiceGetMatchingServices(
        kIOMasterPortDefault, matching_dict, &match_iter);
    if (result == kIOReturnSuccess)
    {
        io_service_t matched_service;
        while ((matched_service = IOIteratorNext(match_iter)))
        {
            io_name_t service_class = "";
            io_string_t service_path = "";
            IORegistryEntryGetPath(matched_service, kIOServicePlane, service_path);
            IOObjectGetClass(matched_service, service_class);
            printf("%s [%s]\n", service_path, service_class);
            IOObjectRelease(matched_service);
        }
        IOObjectRelease(match_iter);
    }

    return 0;
}

В моей системе Mac Mini (2018) с некоторыми устройствами, подключенными через Thunderbolt, я получаю следующий вывод:

IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/MCHC@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IGPU@2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/pci8086,a379@12 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/XGBE@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/pci8086,a36f@14,2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/IMEI@16 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP17@1B [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB1@1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP17@1B/IOPP/ANS2@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB1@1/IOPP/UPS0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB4@4 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP17@1B/IOPP/IOBC@0,1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB1@1/IOPP/UPS0@0/IOPP/pci-bridge@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB1@1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP17@1B/IOPP/SEPM@0,2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB4@4/IOPP/UPS0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB1@1/IOPP/UPS0@0/IOPP/pci-bridge@0/IOPP/pci11c1,5901@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP17@1B/IOPP/ADIO@0,3 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB2@2 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB4@4 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB2@2/IOPP/XHC2@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB4@4/IOPP/UPS0@0/IOPP/pci-bridge@1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB0@0/IOPP/NHI0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB4@4/IOPP/UPS0@0/IOPP/pci-bridge@1/IOPP/display@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/IOPP/UPSB@0/IOPP/DSB4@4/IOPP/UPS0@0/IOPP/pci-bridge@1/IOPP/pci1002,aaf0@0,1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB2@2/IOPP/XHC3@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG2@1,2/IOPP/UPSB@0/IOPP/DSB0@0/IOPP/NHI0@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP01@1C [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP02@1C,1 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/URT0@1E [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/LPCB@1F [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/HDEF@1F,3 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/RP01@1C/IOPP/ARPT@0 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SBUS@1F,4 [IOPCIDevice]
IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XSPI@1F,5 [IOPCIDevice]

Вы можете видеть, что

IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1

является родительским узлом

IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG0@1/IOPP/XGBE@0
...