49eb1f4806
Primary purpose of change: to support the mmap implementation, VM must know both (a) about some block metadata for FS cache blocks, i.e. inode numbers and inode offsets where applicable; and (b) know about *all* cache blocks, i.e. also of the FS primary caches and not just the blocks that spill into the secondary one. This changes the interface and VM data structures. This change is only for the interface (libminixfs) and VM data structures; the filesystem code is unmodified, so although the secondary cache will be used as normal, blocks will not be annotated with inode information until the FS is modified to provide this information. Until it is modified, mmap of files will fail gracefully on such filesystems. This is indicated to VFS/VM by returning ENOSYS for REQ_PEEK. Change-Id: I1d2df6c485e6c5e89eb28d9055076cc02629594e
73 lines
2.2 KiB
C
73 lines
2.2 KiB
C
/* The MINIX model of memory allocation reserves a fixed amount of memory for
|
|
* the combined text, data, and stack segments. The amount used for a child
|
|
* process created by FORK is the same as the parent had. If the child does
|
|
* an EXEC later, the new size is taken from the header of the file EXEC'ed.
|
|
*
|
|
* The layout in memory consists of the text segment, followed by the data
|
|
* segment, followed by a gap (unused memory), followed by the stack segment.
|
|
* The data segment grows upward and the stack grows downward, so each can
|
|
* take memory from the gap. If they meet, the process must be killed. The
|
|
* procedures in this file deal with the growth of the data and stack segments.
|
|
*
|
|
* The entry points into this file are:
|
|
* do_brk: BRK/SBRK system calls to grow or shrink the data segment
|
|
*/
|
|
|
|
#define _SYSTEM 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/bitmap.h>
|
|
|
|
#include <errno.h>
|
|
#include <env.h>
|
|
|
|
#include "glo.h"
|
|
#include "vm.h"
|
|
#include "proto.h"
|
|
#include "util.h"
|
|
|
|
#define DATA_CHANGED 1 /* flag value when data segment size changed */
|
|
#define STACK_CHANGED 2 /* flag value when stack size changed */
|
|
|
|
/*===========================================================================*
|
|
* do_brk *
|
|
*===========================================================================*/
|
|
int do_brk(message *msg)
|
|
{
|
|
/* Perform the brk(addr) system call.
|
|
* The parameter, 'addr' is the new virtual address in D space.
|
|
*/
|
|
int proc;
|
|
|
|
if(vm_isokendpt(msg->VMB_ENDPOINT, &proc) != OK) {
|
|
printf("VM: bogus endpoint VM_BRK %d\n", msg->VMB_ENDPOINT);
|
|
return EINVAL;
|
|
}
|
|
|
|
return real_brk(&vmproc[proc], (vir_bytes) msg->VMB_ADDR);
|
|
}
|
|
|
|
/*===========================================================================*
|
|
* real_brk *
|
|
*===========================================================================*/
|
|
int real_brk(vmp, v)
|
|
struct vmproc *vmp;
|
|
vir_bytes v;
|
|
{
|
|
if(map_region_extend_upto_v(vmp, v) == OK) {
|
|
return OK;
|
|
}
|
|
|
|
return(ENOMEM);
|
|
}
|