欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章帶你使用C語言編寫內(nèi)核

 更新時(shí)間:2021年08月13日 10:50:25   作者:Anita-Sun  
內(nèi)核是操作系統(tǒng)最核心的內(nèi)容,主要提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能,由于其涉及非常廣泛的計(jì)算機(jī)知識(shí),很少被人們所熟悉,因而披上了一層神秘的面紗

gcc 命令

  • 使用 gcc 編譯 c語言

-c 編譯、匯編到目標(biāo)代碼,不進(jìn)行鏈接,也就是直接生成目標(biāo)文件

-o 將輸出的文件以指定文件名來儲(chǔ)存,有同名文件存在時(shí)直接覆蓋

gcc -c -o kernel/main.o kernel/main.c

編譯:編譯號(hào)之后只是個(gè)目標(biāo)文件,也稱為待重定位文件,重定位指的是文件里面所用的符號(hào)還沒有安排地址,這些符號(hào)的地址需要將來與其他目標(biāo)文件“組成”一個(gè)可執(zhí)行文件時(shí)再重新定位(編排地址〉,這里的符號(hào)就是指該目標(biāo)文件中所調(diào)用的函數(shù)或使用的變量,而這里的“組成”就是指鏈接。需要在所有目標(biāo)文件都到齊了,將它們鏈接到 起時(shí)再重新定位(編排地址)

  • 使用 gcc 鏈接

-Ttext指定虛擬地址

-e 用來指定程序的起始地址(默認(rèn)為_start)

gcc kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin

  • 編譯鏈接

生成的test.bin不再是目標(biāo)文件,而是可執(zhí)行文件

gcc -o ./kernel/test.bin ./kernel/main.c

  • main 函數(shù)不是第一個(gè)執(zhí)行的代碼,它一定是被其它代碼調(diào)用的,main函數(shù)在運(yùn)行庫代碼初始化完環(huán)境后才被調(diào)用

文件頭

二進(jìn)制文件的運(yùn)行方法

  • 在文件頭中寫入和程序?qū)傩杂嘘P(guān)的信息
  • 將這種具有程序頭格式的程序文件從外存讀入到內(nèi)存后,從該程序文件的程序頭中讀出入口地址, 要直接跳進(jìn)入口地址執(zhí)行,跨過程序頭才行。

在這里插入圖片描述

  • header.S

編譯后生成的文件是 header.binnams -o header.bin header.S

在這里插入圖片描述

  • 調(diào)用方的執(zhí)行過程

在這里插入圖片描述

在這里插入圖片描述

  • 在實(shí)際中,程序頭和程序體相分離的文件叫 elf 格式

將內(nèi)核載入內(nèi)存

將內(nèi)核寫入磁盤

dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc

可以將編譯、鏈接、寫入硬盤寫成一個(gè)腳本

gcc -c -o test/kernel/main.o test/kernel/main.c && gcc test/kernel/main.o -Ttext 0xc0001500 -e main -o test/kernel/kernel.bin && dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc

修改 loader.S

加載內(nèi)核:需要把內(nèi)核文件加載到內(nèi)存緩沖區(qū)。

初始化內(nèi)核:需要在分頁后,將加載進(jìn)來的 elf 內(nèi)核文件安置到相應(yīng)的虛擬內(nèi)存地址,然后跳過去執(zhí)行,從此 loader 的工作結(jié)束。

把內(nèi)核文件從硬盤上加載到內(nèi)存中

   mov eax, KERNEL_START_SECTOR               ; kernel.bin所在的扇區(qū)號(hào)
   mov ebx, KERNEL_BIN_BASE_ADDR              ; 從磁盤讀出后,寫入到ebx指定的地址。加載到的內(nèi)存地址
   mov ecx, 200			                      ; 讀入的扇區(qū)數(shù)

   call rd_disk_m_32

   ; 創(chuàng)建頁目錄及頁表并初始化頁內(nèi)存位圖
   call setup_page

初始化內(nèi)核:初始化內(nèi)核就是根據(jù) elf 規(guī)范將內(nèi)核文件中的段( segment )展開到(復(fù)制到)內(nèi)存中的相應(yīng)位置

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡單實(shí)例

    C語言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡單實(shí)例

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表)

    C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt音視頻開發(fā)之利用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭

    Qt音視頻開發(fā)之利用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭

    一開始用ffmpeg做的是視頻流的解析,后面增加了本地視頻文件的支持,到后面發(fā)現(xiàn)ffmpeg也是支持本地?cái)z像頭設(shè)備的,所以本文就來用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭功能吧
    2023-03-03
  • c++模板自定義數(shù)組

    c++模板自定義數(shù)組

    這篇文章主要介紹了c++模板自定義數(shù)組,通過制造通用模板,創(chuàng)建自定義的數(shù)組展開文章相關(guān)內(nèi)容,具有一的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • C語言實(shí)現(xiàn)BMP圖像處理(彩色圖轉(zhuǎn)灰度圖)

    C語言實(shí)現(xiàn)BMP圖像處理(彩色圖轉(zhuǎn)灰度圖)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像處理,彩色圖轉(zhuǎn)灰度圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++?shared_ptr智能指針reset()使用示例詳解

    C++?shared_ptr智能指針reset()使用示例詳解

    這篇文章主要為大家介紹了C++?shared_ptr智能指針reset()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • opencv3/C++繪制幾何圖形實(shí)例

    opencv3/C++繪制幾何圖形實(shí)例

    今天小編就為大家分享一篇opencv3/C++繪制幾何圖形實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 淺析C語言中的sizeof

    淺析C語言中的sizeof

    sizeof是C/C++中的一個(gè)操作符(operator),作用就是返回一個(gè)對(duì)象或者類型所占的內(nèi)存字節(jié)數(shù)。返回值類型為size_t,在頭文件stddef.h中定義
    2013-07-07
  • C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱

    C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱

    本文主要介紹了C++獲取當(dāng)前正在運(yùn)行函數(shù)的名稱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 淺談C++中replace()方法

    淺談C++中replace()方法

    C++編程語言中的string應(yīng)用方式多樣化,每一種應(yīng)用方式都能幫助我們提實(shí)現(xiàn)特定的功能需求。在這里我們將會(huì)為大家詳細(xì)介紹一下其中一個(gè)比較重要的用法,有關(guān)C++ replace()函數(shù)的應(yīng)用方式,需要的朋友可以參考下
    2015-11-11

最新評(píng)論