uvm_map.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 518 行 · 第 1/2 页
H
518 行
* Interrupt-safe maps must also be kept on a special list, * to assist uvm_fault() in avoiding locking problems. */struct vm_map_intrsafe { struct vm_map vmi_map; LIST_ENTRY(vm_map_intrsafe) vmi_list;};LIST_HEAD(vmi_list, vm_map_intrsafe);#ifdef _KERNELextern simple_lock_data_t vmi_list_slock;extern struct vmi_list vmi_list;static __inline int vmi_list_lock __P((void));static __inline void vmi_list_unlock __P((int));static __inline intvmi_list_lock(){ int s;#ifndef OSKIT /* XXX */ s = splhigh(); simple_lock(&vmi_list_slock);#else s = 0;#endif return (s);}static __inline voidvmi_list_unlock(s) int s;{#ifndef OSKIT simple_unlock(&vmi_list_slock); splx(s);#endif}#endif /* _KERNEL *//* * handle inline options */#ifdef UVM_MAP_INLINE#define MAP_INLINE static __inline#else #define MAP_INLINE /* nothing */#endif /* UVM_MAP_INLINE *//* * globals: */#ifdef _KERNEL#ifdef PMAP_GROWKERNELextern vaddr_t uvm_maxkaddr;#endif/* * protos: the following prototypes define the interface to vm_map */MAP_INLINEvoid uvm_map_deallocate __P((vm_map_t));int uvm_map_clean __P((vm_map_t, vaddr_t, vaddr_t, int));void uvm_map_clip_start __P((vm_map_t, vm_map_entry_t, vaddr_t));void uvm_map_clip_end __P((vm_map_t, vm_map_entry_t, vaddr_t));MAP_INLINEvm_map_t uvm_map_create __P((pmap_t, vaddr_t, vaddr_t, int));int uvm_map_extract __P((vm_map_t, vaddr_t, vsize_t, vm_map_t, vaddr_t *, int));vm_map_entry_t uvm_map_findspace __P((vm_map_t, vaddr_t, vsize_t, vaddr_t *, struct uvm_object *, voff_t, vsize_t, int));int uvm_map_inherit __P((vm_map_t, vaddr_t, vaddr_t, vm_inherit_t));int uvm_map_advice __P((vm_map_t, vaddr_t, vaddr_t, int));void uvm_map_init __P((void));boolean_t uvm_map_lookup_entry __P((vm_map_t, vaddr_t, vm_map_entry_t *));MAP_INLINEvoid uvm_map_reference __P((vm_map_t));int uvm_map_replace __P((vm_map_t, vaddr_t, vaddr_t, vm_map_entry_t, int));int uvm_map_reserve __P((vm_map_t, vsize_t, vaddr_t, vsize_t, vaddr_t *));void uvm_map_setup __P((vm_map_t, vaddr_t, vaddr_t, int));int uvm_map_submap __P((vm_map_t, vaddr_t, vaddr_t, vm_map_t));MAP_INLINEint uvm_unmap __P((vm_map_t, vaddr_t, vaddr_t));void uvm_unmap_detach __P((vm_map_entry_t,int));int uvm_unmap_remove __P((vm_map_t, vaddr_t, vaddr_t, vm_map_entry_t *));#endif /* _KERNEL *//* * VM map locking operations: * * These operations perform locking on the data portion of the * map. * * vm_map_lock_try: try to lock a map, failing if it is already locked. * * vm_map_lock: acquire an exclusive (write) lock on a map. * * vm_map_lock_read: acquire a shared (read) lock on a map. * * vm_map_unlock: release an exclusive lock on a map. * * vm_map_unlock_read: release a shared lock on a map. * * vm_map_downgrade: downgrade an exclusive lock to a shared lock. * * vm_map_upgrade: upgrade a shared lock to an exclusive lock. * * vm_map_busy: mark a map as busy. * * vm_map_unbusy: clear busy status on a map. * * Note that "intrsafe" maps use only exclusive, spin locks. We simply * use the sleep lock's interlock for this. */#ifdef _KERNEL/* XXX: clean up later */#include <sys/time.h>#include <sys/proc.h> /* for tsleep(), wakeup() */#include <sys/systm.h> /* for panic() */static __inline boolean_t vm_map_lock_try __P((vm_map_t));static __inline void vm_map_lock __P((vm_map_t));static __inline boolean_tvm_map_lock_try(map) vm_map_t map;{ boolean_t rv; if (map->flags & VM_MAP_INTRSAFE) rv = simple_lock_try(&map->lock.lk_interlock); else { simple_lock(&map->flags_lock); if (map->flags & VM_MAP_BUSY) { simple_unlock(&map->flags_lock); return (FALSE); } rv = (lockmgr(&map->lock, LK_EXCLUSIVE|LK_NOWAIT|LK_INTERLOCK, &map->flags_lock) == 0); } if (rv) map->timestamp++; return (rv);}static __inline voidvm_map_lock(map) vm_map_t map;{ int error; if (map->flags & VM_MAP_INTRSAFE) { simple_lock(&map->lock.lk_interlock); return; } try_again: simple_lock(&map->flags_lock); while (map->flags & VM_MAP_BUSY) { map->flags |= VM_MAP_WANTLOCK; ltsleep(&map->flags, PVM, "vmmapbsy", 0, &map->flags_lock); } error = lockmgr(&map->lock, LK_EXCLUSIVE|LK_SLEEPFAIL|LK_INTERLOCK, &map->flags_lock); if (error) {#ifdef DIAGNOSTIC if (error != ENOLCK) panic("vm_map_lock: failed to get lock");#endif goto try_again; } (map)->timestamp++;#ifdef OSKIT /* XXX */ assert(map->lock.lk_lockholder == curproc->p_pid);#endif}#ifdef DIAGNOSTIC#define vm_map_lock_read(map) \do { \ if (map->flags & VM_MAP_INTRSAFE) \ panic("vm_map_lock_read: intrsafe map"); \ (void) lockmgr(&(map)->lock, LK_SHARED, NULL); \} while (0)#else#define vm_map_lock_read(map) \ (void) lockmgr(&(map)->lock, LK_SHARED, NULL)#endif#define vm_map_unlock(map) \do { \ if ((map)->flags & VM_MAP_INTRSAFE) \ simple_unlock(&(map)->lock.lk_interlock); \ else \ (void) lockmgr(&(map)->lock, LK_RELEASE, NULL); \} while (0)#define vm_map_unlock_read(map) \ (void) lockmgr(&(map)->lock, LK_RELEASE, NULL)#define vm_map_downgrade(map) \ (void) lockmgr(&(map)->lock, LK_DOWNGRADE, NULL)#ifdef DIAGNOSTIC#define vm_map_upgrade(map) \do { \ if (lockmgr(&(map)->lock, LK_UPGRADE, NULL) != 0) \ panic("vm_map_upgrade: failed to upgrade lock"); \} while (0)#else#define vm_map_upgrade(map) \ (void) lockmgr(&(map)->lock, LK_UPGRADE, NULL)#endif#define vm_map_busy(map) \do { \ simple_lock(&(map)->flags_lock); \ (map)->flags |= VM_MAP_BUSY; \ simple_unlock(&(map)->flags_lock); \} while (0)#define vm_map_unbusy(map) \do { \ int oflags; \ \ simple_lock(&(map)->flags_lock); \ oflags = (map)->flags; \ (map)->flags &= ~(VM_MAP_BUSY|VM_MAP_WANTLOCK); \ simple_unlock(&(map)->flags_lock); \ if (oflags & VM_MAP_WANTLOCK) \ wakeup(&(map)->flags); \} while (0)#endif /* _KERNEL *//* * Functions implemented as macros */#define vm_map_min(map) ((map)->min_offset)#define vm_map_max(map) ((map)->max_offset)#define vm_map_pmap(map) ((map)->pmap)#endif /* _UVM_UVM_MAP_H_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?