一.安卓8.1 设备匹配驱动过程

一.安卓8.1 设备匹配驱动过程
当内核发现一个新设备总是会调用device_add
Y:\kernel\drivers\base\core.c
device_add->{
bus_add_device
bus_probe_device(dev);
}

bus_add_device->                            Y:\kernel\drivers\base\bus.c
 bus_probe_device(dev);->
            device_initial_probe->           Y:\kernel\drivers\base\dd.c
                __device_attach(dev, true);->
                                bus_for_each_drv->          Y:\kernel\drivers\base\bus.c
                                         error = fn(drv, data);
        fn 等于传递的函数指针 __device_attach_driver

__device_attach_driver->                                  Y:\kernel\drivers\base\dd.c
       driver_match_device    //检查设备与驱动是否匹配
        ->driver_probe_device(drv, dev);->
                    really_probe(dev, drv);             Y:\kernel\drivers\base\dd.c

static int really_probe(struct device *dev, struct device_driver *drv)
{
if (dev->bus->probe) { //设备级别
ret = dev->bus->probe(dev);
if (ret)
goto probe_failed;
} else if (drv->probe) { //interface级别:
ret = drv->probe(dev);
if (ret)
goto probe_failed;
}

}
1.对于usb设备则是调用一下2种方式
① usb设备
usb_register_device_driver-> Y:\kernel\drivers\usb\core\driver.c
usb_probe_device ->
udriver->probe(udev);
②usb接口
usb_register_driver->
usb_probe_interface->
driver->probe(intf, id);

二.检查驱动与设备是否匹配

__device_attach_driver-> Y:\kernel\drivers\base\dd.c
driver_match_device-> drivers/base/base.h //检查设备与驱动是否匹配

static inline int driver_match_device(struct device_driver *drv,
struct device *dev)
{
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}
1.对于平台设备 drivers/base/platform.c中

 int __platform_driver_register(struct platform_driver *drv,struct module *owner)   中

{
drv->driver.owner = owner;
drv->driver.bus = &platform_bus_type;
drv->driver.probe = platform_drv_probe;
drv->driver.remove = platform_drv_remove;
drv->driver.shutdown = platform_drv_shutdown;

    return driver_register(&drv->driver);

}
而struct bus_type platform_bus_type = {
.name = “platform”,
.dev_groups = platform_dev_groups,
.match = platform_match,
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops,
};

