Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262330
  • 博文数量: 49
  • 博客积分: 1684
  • 博客等级: 上尉
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:45
文章分类

全部博文(49)

文章存档

2023年(1)

2021年(2)

2018年(2)

2017年(7)

2016年(2)

2015年(6)

2014年(13)

2013年(7)

2012年(7)

2011年(1)

2010年(1)

分类: LINUX

2014-09-06 00:34:28

首先,内存管理方面的。

    内存结构不用多说,物理内存方面会被分成ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。
    使用方面主要还是从虚拟内存上考虑,因为在驱动开发过程中,我们比较少会去管理物理内存,这个工作kernel会给我们做好,我们只要用好就OK。
    首先要明确的是,内存的使用方法有哪几种。也就是我们驱动中获取内存的手段。
    其次,明确以上方法之后,各个方法的一些原理细节还是要弄明白。
比如kmalloc分配的内存是基于谁进行分配的,使用什么方式分配等等,
kmalloc实际是基于slab分配的,分配的大小也会有些限制的,正常kernel配置的k    malloc能申请的最小内存是32哥字节,上限是128KB,而且往往不是分配任意大小,因为slab主要是针对内核对像所使用内存的分配,内核中使用的对象,往往应该是会考虑cacheline对齐的;
区别于get_free_pages,get_free_pages是分配page内存的,是从mem_map(内核中的全局变量,page结构数组)中找到要求数量的连续page,然后返回首个page结构指针,该分配是使用buddy算法进行分配的,实际这个函数跟踪进去会发现最终是调用alloc_pages进行分配的。分配page的接口,在size上也有限制,不能超过2048个page,因此可以分配的最大连续内存是2048 * 4K = 8M,如果在内核空间需要再动态分配更大空间的连续物理内存,那就没有办法了,只能考虑将内核空间以外的固定内存映射一把使用了。
以上两个分配方式在使用标志时基本相同,需要注意的一点是,除了使用GFP_ATOMIC不会休眠以外,其他的 标志会引起休眠,不要在中断中使用。除此之外,还有一个GFP_HIGHMEM的问题,如果用alloc_pages来分配高端内存的页面的话,这个分配到的页很有可能未经映射,此时需要通过kmap来将分配所得页映射到永久映射区。
vmalloc的分配就没什么好说的了,分配的是连续的虚拟空间,最终分配到的物理内存不一定连续。
      最后要提到一点的是mmap系统调用。其对应的驱动中要实现该方法,需要通过remap_pfn_range来将物理内存映射到用户空间,用户空间的参数,比如起始地址什么的,一般不直接指定,因为在userspace那些空间可以使用并不一定,为保证程序的portable,为这个参数指定0,即由kernel来决定到底映射到userspace的什么地址,kernel计算好之后会填充一个vma结构,然后kernel在调用驱动的mmap方法时,将计算好的vma传入,在实现mmap方法时,是不需要我们自己准备vma结构的。
     主要叙述一些原理性的东西,代码就不细究了, 先写这么些,后续有什么想起来的再补充。
阅读(1058) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

lelee0072014-09-06 00:36:05

补充一点点,remap_pfn_range不是可以随便用来映射内存的操作,不像kmap和ioremap一样