オリジナルOS「MicrOS」の設計と実装(3) ―― MicrOSのシステム・コール
6.メモリ関連の関数
● メモリ・アロケーション
void *__malloc(unsigned int size)
void *__wmalloc(unsigned int size) (ウェイト系)
可変長メモリ・ブロックのサイズを指定して割り当てます.返り値はメモリ・ブロックの先頭アドレスです.ワード境界に割り当てられます.__mallocが割り当てられなかったときはNULLが返されますが,__wmallocなら割り当てられるまでタスクがウェイトします.システム・コントロール・ブロックのメモリ・アロケーション領域から必要なサイズが切り出されます.
● アロケーション・メモリの開放
int __free(void *madr) (アクティブ系)
メモリ・アロケーションで取得した使用済みメモリ・ブロックを開放します.メモリ・アロケーションを待っているタスクがあれば,開放した領域で条件を満たすかどうかをチェックし,条件を満たせばタスクにメモリ・ブロックを割り当てて,タスクのウェイトを解除します.
● 固定長メモリ・ブロックの生成
int opn_mblk(_MBLKCB *scb, int size, int n, void *buf)
指定されたサイズのメモリ・ブロックを,指定された個数分bufの領域を使って生成します.bufはsize×nの容量が必要です.また,bufはワード境界,sizeは4の倍数でなければなりません.生成された各メモリ・ブロックはRQBとして使われてもいいように初期化されています.scbには固定長メモリ・ブロックの管理構造体が生成されます.
● 固定長メモリ・ブロックの割り当て
void *asg_mblk(_MBLKCB *scb)
void *wasg_mblk(_MBLKCB *scb) (ウェイト系)
指定された固定長メモリ・ブロックの管理構造体からメモリ・ブロックを割り当てて,割り当てられたメモリ・ブロックのアドレスを返します.asg_mblkでは割り当てられなかったときにNULLが返されますが,__wasg_mblkでは割り当てられるまでタスクがウェイトします.
● 固定長メモリ・ブロックの開放
int rel_mblk(_MBLKCB *scb, void *block) (アクティブ系)
固定長メモリ・ブロックの割り当てにおいて,割り当てられたメモリ・ブロックを開放します.固定長メモリ・ブロックの割り当て待ちのタスクがあれば,タスクにメモリ・ブロックを割り当ててタスクのウェイトを解除します.
次回はシステム・コールの続きとして,同期,アプリケーション作成支援,デバック,文字列,UART関連の関数について説明します.
たぐち・のぶお
tag: OS