首先,内存管理方面的。
内存结构不用多说,物理内存方面会被分成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结构的。
主要叙述一些原理性的东西,代码就不细究了, 先写这么些,后续有什么想起来的再补充。
阅读(1047) | 评论(1) | 转发(0) |