Jimmy Chen

A Programmer

(原创)Device Mapper源码分析

  上一篇只是从理论上说明了Device Mapper(DM)的基本知识,这一篇我们来阅读以下代码。因为Device Mapper涉及较多的块设备驱动内容的知识,博主对这一块涉及不深,大家将就看了。

DM是一个驱动

  首先DM是一个驱动,User Space的应用要想建立设备映射就需要打开该驱动,然后通过其提供的IOCTL借口来完成对应的工作。DM驱动注册的开始位置在drivers/md/dm.c文件底下,一个一个尽量分析。

local_init函数

dm_target_init

  看代码这里是注册一个名为“error”的target_type,正如上一篇介绍的,Target_type 结构主要包含了 target device 对应的 target driver 插件的名字、定义的构建和删除该类型target device的方法、该类target device对应的IO请求重映射和结束IO的方法等。

linear_target

  和注册“error” target_type一样,这里注册“linear” target_type。剩下的dm_stripe_init、dm_kcopyd_init函数也基本类似,这里就不多做解释了。dm_io_init函数只是简单的分配一些需要用到的IO缓存,也没什么好讲的。

dm_interface_init

  前面说过,User Space的程序主要是通过DM驱动IOCTL函数进行相关的请求,所以接下来我们着重分析下IOCTL函数。

DM中IOCTL

  不管dm_compat_ctl_ioctl还是dm_ctl_ioctl,最后都是会调用到ctl_ioctl方法的。

  上面的lookup_ioctl函数首先定义一个IOCTL command以及对应操作函数的结构体。支持的command以及对应函数都在这里了。我们调一些重要的来看看就好。

DM_DEV_CREATE_CMD

dm_create ===> alloc_dev

alloc_dev函数基本就是对mapped_device结构体的内容进行逐项初始化。然后通过add_disk函数将该block device添加到内核中。接下来分析另一个IOCTL command。

DM_TABLE_LOAD_CMD

  DM_DEV_CREATE_CMD根据映射表为目标target和真是的block设备建立映射关系

  正如上一篇中解析说道:用户空间命令通过ioctl调用table_load函数,该函数根据用户空间传来的参数构建指定mapped device的映射表和所映射的target device。该函数先构建相应的dm_table、dm_target结构,再调用dm-table.c中的dm_table_add_target(populate_table—>dm_table_add_target)函数根据用户传入的参数初始化这些结构,并且根据参数所指定的target类型,调用相应的target类型的构建函数ctr在内存中构建target device对应的结构,然后再根据所建立的dm_target结构更新dm_table中维护的B树。上述过程完毕后,再将建立好的dm_table添加到mapped device的全局hash表对应的hash_cell结构中。

  这一篇基本就这样了,简单的从代码层面分析下DM。大家在阅读代码的时候可以结合上一篇的内容同步分析,这样应该会好理解很多。Have fun!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注