📄 pmap.h~
字号:
/* See COPYRIGHT for copyright information. */#ifndef JOS_KERN_PMAP_H#define JOS_KERN_PMAP_H#ifndef JOS_KERNEL# error "This is a JOS kernel header; user programs should not #include it"#endif#include <inc/memlayout.h>#include <inc/assert.h>struct Env;/* This macro takes a kernel virtual address -- an address that points above * KERNBASE, where the machine's maximum 256MB of physical memory is mapped -- * and returns the corresponding physical address. It panics if you pass it a * non-kernel virtual address. */#define PADDR(kva) \({ \ physaddr_t __m_kva = (physaddr_t) (kva); \ if (__m_kva < KERNBASE) \ panic("PADDR called with invalid kva %08lx", __m_kva);\ __m_kva - KERNBASE; \})/* This macro takes a physical address and returns the corresponding kernel * virtual address. It panics if you pass an invalid physical address. */#define KADDR(pa) \({ \ physaddr_t __m_pa = (pa); \ uint32_t __m_ppn = PPN(__m_pa); \ if (__m_ppn >= npage) \ panic("KADDR called with invalid pa %08lx", __m_pa);\ (void*) (__m_pa + KERNBASE); \})extern char bootstacktop[], bootstack[];extern struct Page *pages;extern size_t npage;extern physaddr_t boot_cr3;extern pde_t *boot_pgdir;extern struct Segdesc gdt[];extern struct Pseudodesc gdt_pd;void i386_vm_init();void i386_detect_memory();void page_init(void);int page_alloc(struct Page **pp_store);void page_free(struct Page *pp);int page_insert(pde_t *pgdir, struct Page *pp, void *va, int perm);void page_remove(pde_t *pgdir, void *va);struct Page *page_lookup(pde_t *pgdir, void *va, pte_t **pte_store);void page_decref(struct Page *pp);void tlb_invalidate(pde_t *pgdir, void *va);int user_mem_check(struct Env *env, const void *va, size_t len, int perm);void user_mem_assert(struct Env *env, const void *va, size_t len, int perm);static inline ppn_tpage2ppn(struct Page *pp){ return pp - pages;}static inline physaddr_tpage2pa(struct Page *pp){ return page2ppn(pp) << PGSHIFT;}static inline struct Page*pa2page(physaddr_t pa){ if (PPN(pa) >= npage) panic("pa2page called with invalid pa"); return &pages[PPN(pa)];}static inline void*page2kva(struct Page *pp){ return KADDR(page2pa(pp));}pte_t *pgdir_walk(pde_t *pgdir, const void *va, int create);#endif /* !JOS_KERN_PMAP_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -