use*_*763 3 linux drivers kernel device linux-kernel
我想知道这两个函数之间的区别:
int register_chrdev_region(dev_t first, unsigned int count, char *name);
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 13
有关这两个功能的详细信息,请参见此处
如果您事先知道要从哪个主要编号开始,注册才真正有用.通过注册,您可以告诉内核您需要哪些设备编号(起始主要/次要编号和计数),它是否为您提供(取决于可用性).
通过分配,您可以告诉内核您需要多少设备编号(起始次要编号和计数),当然,如果有可用的话,它会为您找到一个起始主编号.
部分是为了避免与其他设备驱动程序发生冲突,最好使用分配功能,它会为您动态分配设备号.
从上面给出的链接:
一些主要设备号被静态分配给最常见的设备.可以
Documentation/devices.txt在内核源代码树中找到这些设备的列表.但是,为使用新驱动程序而分配静态编号的可能性很小,并且未分配新编号.因此,作为驱动程序编写者,您可以选择:您只需选择一个看似未使用的数字,或者您可以动态分配主要数字.只要您的驱动程序的唯一用户是您,就可以选择一个号码; 一旦您的驱动程序部署得更广泛,随机选择的主要数字将导致冲突和麻烦.
因此,对于新驱动程序,我们强烈建议您使用动态分配来获取主设备号,而不是从当前空闲的设备中随机选择一个数字.换句话说,你的司机几乎肯定会使用
alloc_chrdev_region而不是register_chrdev_region.动态分配的缺点是您无法提前创建设备节点,因为分配给模块的主要编号会有所不同.对于驱动程序的正常使用,这几乎不是问题,因为一旦分配了数字,您就可以从中读取它
/proc/devices.
有一个相关的,而不是技术上的重复,问题在这里.