linux pci


//pci的初始化顺序可以从System.map文件中看出来:
$grep "initcall" System.map  | grep pci
ffffffff8170fdb8 t __initcall_pci_reboot_init1
ffffffff8170fe68 t __initcall_pcibus_class_init2     //pcibus_class_init():注册一个名为"pci_bus"的class结构               
ffffffff8170fe70 t __initcall_pci_driver_init2       //pci_driver_init()
ffffffff8170fec8 t __initcall_acpi_pci_init3         //acpi_pci_init()
ffffffff8170fed8 t __initcall_pci_arch_init3         //pci_arch_init()  
ffffffff8170ff50 t __initcall_pci_slot_init4         //pci_slot_init()在sysfs文件系统中建立slots目录及其kobject结构 
ffffffff8170ff68 t __initcall_acpi_pci_root_init4    //acpi_pci_root_init()
ffffffff8170ff70 t __initcall_acpi_pci_link_init4    //acpi_pci_link_init()
ffffffff8170ffb8 t __initcall_pci_subsys_init4       //pci_subsys_init()
ffffffff817100b0 t __initcall_pcibios_assign_resources5     //pcibios_assign_resources()
ffffffff817100d0 t __initcall_pci_apply_final_quirks5s
ffffffff817100e0 t __initcall_pci_iommu_initrootfs
ffffffff81710440 t __initcall_pci_proc_init6                //pci_proc_init()
ffffffff817104b8 t __initcall_serial8250_pci_init6
ffffffff81710568 t __initcall_ide_scan_pcibus6
ffffffff81710748 t __initcall_pci_resource_alignment_sysfs_init7
ffffffff81710750 t __initcall_pci_sysfs_init7               //pci_sysfs_init()



//pci_arch_init()@
static __init int pci_arch_init(void)
+-- type = pci_direct_probe();
+-- if (!(pci_probe & PCI_PROBE_NOEARLY))
              pci_mmcfg_early_init();
+-- if (x86_init.pci.arch_init && !x86_init.pci.arch_init())
              return 0;
+-- pci_pcbios_init();
+-- pci_direct_init(type);
+-- dmi_check_pciprobe();
+-- dmi_check_skip_isa_align();


//在sysfs文件系统中建立slots目录及其kobject结构
static int pci_slot_init(void)
+-- pci_bus_kset = bus_get_kset(&pci_bus_type);
+-- pci_slots_kset = kset_create_and_add("slots", NULL, &pci_bus_kset->kobj);


//
static int __init acpi_pci_root_init(void)
+-- acpi_hest_init();
+-- acpi_hest_init();
+-- acpi_bus_register_driver(&acpi_pci_root_driver)


//
static int __init acpi_pci_link_init(void)
+-- acpi_bus_register_driver(&acpi_pci_link_driver);


//
int __init pci_subsys_init(void)
+-- if (x86_init.pci.init())
            pci_legacy_init(); 
+-- pcibios_fixup_peer_bridges();
+-- x86_init.pci.init_irq(); 
+-- pcibios_init();


//对PCI设备使用的存储器和IO资源进行设置.
//对于x86 BIOS已经将PCI设备使用的存储器和IO资源设置完毕,
//而对于power PC,则需要使用该函数设置PCI设备使用的存储器和IO资源
static int __init pcibios_assign_resources(void)
+-- for_each_pci_dev(dev) {
        r = &dev->resource[PCI_ROM_RESOURCE];
        if (!r->flags || !r->start)
             continue;
        if (pci_claim_resource(dev, PCI_ROM_RESOURCE) < 0) {
            r->end -= r->start;
            r->start = 0;
        }
    }
+-- pci_assign_unassigned_resources();
+-- pcibios_fw_addr_list_del();



//pci_proc_init()函数的主要功能是在proc文件系统中建立/bus/pci目录
//并将proc_fs默认提供的file_operations更换为proc_bus_pci_dev_operations.
static int __init pci_proc_init(void)
+-- proc_bus_pci_dir = proc_mkdir("bus/pci", NULL);
+-- proc_create("devices", 0, proc_bus_pci_dir, &proc_bus_pci_dev_operations);
+-- proc_initialized = 1;
+-- for_each_pci_dev(dev)
        pci_proc_attach_device(dev);




源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值