《unix设备驱动》内存分配
這里只簡單介紹一下內核中提供的一些內存管理接口,方便內核開發入門人員對內存管理有一個大致的了解,也方便自己以后復習
?
Kmalloc
?
分配的區域在物理內存中式連續的
函數原型:void * kmalloc(size_t size ,int flags)不同的標志可以以不同的方式控制kmalloc的行為
比如是內核內存的分配還是用戶空間內存分配,分配過程中是否可以休眠等等
?
內核把內存分為三個區段:
可用于DMA的內存
常規內存
高端內存
?
物理內存只能按照頁面進行分配
只能分配一些預定義的,固定大小的字節數組
后備高速緩存
為某些反復使用的塊增加某些特俗的內存池
設備程序一般不會涉及使用后備高速緩存,除了USB和SCSI
?
可以通過
kmem_cache_t*kmem_cache_create(const char*name,size_t size,size_t offset,unsigned long flags,void(*constructor)(void*,kmem_cache_t*,unsigned long flags),void(*destructor)(void*,kmem_cache_t*,unsigned long flags));
分配,創建一個高速緩存對象,其中可以容納任意數目的內存區域
?
Scull 與scullc :不同在于scull使用kmalloc scullc 使用的是高速緩存
Scullc運行速度略有提高,對內存的利用率更佳
?
內存池:是某種形式的后備高速緩存
盡力保證內存的分配不失敗
試圖始終保存空閑的內存,以便緊急狀態下使用
可以用mempool_t *mempool_creat(……);函數創建
?
get_free_page
需要分配大的內存時
Returns a pointer to a new page and fills the page with zeros.
Allocates and returns a pointer to the first byte of a memory area that is poten-
tially several(physically contiguous)pages long but doesn’t zero the area.
?
Scullp也是一個縮減的scull,不同之處在于分配內存是以頁的方式
?
Vmalloc
?
物理空間不連續
虛擬地址連續
不建議使用
Kmalloc和__get_free_pages返回的也是虛擬地址,也經過MMU處理,區別在于如何執行分配的任務上Vmalloc每次需要通過對頁表的適當設置來建立虛擬內存區域
?
Scullv
?
Per-CPU
建立一個per-cpu變量后系統中的每個處理器會擁有一個副本
優點:幾乎不需要鎖定
典型應用:網絡子系統:計算數據包系統
?
獲取大的緩沖區
在引導時分配是獲得大量連續內存頁面的唯一方法
跳過了內核的內存管理
模塊不能在引導時分配內存
只有連接到內核的設備驅動程序才可以在引導時分配內存
內核被引導時可以訪問所有的物理內存
總結
以上是生活随笔為你收集整理的《unix设备驱动》内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL存储日志并使用Loganaly
- 下一篇: APP功能需求第一版