日期:2014-05-16 浏览次数:20753 次
1、SCSI子系统初始化
SCSI子系统总是被编译到Linux内核的,其初始化入口函数为init_scsi,在文件drivers/scsi/scsi.c中。它使用宏subsys_initcall定义。
static int __init init_scsi(void)
{
int error;
error = scsi_init_queue();
//初始化聚散列表等所需要的存储池
if (error)
return error;
error = scsi_init_procfs(); //初始化proc文件系统中与SCSI有关的目录项
if (error)
goto cleanup_queue;
error = scsi_init_devinfo(); // 设置SCSI动态设备信息列表
if (error)
goto cleanup_procfs;
error = scsi_init_hosts(); //注册shost_class类,这将在sys/class/目录下创建scsi_host子目录
if (error)
goto cleanup_devlist;
error = scsi_init_sysctl(); //注册SCSI系统控制表
if (error)
goto cleanup_hosts;
error = scsi_sysfs_register();
//注册SCSI总线类型以及sdev_class类
if (error)
goto cleanup_sysctl;
scsi_netlink_init(); //初始化SCSI传输netlink接口,netlink是Linux内核与用户空间进行通信的一种机制
printk(KERN_NOTICE "SCSI subsystem initialized\n");
return 0;
cleanup_sysctl:
scsi_exit_sysctl();
cleanup_hosts:
scsi_exit_hosts();
cleanup_devlist:
scsi_exit_devinfo();
cleanup_procfs:
scsi_exit_procfs();
cleanup_queue:
scsi_exit_queue();
printk(KERN_ERR "SCSI subsystem failed to initialize, error = %d\n",
-error);
return error;
}
2、SCSI子系统exit_scsi退出
static void __exit exit_scsi(void)
{
scsi_netlink_exit();
scsi_sysfs_unregister();
scsi_exit_sysctl();
scsi_exit_hosts();
scsi_exit_devinfo();
scsi_exit_procfs();
scsi_exit_queue();
}