OSDN Git Service

Step 10 added.
[kozos-expbrd/kozos_expbrd.git] / firm / 07 / os / memory.c
1 #include "defines.h"
2 #include "kozos.h"
3 #include "lib.h"
4 #include "memory.h"
5
6 /*
7  * ¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂÎ
8  * (³ÍÆÀ¤µ¤ì¤¿³ÆÎΰè¤Ï¡¤ÀèƬ¤Ë°Ê²¼¤Î¹½Â¤ÂΤò»ý¤Ã¤Æ¤¤¤ë)
9  */
10 typedef struct _kzmem_block {
11   struct _kzmem_block *next;
12   int size;
13 } kzmem_block;
14
15 /* ¥á¥â¥ê¡¦¥×¡¼¥ë */
16 typedef struct _kzmem_pool {
17   int size;
18   int num;
19   kzmem_block *free;
20 } kzmem_pool;
21
22 /* ¥á¥â¥ê¡¦¥×¡¼¥ë¤ÎÄêµÁ(¸Ä¡¹¤Î¥µ¥¤¥º¤È¸Ä¿ô) */
23 static kzmem_pool pool[] = {
24   { 16, 8, NULL }, { 32, 8, NULL }, { 64, 4, NULL },
25 };
26
27 #define MEMORY_AREA_NUM (sizeof(pool) / sizeof(*pool))
28
29 /* ¥á¥â¥ê¡¦¥×¡¼¥ë¤Î½é´ü²½ */
30 static int kzmem_init_pool(kzmem_pool *p)
31 {
32   int i;
33   kzmem_block *mp;
34   kzmem_block **mpp;
35   extern char freearea; /* ¥ê¥ó¥«¡¦¥¹¥¯¥ê¥×¥È¤ÇÄêµÁ¤µ¤ì¤ë¶õ¤­Îΰè */
36   static char *area = &freearea;
37
38   mp = (kzmem_block *)area;
39
40   /* ¸Ä¡¹¤ÎÎΰè¤ò¤¹¤Ù¤Æ²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤Ë·Ò¤° */
41   mpp = &p->free;
42   for (i = 0; i < p->num; i++) {
43     *mpp = mp;
44     memset(mp, 0, sizeof(*mp));
45     mp->size = p->size;
46     mpp = &(mp->next);
47     mp = (kzmem_block *)((char *)mp + p->size);
48     area += p->size;
49   }
50
51   return 0;
52 }
53
54 /* Æ°Åª¥á¥â¥ê¤Î½é´ü²½ */
55 int kzmem_init(void)
56 {
57   int i;
58   for (i = 0; i < MEMORY_AREA_NUM; i++) {
59     kzmem_init_pool(&pool[i]); /* ³Æ¥á¥â¥ê¡¦¥×¡¼¥ë¤ò½é´ü²½¤¹¤ë */
60   }
61   return 0;
62 }
63
64 /* Æ°Åª¥á¥â¥ê¤Î³ÍÆÀ */
65 void *kzmem_alloc(int size)
66 {
67   int i;
68   kzmem_block *mp;
69   kzmem_pool *p;
70
71   for (i = 0; i < MEMORY_AREA_NUM; i++) {
72     p = &pool[i];
73     if (size <= p->size - sizeof(kzmem_block)) {
74       if (p->free == NULL) { /* ²òÊüºÑ¤ßÎΰ褬̵¤¤(¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯ÉÔ­) */
75         kz_sysdown();
76         return NULL;
77       }
78       /* ²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤«¤éÎΰè¤ò¼èÆÀ¤¹¤ë */
79       mp = p->free;
80       p->free = p->free->next;
81       mp->next = NULL;
82
83       /*
84        * ¼ÂºÝ¤ËÍøÍѲÄǽ¤ÊÎΰè¤Ï¡¤¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂΤÎľ¸å¤ÎÎΰè¤Ë
85        * ¤Ê¤ë¤Î¤Ç¡¤Ä¾¸å¤Î¥¢¥É¥ì¥¹¤òÊÖ¤¹¡¥
86        */
87       return mp + 1;
88     }
89   }
90
91   /* »ØÄꤵ¤ì¤¿¥µ¥¤¥º¤ÎÎΰè¤ò³ÊǼ¤Ç¤­¤ë¥á¥â¥ê¡¦¥×¡¼¥ë¤¬Ìµ¤¤ */
92   kz_sysdown();
93   return NULL;
94 }
95
96 /* ¥á¥â¥ê¤Î²òÊü */
97 void kzmem_free(void *mem)
98 {
99   int i;
100   kzmem_block *mp;
101   kzmem_pool *p;
102
103   /* Îΰè¤ÎľÁ°¤Ë¤¢¤ë(¤Ï¤º¤Î)¥á¥â¥ê¡¦¥Ö¥í¥Ã¥¯¹½Â¤ÂΤò¼èÆÀ */
104   mp = ((kzmem_block *)mem - 1);
105
106   for (i = 0; i < MEMORY_AREA_NUM; i++) {
107     p = &pool[i];
108     if (mp->size == p->size) {
109       /* Îΰè¤ò²òÊüºÑ¤ß¥ê¥ó¥¯¥ê¥¹¥È¤ËÌ᤹ */
110       mp->next = p->free;
111       p->free = mp;
112       return;
113     }
114   }
115
116   kz_sysdown();
117 }