下圖為示意圖,讀者可以參考該圖來閱讀**。
個人認為對linux下i/o資源的管理如掌握__request_region函式就能掌握其精髓。
linux下對i/o資源主要用結構體resource來管理,管理的方法就是用resource來描述使用的i/o資源的狀態,並將這些resource用如下兩個resource作為表頭按位址大小的順序鏈結起來。
struct resource ioport_resource = ;
export_symbol(ioport_resource);
struct resource iomem_resource = ;
__request_region函式的主要功能為:查詢resource鍊錶中是否有與申請的i/o資源有衝突,如衝突則返回null,如不衝突則將新申請resource按resource位址從小到大的順放插入至以ioport_resource或iomem_resource為表頭(root)的單向指標鍊錶中 /*
* this is compatibility stuff for io resources.
** note how this, unlike the above, knows about
* the io flag meanings (busy etc).
** request_region creates a new busy region.
** check_region returns non-zero if the area is already busy.
** release_region releases a matching busy region.
*//**
* __request_region - create a new busy resource region
* @parent: parent resource descriptor
* @start: resource start address
* @n: resource region size
* @name: reserving caller's id string
* @flags: io resource flags
*/struct resource * __request_region(struct resource *parent,
resource_size_t start, resource_size_t n,
const char *name, int flags)
/* uhhuh, that didn't work out.. */
//申請資源與parent資源衝突退出。
kfree(res);
res = null;
break;
}write_unlock(&resource_lock);
return res;
}export_symbol(__request_region);
下面我們再看__request_resource函式
該函式先確保新申請資源在root的範圍之內,接著從第
static struct resource * __request_resource(struct resource *root, struct resource *new)
p = &tmp->sibling;//從如上if 條件
tmp->start > end不成立得出對比資源有可能與申請資源衝突或其位址範圍在當前對比資源的後
面,將兄弟指標儲存以便後續用兄弟資源與新申請資源進行比較。
if (tmp->end < start)//如成立說明新申請資源在當前所對比資源的後面,則繼續用兄弟資源與新資源進行對比。不成立說明新申請資源與當前資源有衝突
continue;
return tmp;
//,tmp->end < start不成立,則說明有衝突,}}
解疑:在__request_region函式中為什麼衝突資源不是parenet就將conflict作為 parent呢?
對此處的回答我也只是通過**推理,並無找**中的例項
假設您申請如上130~180的i/o空間,後來又將135~175的i/o resource 釋放掉
您再申請135~145的i/o空間不就會遇到衝突資源,並將conflict資源作為parent再申請的情況了嗎!
分析kernel的initcall函式
先來看看這些initcall函式的宣告 include linux init.h initcalls are now grouped by functionality into separate subsections.ordering inside the subsections is deter...
對Kernel函式的理解
問題 在低維空間線性不可分,需要對映到高維空間使其線性可分。方法 找到這個對映p x,y a,b,c eg p a x2 2 xyc y2 然而在分類器尋找的過程中我們通常需要計算內積 p1,p2 如果遇到上面的問題,樸素的想法是首先找到對映p,然後將p1,p2計算出來,然後計算 p1,p2 但這樣...
分析kernel的initcall函式
分析kernel的initcall函式 先來看看這些initcall函式的宣告 include linux init.h initcalls are now grouped by functionality into separate subsections.ordering inside the ...