所以 ->drv->bus->match()==platform_match()
->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE)
如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动.
1.对于usb设备Y:\kernel\drivers\usb\core\driver.c中
int usb_register_device_driver(struct usb_device_driver *new_udriver,
struct module *owner)
{
int retval = 0;

if (usb_disabled())
    return -ENODEV;

new_udriver->drvwrap.for_devices = 1;
new_udriver->drvwrap.driver.name = new_udriver->name;
new_udriver->drvwrap.driver.bus = &usb_bus_type;
new_udriver->drvwrap.driver.probe = usb_probe_device;
new_udriver->drvwrap.driver.remove = usb_unbind_device;
new_udriver->drvwrap.driver.owner = owner;

retval = driver_register(&new_udriver->drvwrap.driver);

if (!retval)
    pr_info("%s: registered new device driver %s\n",
        usbcore_name, new_udriver->name);
else
    printk(KERN_ERR "%s: error %d registering device "
        "    driver %s\n",
        usbcore_name, retval, new_udriver->name);

return retval;

}
struct bus_type usb_bus_type = {
.name = “usb”,
.match = usb_device_match,
.uevent = usb_uevent,
};
所以usb_device_match 简单判断是否usb设备
if (is_usb_device(dev)) {
}
else if (is_usb_interface(dev)) {}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: ikvm.net是一个开源的Java虚拟机(JVM)实现,可以在.NET平台上运行Java代码。v8.1是ikvm.net的一个版本,它可能包含了一些新功能、修复了一些bug,或者对之前版本进行了性能优化。 ikvm.net使用了一种特殊的技术,将Java字节码转换成Microsoft Common Intermediate Language(CIL),然后在.NET运行时环境中运行。这使得开发人员可以利用Java生态系统中的丰富资源,同时在.NET平台上编写和调试Java代码。 ikvm.net具有很多优点。首先,它提供了一个无缝的集成解决方案,使得Java和.NET代码可以在同一个应用程序中共存。这对于需要同时使用两种技术的项目非常有用。其次,ikvm.net在跨平台兼容性方面表现良好,可以在Windows、Linux和其他支持.NET的操作系统上运行。此外,ikvm.net还提供了对Java类库的扩展性支持,使得开发人员可以在.NET平台上使用Java库。最后,ikvm.net的性能表现也很好,虽然它需要运行一个额外的虚拟机层,但其性能与其他Java虚拟机相当。 但需要注意的是,ikvm.net并不是一个官方的Java虚拟机实现,因此可能存在一些兼容性或稳定性的问题。开发人员在使用ikvm.net时需要进行充分的测试和验证,以确保代码的正确性和性能。 总之,ikvm.netv8.1是一个在.NET平台上运行Java代码的开源解决方案。它提供了无缝的集成、跨平台兼容性和性能优势,使得开发人员能够在.NET环境中使用Java生态系统的资源。但使用ikvm.net时需要注意其非官方性质可能带来的一些问题。 ### 回答2: ikvm.net是一个开源项目,它提供了将Java虚拟机(JVM)与.NET框架整合的解决方案。它的目的是让Java代码能够在.NET环境中运行,同时保留原有的Java代码结构和功能。 ikvm.net的特点之一是它能够将Java字节码直接转换为.NET字节码。它通过自己的Java虚拟机实现了Java类库和运行时环境,并将JVM与.NET框架进行了适配。这使得开发人员可以在.NET平台上使用Java代码,而无需重新编写或修改现有的Java代码。 此外,ikvm.net还提供了对Java Native Interface (JNI) 的支持,使得Java代码能够与原生.NET代码进行交互。这个特性为开发人员提供了更大的灵活性,可以利用.NET平台的优势扩展和增强Java代码的功能。 ikvm.net还允许将Java应用程序打包为.NET的可执行文件,这样就可以在没有Java运行时环境的机器上运行Java应用程序。同时,ikvm.net还提供了一系列工具和命令行选项,用于帮助开发人员在.NET平台下使用和调试Java代码。 总的来说,ikvm.net是一个非常有用的工具,它弥合了Java和.NET两个开发平台之间的差距,允许开发人员在.NET环境中使用Java代码,并为Java开发人员提供了更多的选择和灵活性。无论是将现有的Java代码迁移到.NET平台上,还是在.NET平台上使用Java代码,ikvm.net都是一个很好的选择。 ### 回答3: ikvm.net是一个将Java虚拟机(JVM)与.NET框架结合的开源项目。ikvm.net提供了一个Java虚拟机的实现,使得Java代码可以运行在.NET环境中。 ikvm.net v8.1是ikvm.net的一个特定版本,它带来了一些新的特性和改进。它可能包括一些新的API,底层代码的优化,以及对Java语言标准的最新支持。 ikvm.net v8.1的一个重要特性可能是性能的提升。通过对代码的优化和改进,ikvm.net可能能够更高效地执行Java代码,从而提供更好的性能。 此外,ikvm.net v8.1可能还包含一些Bug修复和安全性增强。由于软件开发过程中难免会出现一些问题,ikvm.net团队可能会修复一些已知的Bug,确保ikvm.net的稳定性和安全性。 总的来说,ikvm.net v8.1是ikvm.net的一个更新版本,它带来了一些新的功能和改进,如性能提升、Bug修复和安全性增强等,以便提供更好的Java在.NET环境中的运行体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术求索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值