driver_register和bus_add_driver的区别是什么?
时间: 2023-04-11 16:01:53 浏览: 130
driver_register和bus_add_driver都是Linux内核中的函数,但它们的作用不同。driver_register用于注册一个设备驱动程序,而bus_add_driver用于将驱动程序添加到总线中。具体来说,driver_register函数将驱动程序注册到内核中,以便内核可以在需要时加载该驱动程序。而bus_add_driver函数则将驱动程序添加到总线中,以便总线可以在需要时加载该驱动程序。
相关问题
bus_register代码流程
下面是 "bus_register" 函数的代码流程:
```c
int bus_register(struct bus_type *bus)
{
int retval;
if (!bus || !bus->name)
return -EINVAL;
/* Add the bus to the list */
retval = bus_add(bus);
if (retval)
return retval;
/* Register any drivers that have already been added */
driver_register(bus, bus->p);
return 0;
}
```
首先,函数会检查传入的参数是否有效。如果 "bus" 指针或者 "bus->name" 为空,则会返回 -EINVAL。
接着,函数会调用 "bus_add" 函数将设备总线添加到内核的设备总线列表中。如果添加失败,则会返回错误代码。
然后,函数会调用 "driver_register" 函数将设备驱动程序注册到总线上。该函数会将驱动程序添加到总线的驱动程序列表中,并在总线上查找与驱动程序名称匹配的设备。如果找到了匹配的设备,则会调用驱动程序的 "probe" 函数进行设备初始化,否则驱动程序将不会被加载。
最后,函数会返回 0 表示注册成功,或者返回其他错误代码表示注册失败。
总之,"bus_register" 函数的代码流程比较简单,主要是调用了 "bus_add" 和 "driver_register" 函数来实现设备总线和设备驱动程序的注册。
linux bus_register代码流程
下面是 Linux 内核中 "bus_register" 函数的代码流程:
```c
int bus_register(struct bus_type *bus)
{
int ret;
if (!bus || !bus->name)
return -EINVAL;
/* Add the bus to the list */
ret = bus_add(bus);
if (ret)
return ret;
/* Register any drivers that have already been added */
driver_register(bus, bus->p);
return 0;
}
```
首先,函数会检查传入的参数是否有效,包括 "bus" 指针和 "bus->name" 字段是否为空。如果参数无效,则会返回 -EINVAL。
接着,函数会调用 "bus_add" 函数将设备总线添加到内核的设备总线列表中。该函数会检查是否有相同名称的总线已经存在于列表中,如果没有则会添加到列表中。
然后,函数会调用 "driver_register" 函数将设备驱动程序注册到总线上。该函数会将驱动程序添加到总线的驱动程序列表中,并在总线上查找与驱动程序名称匹配的设备。如果找到了匹配的设备,则会调用驱动程序的 "probe" 函数进行设备初始化,否则驱动程序将不会被加载。
最后,函数会返回 0 表示注册成功,或者返回其他错误代码表示注册失败。
总之,"bus_register" 函数是 Linux 内核中用于注册设备总线的重要函数,它通过调用 "bus_add" 和 "driver_register" 函数来实现设备总线和设备驱动程序的注册。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)