簡體   English   中英

理解分頁虛擬內存的第一步:在初始頁面錯誤時創建頁表條目

[英]First Step in Understanding Paged Virtual Memory: Creating Page Table Entry upon Initial Page Fault

我試圖了解虛擬內存分頁。 我有以下代碼片段,代表了該過程的第一步。 這里,從主程序為每個邏輯地址調用search_tbl ,以檢查頁表是否已經具有將提供的邏輯地址映射到物理存儲器中的位置的條目。 vfn是虛擬幀號。

編輯:這個實現是否有意義? 還是我走錯了路?

任何幫助/建議將不勝感激。 謝謝。

uint vfn_bits;//virtual frame number
static tbl_entry **tbl;
uint page_bits = log_2(pagesize);
vfn_bits = addr_space_bits - page_bits;
tbl = calloc(pow_2(vfn_bits), sizeof (tbl_entry*));

tbl_entry *search_tbl(uint vfn) {

    uint index = vfn;
    if (tbl[index] == NULL) {
        /* Initial miss */
        tbl[index] = create_tbl_entry(vfn);
    }
    return tbl[index];
}

tbl_entry *create_tbl_entry(uint vfn) {
    tbl_entry *te;
    te = (tbl_entry*) (malloc(sizeof (tbl_entry)));

    te->vfn = vfn;
    te->pfn = -1;
    te->valid = FALSE;
    te->modified = FALSE;
    te->reference = 0;

    return te;
}

我能看到的唯一真正的問題是search_tbl()的返回類型是tbl_entry*但它實際上返回了一個tbl_entry 這可能是一個主要問題,考慮一下,如果頁表實際上是一個指向頁表項的指針數組。 此外,如果sizeof(tbl_entry) > sizeof(tbl_entry*)您沒有為表分配足夠的空間。

另一個問題可能是getbits() 通常的做法是對n位整數類型的位進行編號,其中0表示最低有效位,n - 1表示最高有效位。 如果是getbits() API的情況,則根據地址的錯誤部分計算索引。

編輯

對於已經刪除的問題中的代碼的原始版本,上述情況屬實。

至於評論中的getbits問題,如果使用以下內容(假設32位地址)

uint32_t getbits(uint32_t x, unsigned int p, unsigned int n)
{
    return (x >> (p + 1-n)) & ~(~0 << n);
}

這假設最高有效位是具有最高位的位,即位31是最高位。 因此,如果您假設頁面大小為4096字節,則可以像下面這樣獲取地址的幀編號:

vfn = getbits(x, 31, 20); // 31 is the top bit, number of bits is 32 - log2(4096)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM