osFree.htm
3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osFree(3P)<BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osCreateRegion, osMalloc, osFree, osGetRegionBufCount,
osGetRegionBufSize
<P>
→ 任意の範囲のメモリを配置するルーチン<BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<P>
void *osCreateRegion(void *startAddress, u32 length,
u32 bufferSize, u32 alignSize);
<P>
void *osMalloc(void *region);
<P>
<B>void osFree(void *region, void *addr);</B>
<P>
long osGetRegionBufCount(void *region);
<P>
long osGetRegionBufSize(void *region);<BR>
<P>
<B>説明<BR>
</B>
<P>
これらのルーチンは、メモリ配置のためのシンプルかつ高速なメカニズムを供給し、任意のメモリエリアから固定サイズのバッファを解放します。リージョンはユーザーによって定義された物理的に連続したメモリブロックであり、メモリリージョンはosCreateRegionコールを使用することにより、実行中にいくつでも生成することができます。ユーザーはコントロールストラクチャのための一定のオーバーヘッドを含むバッファサイズのための十分大きなメモリブロックを供給しなければなりません。
<BR>
<P>
このメモリ配置スキムは入力メモリエリアの先頭の数バイトにリージョンコントロールヘッダをとります。残りの範囲は単に、同サイズのバッファを並べていきます。バッファサイズはalignSizeで定義されたバイト数にそろえられます。
<BR>
<P>
生成中に、それぞれのリージョンには一意的にリージョンIDが与えられます。ユーザーはこのidを用いてリージョンにアクセスします。実際にはidはリージョンへのコントロールヘッダアドレスですから、リージョンへはダイレクトにアクセスすることになり、サーチなどを行うことはありません。
<BR>
<P>
2つのシンプルなコールosMallocとosFreeは,高速な動的メモリをバッファに配置,解放します。サーチすることなく、osMallocは領域のフリーリストの先頭のバッファを獲得し、osFreeはフリーリストの先頭にバッファを置きます。
<BR>
<P>
osCreateRegionルーチンはstartAddressアドレスに始まりlengthバイトまで続いた連続するメモリエリアをリージョンとして生成します。この領域は少なくともbufferSize(byte)のサイズのバッファを含むようにイニシャライズされます。alignSizeはバッファアドレスとサイズをそろえるために使用されるバイト数(2,4,8,16byteを含む)を指定します。これらの数値はregion.h中にOS_RG_ALIGN_2B,
OS_RG_ALIGN_4B, OS_RG_ALIGN_8B, OS_RG_ALIGN_16Bにそれぞれ定義されています。もしalignSizeが0であれば、デフォルト値(OS_RG_ALIGN_DEFAULTは8byte(64bit)です。)が使用されます。
<P>
osCreateRegionは領域リージョンの開始アドレスをポインタとして返します。このポインタは、他のリージョンルーチンで一意的なリージョンidとして使用されます。
<BR>
<P>
osMallocはリージョン内のバッファへのポインタを返します。それはalignSize(byte)にアラインされています。バッファサイズはosCreateRegionルーチンをコールしているときに定義されます。
<BR>
<P>
<B>osFree</B>の中の引数addrは、osMallocによって前もって割り当てられたバッファへのポインタです。osFreeはバッファアドレスのチェックを実行した後に、リージョンのフリーリストにこのバッファを返します。
<BR>
<P>
osGetRegionBufCountはリージョン中に生成されたバッファの総数を返します。同様にosGetRegionBufSizeは、リージョン中のそれぞれのバッファに割り当てられたサイズ(byte)を返します。
<BR>
<P>
<B>特徴<BR>
</B>
<P>
osCreateRegionは以下の状態に遭遇すれば、NULLポインタを返します。
<BR>
<P>
(1) スタートアドレスがない場合。
<P>
(2) 長さまたはバッファサイズが0以下の場合。
<P>
(3) バッファアドレスがストアデータから蓄えられた実際の長さよりも大きくなった場
合。<BR>
<P>
リージョン中に利用できるフリーバッファがない場合は、osMallocはNULLを返すでしょう。
<BR>
<P>
<B>注意<BR>
</B>
<P>
通常、リージョンには最大32,768のバッファまでしか持つことができません。イニシャライズ中、リージョンのスタートアドレスは自動的にalignSize境界に整列され、同様に、そのバッファサイズ(Byte)はalignSizeに整列されます。
<P>
ユーザーは同じメモリアドレスを指す複数のリージョンを生成しないように、非常に注意しなければいけません。リージョン生成中のメモリチェックをなにも行わないので、アドレスが重なった場合は動作の保証はできません。
<BR>
<BR>
</BODY>
</HTML>