[OS64位][020]源碼閱讀:程序4-7 計算可用的物理內(nèi)存頁數(shù)

學(xué)習(xí)筆記

使用教材(配書源碼以及使用方法)
《一個64位操作系統(tǒng)的設(shè)計與實現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.itdecent.cn/p/28f9713a9171

源碼結(jié)構(gòu)

  • 配書代碼包 :第4章 \ 程序 \ 程序4-6
  • 配書代碼包 :第4章 \ 程序 \ 程序4-7

運行調(diào)試

[anno@localhost bootloader]$ make
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin

[anno@localhost kernel]$ make
gcc -E  head.S > head.s
as --64 -o head.o head.s
gcc -E  entry.S > entry.s
as --64 -o entry.o entry.s
gcc  -mcmodel=large -fno-builtin -m64 -c main.c
gcc  -mcmodel=large -fno-builtin -m64 -c printk.c
gcc  -mcmodel=large -fno-builtin -m64 -c trap.c
gcc  -mcmodel=large -fno-builtin -m64 -c memory.c
ld -b elf64-x86-64 -z muldefs -o system head.o entry.o main.o printk.o trap.o memory.o -T Kernel.lds 
objcopy -I elf64-x86-64 -S -R ".eh_frame" -R ".comment" -O binary system kernel.bin

[anno@localhost 4-7]$ ls
bochsrc  boot.img  bootloader  kernel  media

[anno@localhost 4-7]$ sudo mount boot.img media -t vfat -o loop
[anno@localhost 4-7]$ sudo cp bootloader/loader.bin media
[anno@localhost 4-7]$ sync
[anno@localhost 4-7]$ sudo cp bootloader/boot.bin media
[anno@localhost 4-7]$ sync
[anno@localhost 4-7]$ sudo cp kernel/kernel.bin media
[anno@localhost 4-7]$ sync

[anno@localhost 4-7]$ bochs -f ./bochsrc

程序4-6 獲得物理內(nèi)存的信息

  • 每條物理地址空間信息占用 20B

    物理地址空間結(jié)構(gòu)體

  • 可用內(nèi)存Type=0x0000 00019f000h + 7fef0000hB = 7ff8f000h B2047.55 MB2 GB

程序4-6 獲得物理內(nèi)存信息 可用內(nèi)存(9f000h + 7fef0000h)B = 7ff8f000h B ≈ 2047.55 MB約2 GB

bochsrc 配置文件設(shè)置的虛擬機內(nèi)存為 2GB

程序4-7 計算可用的物理內(nèi)存頁數(shù)

  • 物理頁大小為2MB,可用的物理頁個數(shù)為1022(十進制)
程序4-7 計算可用的物理內(nèi)存頁數(shù)

程序4-7 結(jié)構(gòu)體 extern struct Global_Memory_Descriptor memory_management_struct.png
  • 程序4-7 對e820結(jié)構(gòu)體數(shù)組中的可用物理內(nèi)存段進行2MB物理頁邊界對齊
程序4-7 對e820結(jié)構(gòu)體數(shù)組中的可用物理內(nèi)存段進行2MB物理頁邊界對齊.png
  • 對齊的效果
#include <stdio.h>

#define PAGE_2M_SHIFT   21
#define PAGE_4K_SHIFT   12

#define PAGE_2M_SIZE    (1UL << PAGE_2M_SHIFT)
#define PAGE_4K_SIZE    (1UL << PAGE_4K_SHIFT)

#define PAGE_2M_MASK    (~ (PAGE_2M_SIZE - 1))
#define PAGE_4K_MASK    (~ (PAGE_4K_SIZE - 1))

#define PAGE_2M_ALIGN(addr) (((unsigned long)(addr) + PAGE_2M_SIZE - 1) & PAGE_2M_MASK)
#define PAGE_4K_ALIGN(addr) (((unsigned long)(addr) + PAGE_4K_SIZE - 1) & PAGE_4K_MASK)

int main()
{
    printf("unsigned long : %d byte\n", sizeof(unsigned long));
    unsigned long add___ = 0x10AB;
    
    unsigned long add_4K = PAGE_4K_ALIGN(add___);
    printf("add___:%lx\n", add___); 
    printf("add_4K:%lx\n", add_4K); 
    
    
    unsigned long add_2M = PAGE_2M_ALIGN(add___);
    printf("add___:%lx\n", add___); 
    printf("add_2M:%lx\n", add_2M); 
    
    return 0;
}

C語言在線編譯器 compile_c_online

對齊的效果.PNG

參考資料

  • INT 15h AX=e820h 保存物理地址空間信息到內(nèi)存物理地址0x7E00h

[OS64位][014]源碼閱讀:代碼清單3-18 ~ 3-22 將內(nèi)核kernel.bin讀至內(nèi)存0x100000
http://www.itdecent.cn/p/e9ed9f10bad6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)結(jié)構(gòu)與算法 1.算法的有窮性是指( )。答案:A A)算法程序的運行時間是有限的 B)算法程序所處理的數(shù)據(jù)量是...
    織夢學(xué)生閱讀 3,695評論 1 15
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 8,125評論 0 27
  • 概述 我們都知道一個進程是與其他進程共享CPU和內(nèi)存資源的。正因如此,操作系統(tǒng)需要有一套完善的內(nèi)存管理機制才能防止...
    SylvanasSun閱讀 3,979評論 0 25
  • 專業(yè)考題類型管理運行工作負責(zé)人一般作業(yè)考題內(nèi)容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,550評論 0 13
  • 我隨手一揮,他應(yīng)聲倒地。和美麗的蟬翼一樣的翅膀順著身子,身子躺在地上。他還沒有斷氣,我十厘米的距離盯著他,暗紅的頭...
    崗背圍閱讀 418評論 0 1

友情鏈接更多精彩內(nèi)容