doc/note/memory.txt				-*- text -*-

[BTRON/386 memo 11]

TITLE:	BTRON/386 のメモリ管理機構
AUTHOR:	内藤 隆一
DATE:	1 January 1994
VER:	1.0



1. 本メモの概要

  本メモは、BTRON/386 システムにおけるメモリ管理について記述したもので
ある。 
  本メモでは、BTRON/386 システムで使用しているメモリ管理のうち次の項目
について記述する。

  (1) ITRON-3.0 内部でのメモリ管理
  (2) BTRON/386 タスクでのメモリ管理


2. ITRON-3.0 内部でのメモリ管理

2.1 概要

  ITRON-3.0 内部ではメモリ管理機構としていくつかの層を設定している。

(1) ページサイズ単位でのメモリ管理
    CPU で決められているページ単位でのメモリ管理。
    BTRON/386 では、物理メモリは0x80000000からの仮想メモリにマッピング
    されている。このマッピングされたメモリ領域に対してページ単位で領域
    管理をする。

(2) バイト単位でのメモリ管理
    ページ単位でのメモリ管理を元に、バイト単位でのメモリ管理を行う。す
    なわち、メモリが足りなくなった場合には、ページ単位でメモリを取得し、
    それをバイト単位でのこまかい領域に分割して管理する。

(3) ITRON-3.0 準拠のメモリ管理
    この層では、ITRON-3.0 に対してメモリ管理の要求があった場合の処理を
    行う。ITRON-3.0 でのメモリ管理では、取得した領域のサイズについては
    システム側で管理することになっている(メモリ領域の解放時にサイズの
    指定をしない)。そのため、独自にサイズの管理も行う。

(4) 拡張メモリ管理
    この層では、仮想メモリについての管理を行う。
    仮想メモリ管理の主な目的としては、ユーザプログラムのためのメモリを
    設定することなどがある。ITRON-3.0 では、仮想メモリ管理についてはイ
    ンプリメント依存としており、規定されていないのでこの層については
    BTRON/386 で独自に設計した。
    なお、カーネル空間については立ち上げ時に 0x80000000 の空間上位部に
    マッピングするため、仮想メモリ管理を使用する必要はない(ITRON-3.0 
    のレベルで対処可能である)。


2.2 ページ単位のメモリ管理

2.2.1 インタフェース

  ページ単位でのメモリ管理のために次の関数を定義する。他の層のメモリ管
理と区別するために、関数名の前には 'pmem_' という接頭語を付ける。

  pmem_init 	ページ単位のメモリ管理の初期化を行う 
  pmem_alloc	指定したサイズに従ってメモリをアロケートする。
  pmem_free 	pmem_alloc で取得したメモリを解放する。


2.2.1.1 pmem_init - ページ単位のメモリ管理機構の初期化

関数プロトタイプ	ER pmem_init (void)

引数：			なし

返り値：		エラー番号を返す。
			正常終了時: 0
			メモリ不足: ENOMEM

機能：


2.2.1.2 pmem_alloc - ページ単位でのメモリ領域取得

関数プロトタイプ	VP pmem_alloc (W size)

引数：			size	取得する領域の大きさ。

返り値：		正常時	取得した領域への先頭ポインタ。
			異常時	0(NULL)

機能：


2.2.1.3 pmem_free - ページ単位でのメモリ領域解放

関数プロトタイプ	VP pmem_free (VP region, W size)

引数：			region	解放する領域への先頭ポインタ。
			size	解放する領域の大きさ。

返り値：		エラー番号を返す。
			正常終了時: 0

機能：


2.2.2 内部構造

  ページ単位でのメモリ管理では、物理ページ毎に次の情報をもった構造体の
配列を使用している。

  struct pmem_entry
  {
    W	flag;
    UW	refcount;
  };

  struct pmem_entry	pmem_table[MAX_MEMORY / PAGE_SIZE];


2.3 バイト単位でのメモリ管理

本関数はカーネル内で最も使用されるメモリ管理層である。


2.3.1 関数インタフェース

  バイト単位のメモリ管理のために次の関数を定義する。なお、他の層のメモ
リ管理と区別するために接頭語として 'kmem_' を付けている。

  kmem_init	バイト単位のメモリ管理機能の初期化
  kmem_alloc	バイト単位でのメモリ領域取得
  kmem_free	kmem_alloc で取得した領域の解放


2.3.1.1 kmem_init - メモリ管理の初期化

2.3.1.2 kmem_alloc - メモリ領域取得

2.3.1.3 kmem_free - メモリ領域の解放


2.3.2 内部構造

  バイト単位でのメモリ管理では現在使用していないフリーな領域を、リスト
構造で管理している (ここでは、フリーメモリリストと呼ぶ)。
  各フリー領域は次の構造体によって管理する。

  struct kmem_entry
  {
    struct kmem_entry	*next;
    W			size;
    B			body[0];
    /* ... この後もフリー領域の残りの部分が続く... */
  };
  
  * kmem_alloc で取得するメモリ領域のサイズは、少なくとも kmem_entry 
    構造体のサイズよりも大きくなければならない。

  



2.4 ITRON-3.0 準拠のメモリ管理


2.5 拡張メモリ管理


3. BTRON/386 タスクでのメモリ管理

