跳到主要內容

發表文章

目前顯示的是有「operating system」標籤的文章

6.828 Lab2 part 1

Ex1:physical page management in JOS. Ans: 這題要求完成在 JOS 中對 physical pages 的管理,第一個要完成的是 bootstrap 時一開始所需要的 boot_alloc()。首先,從 Lab1 我們可以知道進入 kernel 後,physical memory 的使用狀況如下(但在entry.S中只先將[0, 4MB)對映到[KERNBASE, KERBASE+4MB),所以boot_alloc()能直接以指標存取的記憶體會受限在這個範圍): boot_alloc()的記憶體會在後續持續被使用,但此時尚未完成 virtual memory 的設定,所以我們在 boot_alloc()必須以 page 的大小作為單位來使用,這樣才能在後續管理 page frame 時將 boot_alloc()過的記憶體正確標注狀態。實作如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 static void * boot_alloc ( uint32_t n ) { static char * nextfree = 0 ; // virtual address of next byte of free memory static size_t used_npages = 0 ; static size_t want_npages = 0 ; char * result = NULL ; // this is defined by linker script, kern.ld, // the very beginning virtual address of kernel image extern char btext []; ex...

6.828 homework 2

Q:在開機後,在0x10000c設breakpoint,以"x/24x %esp"觀察附近的記憶體,確認何處是stack,以及每一個非零值的意義。 Ans: 觀察到此時的暫存器與記憶體為 (gdb) info reg eax            0x0 0 ecx            0x0 0 edx            0x1f0 496 ebx            0x10074 65652 esp            0x7bbc 0x7bbc ebp            0x7bf8 0x7bf8 esi            0x0 0 edi            0x1126fc 1124092 eip            0x10000c 0x10000c eflags         0x46 [ PF ZF ] cs             0x8 8 ss             0x10 16 ds             0x10 16 es             0x10 16 fs             0x0 0 gs           ...

6.828 Lab1 part 2

Ex4:複習C語言中的pointer,並確認了解pointer.c的每一個位址與現象。 Ans: Too easy to describe... :P Ex5:如果bootloader的link address設定錯誤(不是0x7c00),第1行會出錯的指令為何? Ans: boot/boot.S的"ljmp    $PROT_MODE_CSEG, $protcseg",因為ljmp會將絕對位址載入。(先出現的jnz不會出錯是因為jnz是相對跳轉,透過gdb與boot.asm便可發現jnz後的相對位址都是一致的)。 Ex6:分別在BIOS進入到bootloader時與bootloader進入到kernel時觀察0x100000的前8個word,說明為何在這兩個時間點,同樣的記憶體位置的值會不同? Ans: 因為bootloader會根據kernel image所指定的位置(ELF program header中的LMA)將kernel的每個segment載入記憶體,所以新的值是kernel image的text segment。 Ex7:追蹤JOS kernel,觀察0x100000與0xf0100000兩處的記憶體。如果mapping沒有建立正確,哪條指令會出錯? Ans: kernel/entry.S中:         mov $relocated, %eax         jmp *%eax relocated: "jmp *%eax"會錯。因為link address定為0xf0100000,所以relocated的值為0xf01xxxxx,當mapping沒有正確設置,就會無法讓EIP正確地從0x1xxxxx跳轉到0xf01xxxxx。 Ex8:將八進制的顯示加進cprintf()中。 Ans: //in lib/printfmt.c void vprintfmt ( void   ( * putch ) ( int ,  void * ) ,  void   * putdat,  const   char   * fmt, va_...

6.828 Lab1 part 1

MIT的6.828課程 是關於作業系統實作的有趣課程,我報名參加了相關的 讀書會 ,並開始研讀課程內容,這篇文章主要紀錄 Lab1 的部份練習(以下描述問題時,我會用比較精簡的方式敘述,想知道完整說明的朋友請直接參考課程嘍~): Ex1:練習x86 assembly。 Ans: 由於該課程使用gas與gcc,所以我簡單練習一下AT&T的語法。 .global mmax mmax:         pushl   % ebp         movl    % esp , % ebp         movl     8 ( % ebp ) , % eax         cmpl     12 ( % ebp ) , % eax          jle      .L2         movl     8 ( % ebp ) , % eax          jmp      .L3 .L2:         movl     12 ( % ebp ) , % eax .L3:         popl    % ebp          ret inline assembly的版本(由於在C function中嵌入asm,所以省卻prologue & epilogue): #include <stdio.h> static   int  mmax ( int  a,...