Я хочу понять постоянное отображение ядра, особенно этот код "map_new_virtual" внутри kmap_high () kmap () -> - PullRequest
0 голосов
/ 27 февраля 2019
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 вышеупомянутые строки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...