使用者態記憶體分配
c語言中,在使用者態分配記憶體空間可以使用malloc() ,函式原型如下:
void *malloc(size_t size);
1引數:
size – 記憶體塊的大小,以位元組為單位。
返回值函式返回乙個指標 ,指向已分配大小的記憶體。如果請求失敗,則返回 null。
在使用者態分配的空間需要使用free() **。
核心態記憶體分配
在核心態可以使用kmalloc()、vmalloc()、kzalloc()、vzalloc()分配記憶體,區別如下:
void * kmalloc(size_t size, gfp_t flags)
1引數:
size_t size – how many bytes of memory are required.
gfp_t flags – the type of memory to allocate.
flags 型別:
gfp_kernel – allocate normal kernel ram. may sleep.
gfp_nowait-- allocation will not sleep.
gfp_atomic – allocation will not sleep. may use emergency pools.
gfp_highuser – allocate memory from high memory on behalf of user.
kmalloc()申請的記憶體位於物理記憶體對映區域,而且在物理上也是連續的,它們與真實的實體地址只有乙個固定的偏移,因為存在較簡單的轉換關係,所以對申請的記憶體大小有限制,不能超過128kb。
void * vmalloc(unsigned long size)
1引數:
unsigned long size – allocation size
返回值:
pointer to the allocated memory or null on error
vmalloc() 函式則會在虛擬記憶體空間給出一塊連續的記憶體區,但這片連續的虛擬記憶體在物理記憶體中並不一定連續。由於 vmalloc() 沒***申請到的是連續的物理記憶體,因此對申請的記憶體大小沒有限制,如果需要申請較大的記憶體空間就需要用此函式了。
void * kzalloc(size_t size, gfp_t flags)1引數
size_t size – how many bytes of memory are required.
gfp_t flags – the type of memory to allocate (see kmalloc).
kzalloc() 函式與 kmalloc() 非常相似,引數及返回值是一樣的,可以說是前者是後者的乙個變種,因為 kzalloc() 實際上只是額外附加了 __gfp_zero 標誌。所以它除了申請核心記憶體外,還會對申請到的記憶體內容清零。
void * vzalloc(unsigned long size)
1引數:
unsigned long size – allocation size
返回值:
pointer to the allocated memory or null on error
核心態和使用者態
在核心態下,cpu可執行任何指令,在使用者態下cpu只能執行非特權指令。當cpu處於核心態,可以隨意進入使用者態 而當cpu處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。當乙個任務 程序 執行系統呼叫而陷入核心...
核心態和使用者態
複習的時候發現 作業系統 書上竟然沒有找到使用者態和核心態的概念,還納悶了半天以為是自己上課的時候沒有認真聽講.核心態 cpu可以訪問記憶體所有資料,包括外圍裝置,例如硬碟,網絡卡.cpu也可以將自己從乙個程式切換到另乙個程式 使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置.占用cpu的能力被...
使用者態和核心態
從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態。核心從本質上看是一種軟體 控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資源 儲存資源 i o資源等。為了使上層應用能夠訪問到這些資源,核心必須...