00001
00011 #ifndef __KERN_FRAME_H__
00012 #define __KERN_FRAME_H__
00013
00014 #include <page.h>
00015 #include <list.h>
00016
00017
00018 #define FRAME_SIZE PAGE_SIZE
00019
00020 #define FRAME_ADDRESS_BITS (32 - PAGE_SHIFT)
00021
00022 #define FRAME_ALIGNMENT_BITS (PAGE_SHIFT - 1)
00023
00024 #define FRAME_ALIGNMENT_MAXIMUM (FRAME_ADDRESS_BITS - 1)
00025
00026 typedef unsigned int FrameAddress;
00027 typedef unsigned int FrameAlignment;
00028
00029
00030 typedef struct
00031 {
00032
00033 ListNode frameList;
00034
00035 unsigned int address : FRAME_ADDRESS_BITS;
00036
00037 unsigned int alignment : FRAME_ALIGNMENT_BITS;
00038
00039 unsigned int allocated : 1;
00040 } Frame;
00041
00042
00043 #define FRAME_ADDRESS(frame) ((frame) -> address * FRAME_SIZE)
00044
00045
00046 typedef struct
00047 {
00048
00049 unsigned int framesAvailable;
00050
00051 FrameAddress frameStart;
00052
00053 FrameAddress frameEnd;
00054
00055 Frame * frames;
00056
00057 List freeLists [FRAME_ALIGNMENT_MAXIMUM + 1];
00058 } FrameAllocator;
00059
00070 extern int frame_allocator_initialize (FrameAddress start, FrameAddress end);
00080 extern void frame_allocator_reserve (FrameAddress start, FrameAddress end);
00081
00092 extern Frame * frame_allocate_within (FrameAlignment alignment, FrameAddress start, FrameAddress end);
00101 extern Frame * frame_allocate (FrameAlignment alignment);
00110 extern void frame_free (Frame * frame);
00111
00118 extern unsigned int frame_availability (void);
00119
00120 #endif
00121
00122