Commit 5c141032 authored by Léo Grange's avatar Léo Grange
Browse files

add definition of mem_areas interface

parent 84461507
Loading
Loading
Loading
Loading

sys/mem_area.h

0 → 100644
+92 −0
Original line number Diff line number Diff line
#ifndef _SYS_MEM_AREA_H
#define _SYS_MEM_AREA_H

#include <utils/types.h>
#include <utils/list.h>

/**
 * Generic memory-mapping interface, using segmentation-based mapping.
 */


// generic flags :
// type of area
#define MEM_AREA_TYPE_FILE		(1<<0)
#define MEM_AREA_TYPE_ANON		(1<<1)

// some kind of area are allowed to grow
#define MEM_AREA_MAYGROW		(1<<2)
// flag used if area grows bottom-up instead of top-down (which is the default)
#define MEM_AREA_GROW_UP		(1<<3)


struct mem_area {
	int flags;

	// begin address of this area in process address space, and maximum size
	void *address;
	size_t max_size;

	// type-specific data (determined by flags)
	union {
		struct {
			// file structure of the file mapped to this area
			struct file *f;

			// origin's position in the file
			size_t origin;
		} file;

		struct {
			// current size (useful in case of growing areas)
			size_t size;
		} anon;

		// device type?
	};

	struct list_head list;
};


struct process;

/**
 * Initialize memory area subsystem.
 */
void mem_area_init();


/**
 * Return a newly allocated memory area, not initialized.
 */
struct mem_area *mem_area_alloc();


/**
 * Look for the given address in given process address space, and return the
 * corresponding memory area.
 * NULL is returned if address don't belong to its address space.
 */
struct mem_area *mem_area_find(struct process *proc, void *address);


/**
 * Insert a memory area inside the given process' address space.
 * Return 0 if inserted successfully, negative value else (e.g. overlay on other
 * areas).
 */
int mem_area_insert(struct process *proc, struct mem_area *area);


/**
 * Copy a part of this area content to the given *physical* address.
 * This function *DO NOT* deal with virtual addresses, and don't check for page
 * boundaries. The caller should check if given address range still belong
 * to the appropriate process, and is already "allocated" and usable!
 * Offset is relative to the beginning of this area.
 * Return non-zero in error case.
 */
int mem_area_copy_raw(struct mem_area *area, size_t offset, void *dest, size_t size);

#endif //_SYS_MEM_AREA_H
+3 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <utils/bitfield.h>
#include <interface/fixos/fcntl.h>
#include <interface/fixos/errno.h>
#include <sys/mem_areas.h>

#include <loader/elfloader/loader.h>
#include <fs/vfs_file.h>
@@ -110,6 +111,8 @@ struct process *process_alloc() {

			arch_adrsp_init(& proc->addr_space);
			proc->dir_list = NULL;
			INIT_LIST_HEAD(proc->mem_areas);


			sigemptyset(& proc->sig_blocked);
			sigemptyset(& proc->sig_pending);
+2 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ struct process {
	// virtual memory managing data :
	struct addr_space addr_space;
	struct page_dir *dir_list;
	// address space areas (see sys/mem_area.h)
	struct list_head mem_areas;

	// files opened by process, index is file descriptor
	struct file *files[PROCESS_MAX_FILE];