《unix设备驱动》内存分配
這里只簡單介紹一下內(nèi)核中提供的一些內(nèi)存管理接口,方便內(nèi)核開發(fā)入門人員對內(nèi)存管理有一個大致的了解,也方便自己以后復(fù)習(xí)
?
Kmalloc
?
分配的區(qū)域在物理內(nèi)存中式連續(xù)的
函數(shù)原型:void * kmalloc(size_t size ,int flags)不同的標志可以以不同的方式控制kmalloc的行為
比如是內(nèi)核內(nèi)存的分配還是用戶空間內(nèi)存分配,分配過程中是否可以休眠等等
?
內(nèi)核把內(nèi)存分為三個區(qū)段:
可用于DMA的內(nèi)存
常規(guī)內(nèi)存
高端內(nèi)存
?
物理內(nèi)存只能按照頁面進行分配
只能分配一些預(yù)定義的,固定大小的字節(jié)數(shù)組
后備高速緩存
為某些反復(fù)使用的塊增加某些特俗的內(nèi)存池
設(shè)備程序一般不會涉及使用后備高速緩存,除了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));
分配,創(chuàng)建一個高速緩存對象,其中可以容納任意數(shù)目的內(nèi)存區(qū)域
?
Scull 與scullc :不同在于scull使用kmalloc scullc 使用的是高速緩存
Scullc運行速度略有提高,對內(nèi)存的利用率更佳
?
內(nèi)存池:是某種形式的后備高速緩存
盡力保證內(nèi)存的分配不失敗
試圖始終保存空閑的內(nèi)存,以便緊急狀態(tài)下使用
可以用mempool_t *mempool_creat(……);函數(shù)創(chuàng)建
?
get_free_page
需要分配大的內(nèi)存時
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,不同之處在于分配內(nèi)存是以頁的方式
?
Vmalloc
?
物理空間不連續(xù)
虛擬地址連續(xù)
不建議使用
Kmalloc和__get_free_pages返回的也是虛擬地址,也經(jīng)過MMU處理,區(qū)別在于如何執(zhí)行分配的任務(wù)上Vmalloc每次需要通過對頁表的適當設(shè)置來建立虛擬內(nèi)存區(qū)域
?
Scullv
?
Per-CPU
建立一個per-cpu變量后系統(tǒng)中的每個處理器會擁有一個副本
優(yōu)點:幾乎不需要鎖定
典型應(yīng)用:網(wǎng)絡(luò)子系統(tǒng):計算數(shù)據(jù)包系統(tǒng)
?
獲取大的緩沖區(qū)
在引導(dǎo)時分配是獲得大量連續(xù)內(nèi)存頁面的唯一方法
跳過了內(nèi)核的內(nèi)存管理
模塊不能在引導(dǎo)時分配內(nèi)存
只有連接到內(nèi)核的設(shè)備驅(qū)動程序才可以在引導(dǎo)時分配內(nèi)存
內(nèi)核被引導(dǎo)時可以訪問所有的物理內(nèi)存
總結(jié)
以上是生活随笔為你收集整理的《unix设备驱动》内存分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL存储日志并使用Loganaly
- 下一篇: 在Linux(Ubuntu)下搭建ASP