unsigned long map_new_virtual(struct page * page )
{
for (;;)
{
int count;
DECLARE_WAITQUEUE(wait, current);
for (count = LAST_PKMAP; count > 0; --count)
{
last_pkmap_nr = (last_pkmap_nr + 1) & (LAST_PKMAP - 1);
// 1> где инициализируется last_pkmap_nr?// 2> что это "и" делает?
if (!last_pkmap_nr)
{
flush_all_zero_pkmaps( );
count = LAST_PKMAP;
}
// 3> что делают вышеуказанные 3 строки?
if (!pkmap_count[last_pkmap_nr])
{
unsigned long vaddr = PKMAP_BASE +
(last_pkmap_nr << PAGE_SHIFT);
set_pte(&(pkmap_page_table[last_pkmap_nr]),
mk_pte(page, _ _pgprot(0x63)));
// 4> что делает set_pte иmk_pte делать ??Я предполагаю, что mk_pte создает запись, а set_pte связывает эту запись с pkmap_page_table [last_pkmap_nr];но мне нужно более подробное объяснение.Каково значение параметра page и что такое __pgprot ();и как выглядит таблица pkmap_page_table [last_pkmap_nr]?
pkmap_count[last_pkmap_nr] = 1;
set_page_address(page, (void *) vaddr);
return vaddr;
}
}
current->state = TASK_UNINTERRUPTIBLE;
add_wait_queue(&pkmap_map_wait, &wait);
spin_unlock(&kmap_lock);
schedule( );
remove_wait_queue(&pkmap_map_wait, &wait);
spin_lock(&kmap_lock);
if (page_address(page))
{
return (unsigned long) page_address(page);
}
}
}
У меня есть 3 сомнения, как упомянуто выше в комментариях ->
last_pkmap_nr = (last_pkmap_nr + 1) & (LAST_PKMAP - 1);
// 1> где инициализируется last_pkmap_nr?// 2> что это и делает?
if (!last_pkmap_nr)
{
flush_all_zero_pkmaps( );
count = LAST_PKMAP;
}
// 3> что делают 3 вышеупомянутые строки?