#include
void *kmalloc(size_t size, int flags);
引數size:要分配的記憶體大小
flags:分配標誌,它控制kmalloc的行為
gfp_atomic 用來從中斷處理和程序上下文之外的其他**中分配記憶體. 從不睡眠.
gfp_kernel 程序上下文中的分配,可能睡眠
gfp_user 用來為使用者空間頁來分配記憶體; 它可能睡眠.
__gfp_dma 要求分配在能夠 dma 的記憶體區
__gfp_highmem 指示分配的記憶體可以位於高階記憶體(896m以上)
按頁分配
get_zeroed_page(unsigned
int flags)
_get_free_page(unsigned
int flag)
_get_free_pages(unsigned
int flag,unsigned
int order)
釋放void free_page(unsigned
long addr)
void free_page(unsigned
long addr,unsigned
long order)
如果釋放的和先前分配數目不等的頁面,會導致系統錯誤
三.linux核心位址空間
1.核心空間是由核心負責對映,它並不會跟隨程序進行改變,是固定的
2.高階記憶體:物理記憶體896mb以上的部分
1)使用alloc_page(_gfp_highmem)分配高階記憶體頁
2)使用kmap函式將分配到的高階記憶體對映到該區域
3.直接對映區:從3g開始,最大896m的線性位址區間(線性位址=3g+實體地址)
實體地址區間是0x100000-0x200000對映到線性空間是3g+0x100000-3g+0x200000
4.動態對映區:120m—該區域的位址由核心函式vmalloc來進行分配,特點是線性空間連續,但對應的物理空間不一定連續
5.永久對映區:4m
6.固定對映區:pkmap區上,有4m的線性空間,它和4g頂端只有4k的隔離帶
四.linux核心鍊錶
1.鍊錶:是一種常用資料結構,它通過指標將一系列資料節點連線成一條資料鏈,相對於陣列,鍊錶具有更好的動態性,建立
鍊錶的時候預先無需知道資料的總量,可以隨機分配空間,可以高效的在鍊錶中的任意位置實時的插入或者刪除資料
2.鍊錶的資料結構至少包括兩個域,資料域(用於儲存資料)和指標域(用於建立和下乙個節點的聯絡)
3.在linux核心中使用了大量的鍊錶結構來組織資料,大多採用[include/linux/list.h]鍊錶結構的定義
struct list_head;
list_head結構包括2個指向list_head結構的指標prev和next,所以核心的鍊錶具有雙鏈表功能,實際雙向迴圈鍊錶
4.鍊錶的操作
1)初始化煉表頭
init_list_head(list_head *head)
2)插入節點
list_add(struct list_head *new, struct list_head *head)
list_add_tail(struct list_head *new, struct list_head *head)
3)刪除節點
list_del(struct list_head *entry)
4)提取資料
list_entry(ptr, type, member)
一直資料結構的節點指標ptr,找出資料結構
5)遍歷
list_for_each(struct list_head *pos,struct list_head *head)
例項:student.c
#include
#include
#include
#include
#include //kmalloc和kfree的標頭檔案
module_license("gpl");
struct student;
struct student *pstudent;//結構陣列
struct student *tmp_student;//節點指標
struct list_head student_list;//結構,
struct list_head *pos;
int mylist_init(void)
list_for_each(pos,&student_list)
}void mylist_exit(void)
kfree(pstudent);
}module_init(mylist_init);
module_exit(mylist_exit);
Linux核心記憶體
核心空間占用4g虛擬記憶體的後1g 明確 不論在核心空間還是使用者空間,看到的位址都是虛擬位址,只是虛擬位址空間不一樣 但是cpu最終訪問的位址是虛擬位址對應的實體地址 虛擬位址轉換成對應的實體地址需要mmu 將來mmu利用頁表進行位址轉換 引申 uclinux支援不帶mmu的處理器 問 使用者空間...
linux核心記憶體分配
核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...
linux核心記憶體管理
整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...