Linux內核架構學習筆記 三

1,內核通過緩存來改進系統性能,由於內核是基於頁的內存映射來實現訪問塊設備的,因此也按頁組織,故稱頁緩存。

2,塊緩存用於緩存沒有組成成頁的數據,重要性差很多,傳統UNIX上,塊緩存用作系統主緩存,Linux已經由頁緩存取代了。

3,內核提供的標準鏈表可以用於任何數據結構彼此鏈接起來,它不是類型安全的,加入鏈表的數據結構必須包含一個類型爲list_head的成員,其中包含了正向和反向指針。

4,鏈表七點同樣是list_head實例,使用LIST_HEAD宏聲明和初始化

5,循環鏈表的時間複雜的爲O(1)

6,作爲數據結構的成員struct_list_head被稱作鏈表元素,鏈表起點元素被稱作表頭。

7,一般性內核對象機制可用於執行的對象操作:

     引用計數

     管理對象鏈表

     集合加鎖

     將對象屬性導出到用戶空間(通過sysfs文件系統)

8,kobject不是通過指針與其他數據結構連接起來,而是必須直接嵌入。通過管理kobject即可達到對包含kobject對象的管理。

9,kobject結構成員語義:

k_name——對象的文本名稱,可以利用sysfs導出到用戶空間。

kref——類型爲struct kref,用於簡化引用計數的管理。

entry——標準的鏈表元素,用於將若干kobject放置到一個鏈表中。

kset——將對象與其他對象放置到一個集合時使用

parent——是以一個指向父對象的指針,用於在kobject之間建立層次結構

ktype——提供包含kobject的數據結構詳細信息,最重要的事用於釋放該數據結構資源的析構器函數

10,kobject與面向對象編程語言的對象概念相似,提供了在內核使用面向對象技術的可能性,無需C++的額外機制。

11,kref中只有refcount,refcount是一個院子數據類型,給出內核中當前使用某個對象的計數,計數器爲0時,就可以從內存中刪除。

12,處理kobject的標準方法:

    kobject_get(),kobject_put()——對kobject的引用計數器加1或減1

    kobject_(un)register()——從層次結構中註冊或刪除對象,對象被添加到父對象中顯存的集合kset中,同時在sysfs文件系統中創建一個對應項。

    kobject_init()——初始化一個kobject,將引用計數器設置爲初始值,初始化對象的鏈表元素

    kobject_add()——初始化一個內核對象,並使之顯示在sysfs中

    kobject_cleanup()——,在不需要kobject時,釋放分配的資源

13,如果某個變量的類型時typedef而來,則不能直接訪問,而需要通過輔助函數。

14,內核定義了若干整數數據類型,不僅明確是有符號還是無符號,而且還指定了相關類型的精確位數。

15,字節序——現代計算機採用大端序或者小端序格式。在大端序中,最高有效字節存儲在最低地址,隨着地址升高,字節的權重降地;小端序中,最低有效字節存儲在最低地址,而隨着地址升高,誒姐的權重也升高。

16,基本數據類型的結構取決於底層體系結構的字節序。

17,內核提供各種函數和宏,可以在CPU使用的格式和特定的表示法之間轉換。

18,內核的嚴肅問題:

    調 試 內 核 通 常 要 比 調 試 用 戶 層 程 序 困 難。

    內核提供許多輔助函數,類似於C語言庫,但是內核中的東西總是樸素的多

    用戶層程序錯誤可能會導致段錯誤,或者內存轉儲,但是內核錯誤會導致整個系統故障。

    需要考慮到內核運行在許多體系結構上根本不支持非對齊內存訪問。

    所有的內核代碼必須併發安全。

    內核代碼必須在大端序和小端序計算機上都可以運行。

    大多數體系結構不允許在內核中執行浮點運算,因此需要想辦法用整型替代。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章