linux 核心 記憶體知識儲備 鍊錶操作

2021-08-09 17:48:33 字數 2456 閱讀 3474

#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,隨機...