linux 函式學習 kzalloc

2021-08-20 20:34:06 字數 955 閱讀 5516

include .h>

void *kmalloc(size_t size, int flags);

static

inline

void *kzalloc(size_t size, gfp_t flags)

用kzalloc申請記憶體的時候, 效果等同於先是用 kmalloc() 申請空間 , 然後用 memset() 來初始化 ,所有申請的元素都被初始化為 0.

第二個引數說明

給 kmalloc 的第乙個引數是要分配的塊的大小. 第 2 個引數, 分配標誌, 非常有趣, 因為它以幾個方式控制 kmalloc 的行為.

一般使用的標誌:

gfp_kernel,:意思是這個分配((內部最終通過呼叫 _get_free_pages 來進行, 它是 gfp 字首的**) 代表執行在核心空間的程序而進行的. 換句話說, 這意味著呼叫函式是代表乙個程序在執行乙個系統呼叫. 使用 gfp_kenrl 意味著 kmalloc 能夠使當前程序在少記憶體的情況下睡眠來等待一頁. 乙個使用 gfp_kernel 來分配記憶體的函式必須, 因此, 是可重入的並且不能在原子上下文中執行. 當當前程序睡眠, 核心採取正確的動作來定位一些空閒記憶體, 或者通過重新整理快取到磁碟或者交換出去乙個使用者程序的記憶體.

gfp_kernel 不一直是使用的正確分配標誌; 有時 kmalloc 從乙個程序的上下文的外部呼叫. 例如, 這類的呼叫可能發生在中斷處理, tasklet, 和核心定時器中. 在這個情況下, 當前程序不應當被置為睡眠, 並且驅動應當使用乙個 gfp_atomic 標誌來代替. 核心正常地試圖保持一些空閒頁以便來滿足原子的分配. 當使用 gfp_atomic 時, kmalloc 能夠使用甚至最後乙個空閒頁. 如果這最後乙個空閒頁不存在, 但是, 分配失敗.其他用來代替或者增添 gfp_kernel 和 gfp_atomic 的標誌, 儘管它們 2 個涵蓋大部分裝置驅動的需要.

linux 系統函式學習

相關函式 raise,signal 表頭檔案 include include 定義函式 int kill pid t pid,int sig 函式說明 kill 可以用來送引數sig指定的訊號給引數pid指定的程序。引數pid有幾種情況 pid 0 將訊號傳給程序識別碼為pid 的程序。pid 0 ...

Linux庫函式學習

一 檔案io類 1 open close read write基礎開關檔案 讀寫操作。2 lseek函式 在指定的檔案描述符中將檔案指標定位到相應的位置。3 fcntl函式 檔案加鎖 解鎖。4 select poll函式 實現多路io復用。5 fget 從指定的流中讀取資料。二 程序控制類 1 fo...

Linux核心的ioctl函式學習

我這裡說的ioctl函式是在驅動程式裡的,因為我不知道還有沒有別的場合用到了ioctl,所以就規定了我們討論的範圍。為什麼要寫篇文章呢,是因為我前一陣子被ioctl給搞混了,這幾天才弄明白它,於是在這裡清理一下頭腦。一 什麼是ioctl。ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所...