.block塊層入口函式為 genhd_device_init(),先對該函式開始分析:
函式實現原始碼:
static int __init genhd_device_init(void)
.kobj_map_init
struct kobj_map *probes[255];
struct mutex *lock; };
作用: 申請乙個struct kobj_map結構物件並完成初始化,這裡的成員probes為乙個雜湊表,而表的索引0~254對應主裝置號的索引,每個雜湊表元素又對應乙個已註冊的主裝置號和此裝置號(即對應的裝置);
初始化過程:申請struct probe結構物件base並將get成員賦值為引數base_probe,然後依次賦值給kobj_map物件成員的probes陣列賦值為base(255個相同值);
static struct kobject *base_probe(dev_t dev, int *part, void *data)
base_probe函式說明:獲取擁有該裝置號的範圍,檢視源**該方法的其實什麼也沒做只返回了乙個null,當該方法的真正意義在意定義一種格式以過載的方式來實現;
.blk_dev_init
函式實現原始碼:
int __init blk_dev_init(void)
create_workqueue:分配工作佇列,每個cpu對應乙個工作佇列;
kmem_cache_create:建立高快取區;
open_softirq:註冊block_softirq型別的軟中斷,而啟用中斷的是raise_softirq或raise_softirq_irqoff;
處理中斷的函式就為blk_done_softirq:
函式實現原始碼:
static void blk_done_softirq(struct softirq_action *h) }
過程為:先獲取請求終端鍊錶,然後獲取獲取請求request結構物件,再呼叫終端處理函式softirq_done_fn,即:request *rq ->request_queue *q ->softirq_done_fn;
register_hotcpu_notifier:這個函式比較高階與cpu的熱插拔有關,編譯核心時需開啟編譯開關config_hotplug_cpu才有效;
blk_max_low_pfn:最大的物理幀號
blk_max_pfn:物理記憶體內最後乙個可用的也用的頁幀號;
.subsystem_register
函式實現原始碼:
int subsystem_register(struct subsystem * s)
return error; }
這裡主要**就是kset_add,而kset_add在其它篇已經有說了這裡不再解釋;
android 核心系列
編譯 1,需要jre1.6,64bit的機器。2,錯誤 this attribute must be localized 提示了錯誤 this attribute must be localized 這種問題一般情況是因為在res xml資料夾下的中 或者在res layout下的檔案中出現了沒有多...
linux核心系列(2) linux核心鍊錶
因為高超的設計理念,linux核心中的鍊錶被很多人津津樂道。實際上,鍊錶本身只是核心提供的一組結構體 巨集定義和函式的集合,與linux核心本身沒有直接關係。核心鍊錶的設計思路已經在另一篇部落格中寫了,有興趣的同學可以去看一下,這裡是鏈結。今天,我們來看一下真實核心鍊錶的基本操作過程。我們的目標是做...
linux核心系列 二 核心資料結構之鍊錶
傳統鍊錶與linu核心鍊錶的區別圖 圖一 圖二從上圖中看出在傳統鍊錶中各種不同鍊錶間沒有通用性,因為各個資料域不同,而在linux核心中巧妙將鍊錶結構內嵌到資料域結構中使得不同結構之間能連線起來 核心中煉表實現檔案路徑 include linux list.h 鍊錶結構定義 struct list ...