LINUX核心程式設計 學習筆記(一)

2021-06-22 05:29:17 字數 1692 閱讀 4056

linux核心使用bitmap相關

1,宣告乙個bitmap陣列,可以表示100個bit,陣列名字是bitmap

declare_bitmap(bitmap,100)

#define declare_bitmap(name,bits) unsigned long name[bits_to_longs(bits)]

#define bits_to_longs(nr) div_round_up(nr,bits_per_byte*sizeof(long))

#define div_round_up(n,d) (((n)+(d)-1)/(d))

#define bits_per_byte 8

2,使用以上定義的bitmap陣列

檢測bitmap某一位是否為1,用test_bit()函式,如檢測第乙個bit,則呼叫test_bit(0,bitmap)

static int test_bit(unsigned int nr,const unsigned long *addr)

#define bits_per_long 32

使用例項:bootmem分配器~~

核心使用雙向鍊錶相關

struct list_head;

list_entry()函式可以返回包含雙向鍊錶的結構, 指標ptr指向結構體type中的member成員,通過ptr返回結構體type的起始位址

#define list_entry(ptr,type,member) container_of(ptr,type,member)
list_add(struct list_head *new ,struct list_head *head)
該函式向指定鍊錶的head節點後插入new節點,

list_for_each_entry(pos,head,member)
pos是乙個指向包含list_head節點物件的指標,可以看成是list_entry()返回的值,head是遍歷開始的位置,

#define container_of(ptr, type, member) ()

#define offsetof(type, member) ((size_t) &((type *)0)->member)

第一步,首先定義乙個臨時的資料型別(通過typeof( ((type *)0)->member )獲得)與ptr相同的指標變數__mptr,然後用它來儲存ptr的值。第二步,用(char *)__mptr減去member在結構體中的偏移量,得到的值就是整個結構體變數的首位址(整個巨集的返回值就是這個首位址)。

typeof的解釋如下:

const typeof( ((type *)0)->member ) *__mptr = (ptr);
是定義乙個叫做__mptr的指標。這個指標指向的內容是不可變的,指向的型別是乙個type型別結構體中member的型別。

兩個取反 !!的作用,

答:確保所得的結果為0或者1

Linux核心 驅動學習筆記 一

今天討論到核心啟動階段對外部裝置初始化的過程,於是粗略的看了一下相關 得到以下一些印象 未必正確,希望大家指正 1.對外部裝置初始化 出現的地方應該是 init 程序 bootloader start 彙編 decompress start kernel rest init kernel threa...

Linux核心學習筆記一

核心與作業系統 核心是作業系統的核心部分,包含了系統執行的核心過程,決定系統的效能,作業系統啟動核心被裝入到ram中 作業系統與底層硬體裝置互動和為執行應用程式提供執行環境。linux核心與微核心比較 微核心 核心只需要乙個很小的函式集,通常包括幾個同步原語,乙個簡單的排程程式和程序間通訊機制。執行...

linux核心筆記(一)

需要了解知識 linux c語言makefile linux是單核心 或單核心 的操作體系統。windows微核心 單核心是所有的核心功能被整體編譯在一起,形成乙個單獨的核心映象,核心中各模組的互動是通過直接的函式呼叫,效率非常高。微核心是實現核心中相當關鍵和核心的一部分,其他功能模組被單獨編譯,功...