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