From 700953b6f7e241fa3953ac845e27fac74981f00b Mon Sep 17 00:00:00 2001 From: sat0ken <15720506+sat0ken@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:39:50 +0900 Subject: [PATCH] finish step10 : add memory management --- src/os/Makefile | 2 +- src/os/kozos | Bin 4700 -> 4432 bytes src/os/kozos.c | 22 +++++++++++ src/os/kozos.h | 9 +++-- src/os/ld.scr | 4 ++ src/os/main.c | 16 ++++---- src/os/memory.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++ src/os/memory.h | 8 ++++ src/os/syscall.c | 16 ++++++++ src/os/syscall.h | 10 +++++ src/os/test10_1.c | 35 +++++++++++++++++ 11 files changed, 208 insertions(+), 11 deletions(-) create mode 100644 src/os/memory.c create mode 100644 src/os/memory.h create mode 100644 src/os/test10_1.c diff --git a/src/os/Makefile b/src/os/Makefile index b2c2638..4ad60cc 100644 --- a/src/os/Makefile +++ b/src/os/Makefile @@ -21,7 +21,7 @@ H8WRITE_SERDEV = /dev/ttyUSB0 OBJS = startup.o main.o interrupt.o OBJS += lib.o serial.o -OBJS += kozos.o syscall.o test09_1.o test09_2.o test09_3.o +OBJS += kozos.o syscall.o memory.o test10_1.o TARGET = kozos diff --git a/src/os/kozos b/src/os/kozos index a01491a24c022687f59c8c556c29c42aca5a23b2..9e4084084bc99cc16c5eb4de1195a1f29aa0a4ba 100755 GIT binary patch delta 2129 zcmZWqeQZ-z6u^=e|zoc+Kg( z_k7-S&hOrPBcum2LEhPQG8F7o1_(hS79h?fSQ`bxh>$Gskc9u_&T^1t84*%X2rq-o zit?0=7zT+Nxf3VPY)<>ma^$UhNJ*Xp=Qx562bQ4}`2W!!HD(r*uz{#CTV;Jd?&x_o4Do$e~u@si<)|_P8%^ka=oBo!lPqRBqaPG15Ex-sb2h+|zt+o?hqn)L*$F zUxh$i)VOj3#EFs$3j^~9%F)>FHhX^rLT&qEFWSSY6;k%5Wf^nXn zur}i=Z{3KiMXSf7N3=Rp>AvsWia(AFUFbUtm7JvkTP+u%s%<^jO}lNI?RtNTCx+fm zPuZT6#+1v7E@h&|RFM8`+ZirQK&oRL=?jAGgg6B=^fJK_ZJv0Pb7=Z~H{1J*RFjJFf{Le z;B0a>!R~YDZZ1pZHNIViE;Lh@AS^%xdk6Hlxk*SnMCxIC8^{)jeLNW=_RavwJ6hZW z&ag8Kt^zC>+P9`5eX4{vqUoekO+}3#7Ssf8*&B?{t8a27zOR(PN0@*L7-Q)`HS`Eb z=hfEuD=Pw5I<~$jXy-^J>S+svS2vm-9BS0KwimXg6G5#2OF+f7ulJjwpp*h+a2RM6 zD$SCtD42$sgVk}|D(EA~S5yHrgF1JJmF;ucHvaX1cPAu%4-;RJdcM^z2~Zg2rQ7iD zY!#wLKC(&=dQr$jW*;(#7sLi=)$FHu1Q7swcH}@)Wph23 zWg2kg^RJrcFE8VCITdGGSXQci7j85-J0USh`4fXP7T-D3f z^mEBdQ*ya=M%TKGKj{{^&SrrNK<5Y(FUS?9=q`vnKJAuqNBK47G7RGm?7?PgmMlFb zXOdz^K5`i>Ja~%J-k^5dSkiioB@>Izrc@==<}=vv1{kN6oRsly)qXRIS_|Q8>e_cg zcaK5(cCSm(G4*&0HdxW)JKXohufPtPRG1bonx!mEYu!ds;vow2pdB=d>LuVUFv*?sgioP_%%ezpL7(4<3D{Ggr1h{HdjzQJU*-@_xllQZN)U0o>b~xRO z%1`2vM+ah)$`$d*C>NWQI4qiai^=B25zjZV^U9Ps5<8#dh#kv5^(BioiqTjbVyQHN z!oWF%@Tinqr3CBJt;BTDXm$v-W`|fe#&N^YjONZoBf^}Ip~d5k0ib^Xv;g!A&`qG< zfgUyh=Iub6fVL-k2NR83-e@F!T1p!XbZc57FnIXj!QS4U^&*M)^!L)K@@HyLB`}yc zFp%i&X%I<(EZYTohvKx+wbt(>c6c%gh|E!C&orbuH$iu~UZ$sAPjKb*ysI`0@45NT w<6FM`;hT=17YN_}GN=*A;eCg9ofci|#6ljH+dz7YhAM(pI3*#V literal 4700 zcmb7IeQaA-6+iFU$s&K`*;Ay%cC_k7)RKk{DLwKpos5?Mc)I?$KMm{;-aBJz*YtD>ipgLY6o)d@Ko zGA^DHM2%?@WXYfqJYxwM5Xm2yM9$J!$o)@{kzWu*ENC2by&6>YUC{P zu2xEcEC#xRuX{Dv2)muRc9MH<2@Ge;(&Cky*L`7M7<$x^?X0Iqeo3_>Sd-_}tSjpJ zw->QUF=OHLo)61CNGtR)S~;HB)6+1z8g629#Z1VLaWnD`~Fnx>twTG7{!+NQftOt<*%VPLJnmrTJQBoWw#WZ_MBW(Ce%ZZ zp^lzUT!8GTKWzRfXT1I%IV365(T{*$RnEDwel9Hr$gCrKT<8}|bNT+Px5w!@rO9_) zo<*KJ&th{Q4C!HAiw{ZbM65AZeo$tqhK{GK;oRsLuRCY6m%U2WSe~t*QyVg*UFF+upj=-wmUp zrrUXxw+~g@;-#KDsY8a5xM}K%dyy|Z`7mZ}6}!CyG!w0tNS`4m zTA5nca0=*0sg?K5oYP~86e_AVTW9NU(J`2KI6|F=&besb(sWIcXm+gqq zTbq>&+$UJ&r}gW`Mj*mF|H{OqjCMeI7ky<+Ri15YMC3 z88d$KH=Mim11i0T9Wre{XP4;fTpKTNzQ@+_^pu{i(z5~5=eg#SeaJ z_?PnOq#w758|?K}_{n|=4_fScgRh%0GNRgASpyI<>wtzEwHi#%Y*@#Gux1pt5twzM z{pSCmz0Qi}p1yF7Y})Hf+Sj(wj*3`%mFrrp^3&V{+I-_WFnhn|909@n*`z;7GjKhWgnI;-Opl3i|0Cj^7fYRA`CfoV+w;rcbCtU7CXhfgXGwP78XVuL3!GrPm@Mm0< z9FC7t=i}i>*Aq`Zwe#u0p@YNmZ8|=r<2*7n$^|F{p3}{Umi?mtIP;i6)c+` ztoBB*s$lVnq|Lc-ZD3&41Xku%=nAX%53E*RHM}OUuv!~fSgrIpQtNR9!$#uc9KE`u zJY%2T%&;Y|uy1i~qrz3AsuIsbz^YQi{#DFRM7Ugn;ih>GGzXd|qe#?|No2C=?BEb} zWaATA>PYLugV{mqFx#O_26wst=jR3(-$?L1#QY9(n#lXHO##j?@$;i)oQ!=85B?6r z-&(96e{bPm0K_;4R`-JV_9DKyut@yMxNUfA05NVAxLp`_(}YyuOkI|Manx?Tnzrb_ DJ(D5@ diff --git a/src/os/kozos.c b/src/os/kozos.c index 963b9cd..d3524cf 100644 --- a/src/os/kozos.c +++ b/src/os/kozos.c @@ -4,6 +4,7 @@ #include "interrupt.h" #include "syscall.h" #include "lib.h" +#include "memory.h" #define THREAD_NUM 6 #define THREAD_NAME_SIZE 15 @@ -223,6 +224,19 @@ static int thread_chpri(int priority) return old; } +static void *thread_kmalloc(int size) +{ + putcurrent(); + return kzmem_alloc(size); +} + +static int thread_kmfree(char *p) +{ + kzmem_free(p); + putcurrent(); + return 0; +} + // 割り込みハンドラの登録 static int setintr(softvec_type_t type, kz_handler_t handler) { @@ -262,6 +276,12 @@ static void call_functions(kz_syscall_type_t type, kz_syscall_param_t *param) case KZ_SYSCALL_TYPE_CHPRI: param->un.chpri.ret = thread_chpri(param->un.chpri.priority); break; + case KZ_SYSCALL_TYPE_KMALLOC: + param->un.kmalloc.ret = thread_kmalloc(param->un.kmalloc.size); + break; + case KZ_SYSCALL_TYPE_KMFREE: + param->un.kmfree.ret = thread_kmfree(param->un.kmfree.p); + break; default: break; } @@ -329,6 +349,8 @@ static void thread_intr(softvec_type_t type, unsigned long sp) // 初期スレッドを起動しOSの動作を開始 void kz_start(kz_func_t func, char *name, int priority, int stacksize, int argc, char *argv[]) { + kzmem_init(); + current = NULL; // 各種データの初期化 memset(readyque, 0, sizeof(readyque)); diff --git a/src/os/kozos.h b/src/os/kozos.h index 91e87b4..9a1f8e5 100644 --- a/src/os/kozos.h +++ b/src/os/kozos.h @@ -27,12 +27,15 @@ int kz_sleep(void); int kz_wakeup(kz_thread_id_t id); kz_thread_id_t kz_getid(void); int kz_chpri(int priority); +void *kz_kmalloc(int size); +int kz_kmfree(void *p); // ユーザスレッド //int test08_1_main(int argc, char *argv[]); -int test09_1_main(int argc, char *argv[]); -int test09_2_main(int argc, char *argv[]); -int test09_3_main(int argc, char *argv[]); +//int test09_1_main(int argc, char *argv[]); +//int test09_2_main(int argc, char *argv[]); +//int test09_3_main(int argc, char *argv[]); +int test10_1_main(int argc, char *argv[]); extern kz_thread_id_t test09_1_id; extern kz_thread_id_t test09_2_id; extern kz_thread_id_t test09_3_id; diff --git a/src/os/ld.scr b/src/os/ld.scr index ed54cd5..f84a8a0 100644 --- a/src/os/ld.scr +++ b/src/os/ld.scr @@ -48,6 +48,10 @@ SECTIONS . = ALIGN(4); _end = . ; + .freearea : { + _freearea = . ; + } > ram + .userstack : { _userstack = .; } > userstack diff --git a/src/os/main.c b/src/os/main.c index 064ee06..ff3160e 100644 --- a/src/os/main.c +++ b/src/os/main.c @@ -3,15 +3,17 @@ #include "interrupt.h" #include "lib.h" -kz_thread_id_t test09_1_id; -kz_thread_id_t test09_2_id; -kz_thread_id_t test09_3_id; +//kz_thread_id_t test09_1_id; +//kz_thread_id_t test09_2_id; +//kz_thread_id_t test09_3_id; static int start_threads(int argc, char *argv[]) { - test09_1_id = kz_run(test09_1_main, "test09_1", 1, 0x100, 0, NULL); - test09_2_id = kz_run(test09_2_main, "test09_2", 2, 0x100, 0, NULL); - test09_3_id = kz_run(test09_3_main, "test09_3", 3, 0x100, 0, NULL); +// test09_1_id = kz_run(test09_1_main, "test09_1", 1, 0x100, 0, NULL); +// test09_2_id = kz_run(test09_2_main, "test09_2", 2, 0x100, 0, NULL); +// test09_3_id = kz_run(test09_3_main, "test09_3", 3, 0x100, 0, NULL); + + kz_run(test10_1_main, "test10_1", 1, 0x100, 0,NULL); kz_chpri(15); INTR_ENABLE; @@ -29,7 +31,7 @@ int main(void) // OSの動作開始 // 初期スレッドを優先度0で起動する - kz_start(start_threads, "idel", 0,0x100, 0, NULL); + kz_start(start_threads, "idle", 0,0x100, 0, NULL); return 0; } diff --git a/src/os/memory.c b/src/os/memory.c new file mode 100644 index 0000000..d187358 --- /dev/null +++ b/src/os/memory.c @@ -0,0 +1,97 @@ +#include "defines.h" +#include "kozos.h" +#include "lib.h" +#include "memory.h" + +typedef struct _kzmem_block { + struct _kzmem_block *next; + int size; +} kzmem_block; + +typedef struct _kzmem_pool { + int size; + int num; + kzmem_block *free; +} kzmem_pool; + +static kzmem_pool pool[] = { + {16, 8, NULL}, + {32, 8, NULL}, + {64, 4, NULL}, +}; + +#define MEMORY_AREA_NUM (sizeof(pool) / sizeof(*pool)) + +static int kzmem_init_pool(kzmem_pool *p) +{ + int i; + kzmem_block *mp; + kzmem_block **mpp; + extern char freearea; + static char *area = &freearea; + + mp = (kzmem_block *)area; + + mpp = &p->free; + for (i = 0; i < p->num; i++) { + *mpp = mp; + memset(mp, 0, sizeof(*mp)); + mp->size = p->size; + mpp = &(mp->next); + mp = (kzmem_block *)((char *)mp + p->size); + area += p->size; + } + + return 0; +} + +int kzmem_init(void) +{ + int i; + for (i = 0; i < MEMORY_AREA_NUM; i++) { + kzmem_init_pool(&pool[i]); + } + return 0; +} + +void *kzmem_alloc(int size) +{ + kzmem_block *mp; + kzmem_pool *p; + int i; + + for (i = 0; i < MEMORY_AREA_NUM; i++) { + p = &pool[i]; + if (size <= p->size - sizeof(kzmem_block)) { + if (p->free == NULL) { + kz_sysdown(); + return NULL; + } + mp = p->free; + p->free = p->free->next; + mp->next = NULL; + return mp + 1; + } + } + kz_sysdown(); + return NULL; +} + +void kzmem_free(void *mem) +{ + kzmem_block *mp; + kzmem_pool *p; + int i; + + mp = ((kzmem_block *)mem -1); + + for (i = 0; i < MEMORY_AREA_NUM; i++) { + p = &pool[i]; + if (mp->size == p->size) { + mp->next = p->free; + p->free = mp; + return; + } + } + kz_sysdown(); +} diff --git a/src/os/memory.h b/src/os/memory.h new file mode 100644 index 0000000..2e1f8db --- /dev/null +++ b/src/os/memory.h @@ -0,0 +1,8 @@ +#ifndef _KOZOS_MEMORY_H_INCLUDED_ +#define _KOZOS_MEMORY_H_INCLUDED_ + +int kzmem_init(void); +void *kzmem_alloc(int size); +void kzmem_free(void *mem); + +#endif diff --git a/src/os/syscall.c b/src/os/syscall.c index a381b2e..0d0173a 100644 --- a/src/os/syscall.c +++ b/src/os/syscall.c @@ -59,3 +59,19 @@ int kz_chpri(int priority) kz_syscall(KZ_SYSCALL_TYPE_CHPRI, ¶m); return param.un.chpri.ret; } + +void *kz_kmalloc(int size) +{ + kz_syscall_param_t param; + param.un.kmalloc.size = size; + kz_syscall(KZ_SYSCALL_TYPE_KMALLOC, ¶m); + return param.un.kmalloc.ret; +} + +int kz_kmfree(void *p) +{ + kz_syscall_param_t param; + param.un.kmfree.p = p; + kz_syscall(KZ_SYSCALL_TYPE_KMFREE, ¶m); + return param.un.kmfree.ret; +} diff --git a/src/os/syscall.h b/src/os/syscall.h index fb7895d..9801468 100644 --- a/src/os/syscall.h +++ b/src/os/syscall.h @@ -12,6 +12,8 @@ typedef enum { KZ_SYSCALL_TYPE_WAKEUP, KZ_SYSCALL_TYPE_GETID, KZ_SYSCALL_TYPE_CHPRI, + KZ_SYSCALL_TYPE_KMALLOC, + KZ_SYSCALL_TYPE_KMFREE, } kz_syscall_type_t; // システムコール呼び出し時のパラメータ格納用構造体 @@ -46,6 +48,14 @@ typedef struct { int priority; int ret; } chpri; + struct { + int size; + void *ret; + } kmalloc; + struct { + char *p; + int ret; + } kmfree; } un; } kz_syscall_param_t; diff --git a/src/os/test10_1.c b/src/os/test10_1.c new file mode 100644 index 0000000..a9694ef --- /dev/null +++ b/src/os/test10_1.c @@ -0,0 +1,35 @@ +#include "defines.h" +#include "kozos.h" +#include "lib.h" + +int test10_1_main(int argc, char *argv[]) +{ + char *p1, *p2; + int i, j; + puts("test10_1 started.\n"); + + for (i = 4; i <= 56; i += 4) { + p1 = kz_kmalloc(i); + p2 = kz_kmalloc(i); + for (j = 0; j < i - 1; j++) { + p1[j] = 'a'; + p2[j] = 'b'; + } + p1[j] = '\0'; + p2[j] = '\0'; + + putxval((unsigned long)p1, 8); + puts(" "); + puts(p1); + puts("\n"); + putxval((unsigned long)p2, 8); + puts(" "); + puts(p2); + puts("\n"); + + kz_kmfree(p1); + kz_kmfree(p2); + } + puts("test10_1 exit.\n"); + return 0; +}