Changeset 0ee077ee in mainline for generic/include/mm/as.h


Ignore:
Timestamp:
2006-05-27T17:50:30Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
127c957b
Parents:
fb84455
Message:

Move the sharing functionality to address space area backends.
Add backend for continuous regions of physical memory.
Sharing for these areas works automagically now.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • generic/include/mm/as.h

    rfb84455 r0ee077ee  
    3131
    3232/** Address space area flags. */
    33 #define AS_AREA_READ    1
    34 #define AS_AREA_WRITE   2
    35 #define AS_AREA_EXEC    4
    36 #define AS_AREA_DEVICE  8
    37 #define AS_AREA_ANON    16
     33#define AS_AREA_READ            1
     34#define AS_AREA_WRITE           2
     35#define AS_AREA_EXEC            4
     36#define AS_AREA_CACHEABLE       8
    3837
    3938#ifdef KERNEL
     
    105104                                             or memcpy_to_uspace(). */
    106105
    107 typedef struct share_info share_info_t;
    108 typedef struct mem_backend mem_backend_t;
     106/** This structure contains information associated with the shared address space area. */
     107typedef struct {
     108        mutex_t lock;           /**< This lock must be acquired only when the as_area lock is held. */
     109        count_t refcount;       /**< This structure can be deallocated if refcount drops to 0. */
     110        btree_t pagemap;        /**< B+tree containing complete map of anonymous pages of the shared area. */
     111} share_info_t;
     112
     113/** Address space area backend structure. */
     114typedef struct {
     115        int (* page_fault)(as_area_t *area, __address addr, pf_access_t access);
     116        void (* frame_free)(as_area_t *area, __address page, __address frame);
     117        void (* share)(as_area_t *area);
     118} mem_backend_t;
     119
     120/** Backend data stored in address space area. */
     121typedef struct backend_data {
     122        __native d1;
     123        __native d2;
     124} mem_backend_data_t;
    109125
    110126/** Address space area structure.
     
    115131struct as_area {
    116132        mutex_t lock;
     133        as_t *as;               /**< Containing address space. */
    117134        int flags;              /**< Flags related to the memory represented by the address space area. */
    118135        int attributes;         /**< Attributes related to the address space area itself. */
     
    121138        btree_t used_space;     /**< Map of used space. */
    122139        share_info_t *sh_info;  /**< If the address space area has been shared, this pointer will
    123                                      reference the share info structure. */
     140                                     reference the share info structure. */
    124141        mem_backend_t *backend; /**< Memory backend backing this address space area. */
    125         void *backend_data[2];  /**< Data to be used by the backend. */
    126 };
    127142
    128 /** Address space area backend structure. */
    129 struct mem_backend {
    130         int (* backend_page_fault)(as_area_t *area, __address addr, pf_access_t access);
    131         void (* backend_frame_free)(as_area_t *area, __address page, __address frame);
     143        /** Data to be used by the backend. */
     144        mem_backend_data_t backend_data;
    132145};
    133146
     
    141154extern as_t *as_create(int flags);
    142155extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base, int attrs,
    143         mem_backend_t *backend, void **backend_data);
     156        mem_backend_t *backend, mem_backend_data_t *backend_data);
    144157extern int as_area_resize(as_t *as, __address address, size_t size, int flags);
    145158extern int as_area_destroy(as_t *as, __address address);
    146159extern int as_area_get_flags(as_area_t *area);
    147 extern void as_set_mapping(as_t *as, __address page, __address frame);
    148160extern bool as_area_check_access(as_area_t *area, pf_access_t access);
    149161extern int as_page_fault(__address page, pf_access_t access, istate_t *istate);
     
    164176extern mem_backend_t anon_backend;
    165177extern mem_backend_t elf_backend;
     178extern mem_backend_t phys_backend;
    166179
    167180/* Address space area related syscalls. */
Note: See TracChangeset for help on using the changeset viewer.