Main changes: - COW optimization for safecopy. - safemap, a grant-based interface for sharing memory regions between processes. - Integration with safemap and complete rework of DS, supporting new data types natively (labels, memory ranges, memory mapped ranges). - For further information: http://wiki.minix3.org/en/SummerOfCode2009/MemoryGrants Additional changes not included in the original Wu's branch: - Fixed unhandled case in VM when using COW optimization for safecopy in case of a block that has already been shared as SMAP. - Better interface and naming scheme for sys_saferevmap and ds_retrieve_map calls. - Better input checking in syslib: check for page alignment when creating memory mapping grants. - DS notifies subscribers when an entry is deleted. - Documented the behavior of indirect grants in case of memory mapping. - Test suite in /usr/src/test/safeperf|safecopy|safemap|ds/* reworked and extended. - Minor fixes and general cleanup. - TO-DO: Grant ids should be generated and managed the way endpoints are to make sure grant slots are never misreused.
84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
|
|
#ifndef _REGION_H
|
|
#define _REGION_H 1
|
|
|
|
#include <minix/callnr.h>
|
|
#include <minix/com.h>
|
|
#include <minix/config.h>
|
|
#include <minix/const.h>
|
|
#include <minix/ds.h>
|
|
#include <minix/endpoint.h>
|
|
#include <minix/keymap.h>
|
|
#include <minix/minlib.h>
|
|
#include <minix/type.h>
|
|
#include <minix/ipc.h>
|
|
#include <minix/sysutil.h>
|
|
#include <minix/syslib.h>
|
|
#include <minix/const.h>
|
|
|
|
struct phys_block {
|
|
#if SANITYCHECKS
|
|
u32_t seencount;
|
|
#endif
|
|
vir_bytes length; /* no. of contiguous bytes */
|
|
phys_bytes phys; /* physical memory */
|
|
u8_t refcount; /* Refcount of these pages */
|
|
#define PBSH_COW 1
|
|
#define PBSH_SMAP 2
|
|
u8_t share_flag; /* PBSH_COW or PBSH_SMAP */
|
|
|
|
/* first in list of phys_regions that reference this block */
|
|
struct phys_region *firstregion;
|
|
};
|
|
|
|
typedef struct phys_region {
|
|
struct phys_block *ph;
|
|
struct vir_region *parent; /* parent vir_region. */
|
|
vir_bytes offset; /* offset from start of vir region */
|
|
#if SANITYCHECKS
|
|
int written; /* written to pagetable */
|
|
#endif
|
|
|
|
/* list of phys_regions that reference the same phys_block */
|
|
struct phys_region *next_ph_list;
|
|
|
|
/* AVL fields */
|
|
struct phys_region *less, *greater;
|
|
int factor;
|
|
} phys_region_t;
|
|
|
|
#include "physravl.h"
|
|
|
|
struct vir_region {
|
|
struct vir_region *next; /* next virtual region in this process */
|
|
vir_bytes vaddr; /* virtual address, offset from pagetable */
|
|
vir_bytes length; /* length in bytes */
|
|
physr_avl *phys; /* avl tree of physical memory blocks */
|
|
u16_t flags;
|
|
u32_t tag; /* Opaque to mapping code. */
|
|
struct vmproc *parent; /* Process that owns this vir_region. */
|
|
};
|
|
|
|
/* Mapping flags: */
|
|
#define VR_WRITABLE 0x001 /* Process may write here. */
|
|
#define VR_NOPF 0x002 /* May not generate page faults. */
|
|
#define VR_PHYS64K 0x004 /* Physical memory must be 64k aligned. */
|
|
#define VR_LOWER16MB 0x008
|
|
#define VR_LOWER1MB 0x010
|
|
|
|
/* Mapping type: */
|
|
#define VR_ANON 0x100 /* Memory to be cleared and allocated */
|
|
#define VR_DIRECT 0x200 /* Mapped, but not managed by VM */
|
|
#define VR_SHARED 0x40
|
|
|
|
/* Tag values: */
|
|
#define VRT_NONE 0xBEEF0000
|
|
#define VRT_HEAP 0xBEEF0001
|
|
#define VRT_CODE 0xBEEF0002
|
|
|
|
/* map_page_region flags */
|
|
#define MF_PREALLOC 0x01
|
|
#define MF_CONTIG 0x02
|
|
|
|
#endif
|
|
|