kernel学习 - 内存

一   页的概念

       关键结构:struct page{flags, count, virtual   };

      一般32位是4K 一页,count表示一页用了多少次; virtual表示虚拟地址空间; 所以看出page是与物理内存一一对应;


二     区的概念

      根据硬件限制,划分内存区域:

         a. DMA(直接内存访问,硬件直接访问该地址,跳过cpu因而更快); x86 < 16M, arm不定, 有见过256M和512M的;

         b. normal 能正常映射的普通页

         c. high 高端内存,不能永久映射到内核; x86的high mem是 > 896M; 是因为32 bit总共寻址4G, 用户3G, 内核只有1G, 且有128M用作动态交换;

      

三  基本函数

      alloc_pages(flag, order)以及__get_free_page(flag, order) 效果是一样,前个返回page,后个返回物理页的虚拟地址; 因为高端内存没映射前还无虚拟地址,所以只能从alloc_pages获得。

      kmalloc就更简单了,直接申请需要大小; 参数flag一般是GFP_KERNEL, GFP_ATOMIC, GFP_DMA三种,默认是第一种,可睡眠,并且从normal内存分配;如果非要分配高端内存,则必须手动kmap和kumap。

     vmalloc : 与kmalloc, 区别在于前者物理地址不一定连续,是MMU映射不连续的物理地址到连续虚拟地址;

     per_cpu数据 :  DECLARE_PER_CPU( ), DECLARE_PER_CPU( )用在编译阶段生成cpu数据,get_cpu_var( )用来获取值,获取过程中会禁止抢占,对应的put_cpu_var()会激活抢占。比如softnet_data就是在dev.c 生成,存储从中断拿到的data。使用per_cpu的好处是多处理器可以并行,而不用对数据加锁。



四. slab层

     说白了,原理就是高速缓存数据结构,加速频繁 分配/释放 的数据结构;原理是预先分配一块列表,释放后仅置位,而不真正释放。

     接口有: kmem_cache_create (创建新的结构), kmem_cache_alloc(分配),  kmem_cache_free;  比如files_cachep, task_struct_cachep都在用。

 


     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值