使用者態和核心態的記憶體分配

2021-10-20 19:31:02 字數 1604 閱讀 9209

使用者態記憶體分配

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資源等。為了使上層應用能夠訪問到這些資源,核心必須...