register_chrdev_region 具体实现是怎么样的
时间: 2023-08-13 22:02:30 浏览: 44
`register_chrdev_region()` 函数的具体实现可以参考 Linux 内核源码。
下面是 `register_chrdev_region()` 函数的简化实现过程:
```c
int register_chrdev_region(dev_t first, unsigned int count, const char *name)
{
int error;
struct char_device_struct *cd;
if (!count)
return -EINVAL;
error = alloc_chrdev_region(&first, 0, count, name);
if (error)
return error;
cd = kzalloc(sizeof(struct char_device_struct), GFP_KERNEL);
if (!cd) {
error = -ENOMEM;
goto fail;
}
cd->major = MAJOR(first);
cd->baseminor = MINOR(first);
cd->minorct = count;
cd->name = kstrdup(name, GFP_KERNEL);
error = register_chrdev_region_proc(cd);
if (error)
goto fail;
return 0;
fail:
kfree(cd);
unregister_chrdev_region(first, count);
return error;
}
```
该函数首先会检查需要注册的设备数量 `count` 是否大于 0,然后调用 `alloc_chardev_region()` 函数为设备分配设备号,如果分配失败则返回错误码。如果分配成功,则会创建一个 `char_device_struct` 结构体,该结构体包含设备号、设备数量、设备名称等信息,并将这些信息保存到 `cd` 中。接着,调用 `register_chrdev_region_proc()` 函数将 `cd` 添加到内核的字符设备表中。如果添加失败,则会释放 `cd` 和设备号,并返回错误码。如果添加成功,则返回 0,表示注册成功。
需要注意的是,这只是 `register_chrdev_region()` 函数的简化实现,实际内核源码中可能会有一些细节和差异。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](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)