libomの使い方

目次

  1. はじめに
  2. インストール
  3. ファイルを使用する
  4. mallocを使用する
  5. その他関数について
  6. リンク方法
  7. 再コンパイル
  8. その他
  9. 履歴

はじめに

libom は オンメモリCライブラリの意味です(^^;
PowerX-VM(現Ver 0.0.07)ではファイルIO操作が行えません。libomでは 予めメモリにファイルイメージを組み込んでおく事で、ストリーム系 関数(freadやfwriteなど)を仮想的に実現します。また、printfやmalloc などはスタブ関数として定義されています。
libomではファイルストリーム系関数を使用したライブラリ等を、取りあえず 使用できるという第一目的がありますが、将来PowerX-VMやPowerXの実機上で、 本物のファイルストリームが扱える様になった場合でも、最低限のソースの 変更と再コンパイルで実行ファイルを再構築できるというメリットも備えて います。いや、備えているといいなぁ(^^;(<弱気)

インストール

アーカイブをダウンロードし、適当なディレクトリに展開します。
後はリンク時にlibom.aをリンクします。

ファイルを使用する

ヘッダファイルはppclibc2のものを使用します。普通に

#include <stdlib.h>
#include <stdio.h>

でインクルードして下さい。続いて、libom内で使用しているグローバル変数 を宣言して下さい。

extern FILE file_buf[256] ;
extern int  file_cur      ;


以上で前準備は完了です。

ファイルを使用する場合、メモリの番地をファイルポインタに結びつけます。

FILE    *fp;                                 /** 普通にファイルポインタを宣言する **/

/** メモリfpをセットする **/
file_buf[file_cur]._p      =(char*)0x70000 ; /**ファイルイメージが0x70000から始まっている**/
file_buf[file_cur]._blksize=26960  ;         /**ファイルサイズを指定                     **/
file_buf[file_cur]._offset =0      ;         /**ファイルシーク位置.  0をセットします    **/

fp=fopen("dummy.bin","wb");                  /**ファイルポインタにセット 名前やモードはダミー**/
又は
fp=&file_buf[file_cur] ;                     /**ファイルポインタにセット                 **/


これで、fpはfopen()された後のファイルポインタを保持した事と等価になります。 複数のファイルを扱う場合はfile_buf[file_cur+n] でnを1〜255まで順に使用して メモリイメージと結びつけて下さい。


※注意点
  1. fwrite()ではファイルは無限に書き込めるものとしています。従いまして、 fwrite()したいファイルポインタの書き込み先アドレス(file_buf[n]._pで 指されるアドレス)が、他のデータと重ならない様にプログラムで保証する 必要があります。
  2. fopen()を使用する場合、fopenされるファイル分のfile_buf[]をオープンする 順に予めセットしておく必要があります。
    また、fopen()が呼ばれる度にfile_curが自動的にインクリメントされます。 従いまして、読み込みオープンした後クローズして、再び同じファイル イメージに書き込みオープンする様な使い方はそのままではできない (file_curを事前に操作しておけばOKです)ので、注意が必要です。

malloc()を使用する

malloc()のスタブを使用します。次のグローバル変数を宣言します。

extern int  heap_top      ;


続いてmain()内など、実際にmalloc()が呼ばれる前に、malloc()でメモリ割り当てを 開始するヒープメモリの先頭アドレスをセットします。

 heap_top = 0x60000 ; /** heapの先頭をセットする **/


これで準備は完了です。malloc()を実行する度に0x60000から順にメモリが割り当て られていきます。

※注意点
  1. free()は空関数となっています。従いまして、malloc()->free()->malloc()して も、二度目に呼ばれるmalloc()で、一度目のmalloc()で割り当てられていた領域が 再利用される事はありません。メモリの確保->解放を繰り返す様なプログラムは 注意が必要です。
    src/stdlib/malloc.cを見ていただければなんとなく仕組みが判るかも知れません(^^;

その他関数について

その他 printf(),fprintf(),putc(),getc()などの様に標準入出力を使用するものは、 入力関数は常にEOFを返し、出力関数は空関数となっています。

リンク方法

ppclibcのlibc.a内の関数をすり替える様なイメージで使用しますが、 リンクには少々コツが必要となっています(^^;

LIBPATH   = ../../ppclib2/lib
LIBOMPATH = ../../libom/lib
INCPATH   = ../../ppclib2/include
BINPATH   = ../../ppcbin

CFLAGS  = $(OPT) -I. -I$(INCPATH)
LD      = $(BINPATH)/ld -V -Qy -dn -Bstatic -Ttext 0x10000 \
		-Tdata 0x20000 -Tbss 0x30000

LDFLAGS = -Map map.log

$(PROGRAM) : $(OBJS)
	$(LD) $(LDFLAGS) $(LIBPATH)/start.o \             #リンク1
	$(OBJS) $(LIBOMPATH)/libom.a -L$(LIBPATH) -lc \   #リンク2
	$(LIBOMPATH)/libom.a -L$(LIBPATH) -lc \           #リンク3
	$(LIBPATH)/libgcc.a -o $@                         #リンク4
	bcut -s 0x10000 $@ > $@.bin
	$(BINPATH)/objdump --source $@ > $@.dis


「#リンク1〜4」がリンクの本体ですが、ppclibcのlibc.a(ここでは "-L$(LIBPATH) -lc"で指定しています)よりも先にlibom.aを指定 する必要があります。所がこれだけだと、GNU-ldを使用した場合、 libom.a,libc.aに含まれているハズの関数が無いという旨のエラー メッセージが出力される為、「#リンク3」の様にもう一度、二つの ライブラリを指定する必要がある様です。
※バグなのか仕様なのかは不明(^^;

再コンパイル

ヘッダファイルが別途必要です。ppclibc2で使用しているincludeディレクトリを libom/の下にlibom/include としてコピーするかシンボリックリンクを張るなどして下さい。 続いて、srcディレクトリの中に入って、makeを実行するとコンパイルが開始されます。 make libを実行すると、libom/lib下のlibom.aが更新されます。

その他

取りあえずPowerX-VM上で動作するプログラムを作成する為にでっち あげたライブラリなので、かなりいい加減で且つ多くの制限を持って います。PowerX-VMで本物のファイルエミュレーションが使用できる様に なれば不要となるでしょう(^^; それまでのつなぎって感じで使用して いただけると幸いです。

履歴

  2000/05/18 : 初版
  2000/05/21 : 言い回しをいくつか修正


TOP PREV