天天看點

OSBIOS注意點再談C語言中的連結映像檔案系統調用(API)到底是怎麼一回事Window2000作業系統的界面是如何産生關于C的編譯器GDT與IDT記憶體管理标準庫檔案新的開始

BIOS注意點

1. BIOS是通過彙編或者C語言寫的, 要想調動BIOS程式提供的函數, 需要CPU運作在16位模式下, 而我們的作業系統一般是在32位或者64位運作, 是以在作業系統的啟動盤中, 我們需要在16位模式下調用BIOS程式的函數通過BIOS擷取一些硬體的參數資訊, 接着讓CPU進入到32位或者64位模式

再談C語言中的連結

1. C語言的作者在制作C語言的時候發現, 單單的使用C語言編寫程式還是存在着許多的局限性, 為了解決這個問題, C語言的作者就發明了連結, 一部分的庫使用彙編語言來說, 當時候連結出可執行檔案即可
2. 連結的必要性: 通過源代碼生成的目标檔案并不是一個獨立的二進制檔案, 通過連結成為完整的可執行檔案

映像檔案

1. 通過C語言不能實作的功能, 可以通過彙編語言寫一個函數, 編譯成.o檔案, 讓C語言連結進來, 比如C不能直接寫資料到VRAM(顯示卡記憶體, 可以存儲任何資料, 但是這樣的話就會損失他的功能, 它主要用于在每一個位址上填入像素), 編寫一個彙編函數解決

2. C語言中的char *相當于AL, short *相當于AX, int *相當于EAX, C語言中的指針類型的強制轉換相當于 MOV BYTE [0x123], 0x3132中的BYTE, 用來指定存放資料的大小

系統調用(API)到底是怎麼一回事

  • 由于C語言的局限性, 無法完成一些彙編語言可以完成的功能(主要是C語言中沒有對應的指令), 但是作為一個應用程式的開發者, 使用彙編語言開發必然導緻效率低下, 核心的開發者就是用彙編語言編寫函數庫, 生成.o檔案, 在.s檔案中寫下如_printf函數的彙編實作等等, 通過連結器進行連結
  • 應用程式調用系統API, 需要知道函數的位址

Window2000作業系統的界面是如何産生

  • 首先聲明, 螢幕下端的條形碼不是圖示, 而是通過C語言通過連結到使用彙編實作寫好的系統調用在指定記憶體的位置寫資料生成的, 一般都生成的都比較醜
  • 我們所看到的gtk等架構可以畫圖圖形界面, 實際上就是跟第一點說的一樣, 調用了作業系統相關的.o檔案, 裡面的代碼原始是由彙編語言編寫的, 主要是在記憶體中的指定位置存資料

關于C的編譯器

  • C語言中的sprintf函數并不是作業系統提供的, 而是C的編譯器提供的, 核心的編寫者可以調用該函數實作字元串的列印, 但是在Linux和Unix中其實sprintf還是核心開發者自己寫的, 因為時代在變化嘛

GDT與IDT

  • GDT

為什麼不放在寄存器中, 因為放不下:)

  • IDT

可程式設計中斷控制器(Programmable Interrupt Controller),也簡稱為PIC,是微處器與外設之間的中斷處理的橋梁,由外設發出的中斷請求需要中斷控制器來進行處理

記憶體管理

  • 1個位元組1個位元組的管理記憶體容易導緻出現一小段一小段的記憶體碎片, 不友善管理, 是以一般以4k位機關管理記憶體

标準庫檔案

  • 比如putchar, 每一個平台上都一個該函數的聲明, 但是其内部的實作是不一樣的, 因為内部是一個系統調用, 使用彙編語言完成, 所有不同的平台内容不同; 總之系統庫函數是對系統API的封裝, 友善開發者使用

新的開始

  • 其實我感覺CPU要比核心更進階
在編寫bootloader時, 我們将初始化GDT, 加載GDT到gdtr寄存器中(這樣CPU才能知道GDT的位置, 因為這一部分不是通過核心的代碼可以實作的, 而是CPU的廠商規定的), 開啟A20位址線(讓CPU可以
    尋址4G), 修改cs寄存其中的PE位的值為1(0表示實模式, 1表示保護模式, 在保護模式下CPU才可以
    尋址4G, 并且提供了更好的段的資料結構, 就是基于GDT, 這就是為什麼在進入到保護模式之前需要
    初始化GDT的原因, 因為保護模式需要GDT), 這是系統已經進入到了CPU保護模式, 接着跳轉到一個指定的位置, 執行下一個指令
    
    為什麼我會感覺CPU更進階一點, 因為中斷, 到CPU接受鍵盤的中斷, 就不會管核心, 而是自動地到ldtr寄存器中擷取ldt的位址, 根據信号知道對應的表項, 擷取需要執行的中斷處理函數的位址(這個是核心代碼中寫的), 執行該函數           
  • 保護模式運作在32位上, 實模式運作在16位上, BIOS運作在16位上

繼續閱讀