Первый шаг в понимании выгружаемой виртуальной памяти: создание записи в таблице страниц при начальной ошибке страницы - PullRequest
3 голосов
/ 13 апреля 2011

Я пытаюсь понять, подкачка виртуальной памяти. У меня есть следующий фрагмент кода, который представляет собой первый шаг в процессе. Здесь 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;
}

1 Ответ

2 голосов
/ 13 апреля 2011

Единственная реальная проблема, которую я вижу, это то, что тип возвращаемого значения 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)
...