C標準庫實現分析

2021-04-08 20:32:44 字數 1628 閱讀 3864

一 基本概念

1,核心態和使用者態

不同級別的**擁有不同的許可權,一般cpu把程序分成兩個態:使用者級和核心級。核心級的**是作業系統核心完全信任的**,可以訪問系統的任何的資源。而使用者級的程序對有些系統資源的訪問是有限制的,比如:受系統保護的記憶體,和受限的埠等。使用者只有通過呼叫系統函式(核心態的函式,該函式可以直接訪問核心級的資源),訪問核心資源。就像呼叫系統函式,而該系統函式可以直接控制核心的資源,來完成對核心資源的訪問。所以系統服務程序工作在核心級。

2,支援虛擬記憶體(06.8.9)

32位的位址並不表示每台機器都會有4g的物理記憶體。那麼這是怎麼實現的呢?那就是通過虛擬記憶體。32位位址的前20位是計算頁表的,然後加上後12位的偏移量構成了32位的虛擬位址。這個計算機結果確定了乙個實際的記憶體單元。

這樣每個程序都以為自己在獨享記憶體空間,未得到作業系統的允許任何程序都不可能訪問其他程序的指令和資料。

暫存器cr3用來存放頁目表的起始實體地址。

對於不同的程序,作業系統只需要使用很少一部分記憶體來維護乙份頁表和頁表目錄,在程序切換時程序會自動儲存cr3的值,以便切換回來時仍然能找到屬於改程序的頁表和頁目錄。

*缺頁的處理

頁表和頁目錄都有標誌位來表示結構是否存在的標識位,如果標識位(p-parents)為1表示頁表指向地頁不存在,這時處理器會異常處理過程,根據具體情況決定下一步的動作。例如:如果頁表或頁不再記憶體中,而以前已經儲存到硬碟中了,這時只要從硬碟中調出即可。然後再返回產生中斷的地方執行。

*記憶體區域共享

如果os允許某些程序共享記憶體區,它只需要把頁表和頁目錄的計算的虛擬位址指向相同的實體地址即可。例如:執行同乙個程式的時候雖然啟動了多個程序,但是**段卻是共享的,這樣就達到了節約記憶體的目的。

*os對虛擬位址空間管理

os把虛擬位址空間當著資源來管理,linux把4g 的位址分成兩部分:使用者位址空間和核心位址空間。通常情況下分界線是:0x00000000-oxc0000000(3g)是使用者對映空間。0xc0000000-oxfffffff是核心對映空間。

*虛擬位址空間的使用

注意,即使是使用者對映的空間不允許使用者隨意使用。使用者如果要申請更多的記憶體空間需要向os申請,批准後才能使用。比如:在使用malloc函式分配記憶體時,程序首先向os申請,os為該程序分配乙個虛擬記憶體空間比實際申請的要大一些,主要用來儲存一些標識位。同時os會盡量推遲物理記憶體的分派,所以讓分配的虛擬記憶體,都同指向零頁面(該頁面在系統初始化時就被填充為0,屬性為唯讀不可寫),當進**正要使用該記憶體(向裡面寫資料時),os進入異常處理,這時才真正為該程序分配記憶體,然後重新設定頁表。從異常返回後系統會重新執行剛才那條產生異常的指令,好像什麼都沒發生過。

3,中斷和異常

無論是中斷還是異常它們都會改變處理器當前執行指令的順序,因為中斷和異常本身就意味著發生了某個特殊事件需要處理器立刻跟進。

中斷可分為(1)外部中斷。外部裝置傳送給處理器的處理請求,它是隨機的非同步的。(2)內部中斷。程序直接進入某個向量對應的處理邏輯。

異常:顧名思義,就是處理器察覺到不正常的情況發生了。根據異常產生後續執行指令的不同可以分為:

>故障(fault):如果程序處理完異常後重新返回到原來產生異常的那條指令,這種方式就是故障。

>終止(abort):如果處理器不返回原先的那條指令執行,就是終止。

當然還有很多的基本概念,先到這,以後繼續新增。

C標準庫實現

標頭檔案唯一的目的就是提供assert巨集定義,可以在程式中關鍵的地方使用這個巨集來進行斷言。如果一處斷言被證明非真,希望程式在標準錯誤流輸出一條適當的提示資訊,並使執行異常終止。可以這樣寫 include.assert 0 i i sizeof a sizeof a 0 當然上面的 不是實戰中的最...

C標準庫ctype h實現

ctype.h是c標準函式庫中的標頭檔案,定義了一批c語言字元分類函式 c character classification functions 用於測試字元是否屬於特定的字元類別,如字母字元 控制字元等等。所有的功能都接受int作為引數,其值必須是eof或為unsigned char表示。所有函式...

C 標準庫分析總結 九

當我們在使用hash table以及由它做底層的資料結構時,我們必不可少要討論hash function,所謂的雜湊函式就是產生乙個數,這個數越亂越好,以至於達到避免碰撞或減少碰撞的目的,基本資料型別編譯器已經實現了相關的雜湊函式 比如int,char都是返回各自對應的數值 tuple 模板是 pa...