Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086797
  • 博文数量: 288
  • 博客积分: 10594
  • 博客等级: 上将
  • 技术积分: 3469
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-27 19:27
文章分类

全部博文(288)

文章存档

2012年(4)

2011年(30)

2010年(40)

2009年(32)

2008年(71)

2007年(79)

2006年(32)

分类: LINUX

2007-09-12 15:16:54

分配与释放,注册与注销
在内核空间运行的模块,在分配了系统资源后,必须在不再使用前,进行释放,向内核返回所分配的资源。同时,很多模块在实际使用前,必须向内核注册自己,同样,在生命期结束时,必须向内核注销自己。
分配与释放,注册与注销。在内核模块中,经常是成对出现的。在我们前文描述的8139too网卡驱动初始化程序中,就存在很多这样的操作。下面我们一一列出,并作简单分析:

pci_register_driver与pci_unregister_driver
它们是分别在PCI设备驱动模块的初始化函数和清除函数中被调用的函数,都以一个struct pci_driver结构体作为参数。下面是这个结构的定义:
struct pci_driver {
struct list_head node;
char *name;
struct module *owner;
const struct pci_device_id *id_table;
int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);
void (*remove)(struct pci_dev *dev);
int (*suspend)(struct pci_dev *dev, pm_message_t state);
int (*resume)(struct pci_dev *dev); /* Device woken up */
int (*enable_wake)(struct pci_dev *dev,pci_power_t state,int enable);
void (*shutdown) (struct pci_dev *dev);
struct device_driver driver;
struct pci_dynids dynids;
};
它有一个成员struct device_driver,是一个更为一般化的设备驱动对象,在pci_register_driver函数中,会把pci_driver的很多成员赋 给该结构中的相应成员。同时,建立动态PCI的id表(为热插拔设备用)。最后,向总线注册该设备。而在pci_unregister_driver中做 的事情就是从总线中注销该设备,同时释放动态的PCI id表。

alloc_etherdev和free_netdev
前文已经描述过,alloc_etherdev是alloc_netdev的封装函数。它们都以struct net_device结构体作为参数,alloc_netdev所做事情就是在内核空间为该结构体kmalloc内存,最后调用它的初始化函数。而 free_netdev则主要是kfree内存。

pci_enable_device和pci_disable_device
在一个pci设备可以被使用之前,必须调用pci_enable_device进行激活,该函数会调用底层代码激活PCI设备上的I/O和内存,使之可用。而pci_disable_device所做的事情刚好相反,告诉系统该PCI设备不再使用,
同时,禁用相关的一些资源。

pci_request_regions和pci_release_regions
这两个函数背后,实际调用的是request_region和release_region,或者request_mem_region和 release_mem_region进行I/O端口的分配与释放,或者I/O内存的分配与释放。

还有关于pci_iomap与pci_iounmap,前文已有介绍。

阅读(1148) | 评论(0) | 转发(0) |
0

上一篇:Linux slab 分配器详解

下一篇:硬件与通信

给主人留下些什么吧!~~