Linux内核学习笔记 -20 动手实践linux内存映射基础 - 中(驱动程序源码分析)

进入源码,看内存映射具体的实现过程。 驱动程序源码map_driver.c

驱动程序大概有三部分组成,1-模块的装载卸载; 2-file_operations结构体和mmap函数;3-vm_operations_struct结构体和fault函数。首先是模块的装载函数,它所要完成的工作是两个,设备的注册,在内核中为设备申请一块内存。

设备的注册由register_chrdev这个函数来实现,这里需要指定设备的主设备号MAP_DEV_MAJOR, 设备的名称MAP_DEV_NAME, 还有它所链接的file_operations 结构 &mapdrvo_fops);

这里如果主设备号为零,该设备将自己分配一个主设备号,返回给result。如果返回值为0,表示分配成功;返回值为负表示设备注册失败。

接下来是申请内存,此处用的是vmalloc函数,vmalloc函数的特点是申请的内存区域在内核的线性地址是连续的,但物理地址不连续。

这里我们看到这里还有为申请到的页框的PageReserved标志位置位,这样做是高诉系统,该物理页框已经被我使用。

static int __init mapdrv_init(void)
{
	int result;
	unsigned long virt_addr;
	int i = 1;
	result = register_chrdev(MAP_DEV_MAJOR,MAP_DEV_NAME,&mapdrvo_fops);
	if(result<0){
		return result;
	}
	vmalloc_area=vmalloc(MAPLEN);
	virt_addr = (unsigned long)vmalloc_area;
	for(virt_addr =(unsigned long)vmalloc_area;virt_addr < (unsigned long)vmalloc_area + MAPLEN; virt_addr += PAGE_SIZE);
	{
		SetPageReserved(vmalloc_to_page(void *)virt_addr));
		sprin

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/107748273