混乱的 API 函数
我在刚开始接触Linux驱动的时候,非常的困扰:注册一个字符设备,怎么有这么多的 API 函数啊?
参考的每一篇文章中,使用的函数都不一样,但是执行结果都是符合预期的!
比如下面这几个:
register_chrdev(...);
register_chrdev_regin(...);
cdev_add(...);
它们的功能都是向系统注册字符设备,但是只从函数名上看,初学者谁能分得清它们的区别?!
这也难怪,Linux系统经过这么多年的发展,代码更新是很正常的事情。
但是,我们参考的文章就没法做到:很详细的把文章中所描述内容的背景介绍清楚,往往都是文章作者在自己的实际工作环境中,测试某种方法解决了自己的问题,于是就记录成文。
不同的文章、不同的工作上下文、不同的API函数调用,这往往就苦了我们初学者,特别是我这种有选择障碍症的人!
其实,上面这个几个函数都是正确的,它们的功能都是类似的,它们是 Linux 系统中不同阶段的产物。
旧的 API 函数
在Linux内核代码2.4版本和早期的2.6版本中,注册、卸载字符设备驱动程序的经典方式是:
注册设备:
int register_chrdev(unsigned int major,const char *name,struct file_operations *fops);
参数1 major:如果为0 - 由操作系统动态分配一个主设备号给这个设备;如果非0 - 驱动程序向系统申请,使用这个主设备号;
参数2 name:设备名称;
参数3 fops:file_operations 类型的指针变量,用于操作设备;
如果是动态分配,那么这个函数的返回值就是:操作系统动态分配给这个设备的主设备号。
这个动态分配的设备号,我们要把它记住,因为在其他的API函数中需要使用它。
卸载设备:
int unregister_chrdev(unsigned int major,const char *name)
大型站长资讯类网站! https://www.0370zz.cn