Linux系统下设备驱动的安全端口分配

http://tech.ddvip.com   2007年03月11日    社区交流

Linux系统下设备驱动的安全端口分配。

  当设备在 init_module ( ) 中登记时,设备的资源如I/O端口,内存和中断号也在这个函数被分配,这也 是驱动程序能够正确操作设备的需要。如果你分配了任何错误的内存地址,系统会显示错误信息segmentation fault。 而对于I/O端口,系统不会给出任何类似wrong I/O port的信息,但是指派任何现有设备已使用的端 口将会造成系统崩溃。当你移出模块时,设备应当被注销,更确切的说,主(设备)号和资源将在cleanup_module ( ) 函 数中被释放。

  设备驱动最频繁的工作时读写IO端口。所以你的驱动应当是确信完美的,被设备使用的端口地址是独占的。任何其他设备都不会使用这段地址范围。为了确认这点,首先驱动应当查明这段地址是否在使用,当驱动发现 这段地址未被使用时,可以申请内核为设备分配这段地址。

  安全端口分配

  现在我们来看看如何通过系统函数来完成资源分配和资源释放。下面的实例 是在linux 2。4内核上进行实验的,以下的所有实现仅适用于Linux操作系统和某些扩展的Unix变种。

  首先侦测可用的端口(地址)范围,通过下面的函数:

int check_region (unsigned long start, unsigned long len);

  函数返回0表示端口地址可用,返回小于零或负的错误编码( -EBUSY or -EINVAL) 表示已在使用中。函数接受2个参数: start 是 连续区域(或I/O端口范围)的起始值,而len是区域内的端口数目。

  当端口可用时,应该将它分配给设备,通过request_region 函数。

  struct resource *request_region (unsigned long start, unsigned long len, char *name);

  头两个参数和我们前面看到的一样,字符指针变量name是要分配端口地址的设备名称。函数返回指向resource结构的指针。Resource结构用来描述资源的范围,定义于。结构的格式定义如下:

作者:tanktang    责编:豆豆技术应用

正在加载评论...