📄 highmem.c.txt
字号:
any problems,send mails to lysindybear@sina.com.cn
相关文件
/include/asm-i386/highmem.h
这是最主要的一个映射结构,如果一个物理页要进行映射,首先要得到一个pkmap_count结构,也就是获得
一个映射许可权,说明当前的这个虚地址没有被映射走。你可以使用。
static int pkmap_count[LAST_PKMAP];
这个函数对高于high_memory的内存页进行映射
void *kmap_high(struct page *page)
vaddr = map_new_virtual(page); //映射一个新的内核地址
pkmap_count[PKMAP_NR(vaddr)]++; //映射计数加一
return (void*) vaddr; //返回映射过后的虚地址
static inline unsigned long map_new_virtual(struct page *page)
for (;;) { //无限循环,直到映射成功
if (!pkmap_count[last_pkmap_nr])
break; //如果找到一个空位的话,循环结束
…… //否则休眠,被调度出去(所以没有办法再中断中使用)
}
vaddr = PKMAP_ADDR(last_pkmap_nr); //找到这个空位的相应的内核虚地址
set_pte(&(pkmap_page_table[last_pkmap_nr]), mk_pte(page, kmap_prot));
pkmap_count[last_pkmap_nr] = 1;
page->virtual = (void *) vaddr; //将内核虚地址赋给这个页
这个函数对高于high_memory的内存页进行解映射
void kunmap_high(struct page *page)
--pkmap_count[nr] //对空位建一
if (need_wakeup)
wake_up(&pkmap_map_wait); //唤醒那写等待的进程,有空位子了!!!
这个函数对高于high_memory的内存页进行映射(用于中断中)
static inline void *kmap_atomic(struct page *page, enum km_type type)
这个函数对高于high_memory的内存页进行解映射(用于中断中)
static inline void kunmap_atomic(void *kvaddr, enum km_type type)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -