メモリ

API

メモリ関連のAPIの定義は、 solid_mem.h にあります。

#include "solid_mem.h"

メモリ属性値

SOLID_MEM_ATTR_READONLY
SOLID_MEM_ATTR_EXECUTABLE
SOLID_MEM_ATTR_CACHEABLE
SOLID_MEM_ATTR_BUFFERABLE
SOLID_MEM_ATTR_CODE
SOLID_MEM_ATTR_RODATA
SOLID_MEM_ATTR_DATA
SOLID_MEM_ATTR_IO
SOLID_MEM_ATTR_TEST

定数

名前

説明

SOLID_MEM_ATTR_READONLY

1

書き込み不可

SOLID_MEM_ATTR_EXECUTABLE

2

実行可能

SOLID_MEM_ATTR_CACHEABLE

4

キャッシュ可

SOLID_MEM_ATTR_BUFFERABLE

8

バッファ可

SOLID_MEM_ATTR_CODE

コード領域の属性: 書き込み不可、実行可能、キャッシュ可、バッファ可

SOLID_MEM_ATTR_RODATA

ROデータ領域の属性: 書き込み不可、キャッシュ可、バッファ可

SOLID_MEM_ATTR_DATA

通常データ領域の属性: キャッシュ可、バッファ可

SOLID_MEM_ATTR_IO

IO領域の属性: バッファ可

SOLID_MEM_ATTR_TEST

0

strongly ordered (主にテスト用)

メモリ空間

SOLID_RAM
SOLID_IO
SOLID_CORE
SOLID_RESERVE

定数

名前

説明

SOLID_RAM

0

通常RAM

SOLID_IO

1

IO空間

SOLID_CORE

2

コアサービス用

SOLID_RESERVE

3

領域予約用

SOLID_MEM_Alloc

int SOLID_MEM_Alloc(SOLID_ADDRESS VA, size_t size)

論理アドレスにメモリを確保します。

指定された範囲内に既にメモリが確保されている場合はエラーが返ります。

パラメータ:
  • VA -- 確保する領域の先頭アドレス

  • size -- 確保する領域のサイズ(byte)

戻り値:

SOLID_MEM_AllocFlat

int SOLID_MEM_AllocFlat(SOLID_ADDRESS VA, size_t size)

論理アドレスに物理アドレス的に連続なメモリを確保します。

指定された範囲内に既にメモリが確保されている場合はエラーが返ります。

パラメータ:
  • VA -- 確保する領域の先頭アドレス

  • size -- 確保する領域のサイズ(byte)

戻り値:

SOLID_MEM_IsFlat

int SOLID_MEM_IsFlat(SOLID_ADDRESS VA, size_t size)

指定した論理アドレス範囲が物理アドレス的に連続かどうかを問い合わせます

パラメータ:
  • VA -- 確認する領域の先頭アドレス

  • size -- 確認する領域のサイズ(byte)

戻り値:

  • 0: 物理メモリは不連続である

  • 1: 物理メモリは連続である

  • それ以外: エラー

SOLID_MEM_Realloc

int SOLID_MEM_Realloc(SOLID_ADDRESS VA, size_t size)

論理アドレスにメモリを確保します。

既に確保されている場合、確保されていない領域だけを確保します。

パラメータ:
  • VA -- 確保する領域の先頭アドレス

  • size -- 確保する領域のサイズ(byte)

戻り値:

SOLID_MEM_Free

int SOLID_MEM_Free(SOLID_ADDRESS VA, size_t size)

指定された論理アドレスを解放します。

パラメータ:
  • VA -- 解放する領域の先頭アドレス

  • size -- 解放する領域のサイズ(byte)

戻り値:

SOLID_MEM_Map

int SOLID_MEM_Map(SOLID_ADDRESS VA, size_t size, SOLID_PHYADDRESS PA)

論理アドレスに物理アドレスをマップします。

既にそのエリアに物理アドレスがマップされていた場合、新しいものに上書きされます。

パラメータ:
  • VA -- マップする論理アドレス領域の先頭アドレス

  • size -- マップする領域のサイズ(byte)

  • PA -- マップされる物理アドレス領域の先頭アドレス

戻り値:

SOLID_MEM_Unmap

int SOLID_MEM_Unmap(SOLID_ADDRESS VA, size_t size)

論理アドレスを無効状態にします。

パラメータ:
  • VA -- 無効にする論理アドレス領域の先頭アドレス

  • size -- 無効にする領域のサイズ(byte)

戻り値:

SOLID_MEM_IsValid

int SOLID_MEM_IsValid(SOLID_ADDRESS VA, size_t size)

指定した論理アドレス範囲がアクセス可能かを問い合わせます。

アクセス可能かどうかを確認するだけのため、書き込み可/不可や実行可能領域かどうかは判定されません。

パラメータ:
  • VA -- チェックする領域の先頭アドレス

  • size -- チェックする領域のサイズ(byte)

戻り値:

  • 1: 指定された範囲はアクセス可能

  • 0: アクセス不可の領域が存在

SOLID_MEM_VA2PA

int SOLID_MEM_VA2PA(SOLID_ADDRESS VA, SOLID_ADDRESS *PA)

論理アドレスから物理アドレスを確定します。

物理アドレスが割り当てられていない場合、SOLID_ERR_MACV が返ります。

パラメータ:
  • VA -- 論理アドレス

  • PA -- 物理アドレス

戻り値:

SOLID_MEM_GetAttr

int SOLID_MEM_GetAttr(SOLID_ADDRESS VA, int *attr)

指定された論理アドレスの属性を取得します。

パラメータ:
戻り値:

SOLID_MEM_SetAttr

int SOLID_MEM_SetAttr(SOLID_ADDRESS VA, size_t size, int attr)

指定された論理アドレスの範囲の属性を変更します

パラメータ:
戻り値:

SOLID_MEM_GetAddress

int SOLID_MEM_GetAddress(const char *areaname, SOLID_ADDRESS *VA, size_t *size)

領域名からアドレスを取得します

パラメータ:
  • areaname -- 領域名(文字列,NUL終端)

  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

戻り値:

SOLID_MEM_GetAreaName

int SOLID_MEM_GetAreaName(SOLID_ADDRESS VA, const char **pAreaname)

アドレスから領域名を取得します

パラメータ:
  • VA -- 領域に含まれるアドレス

  • pAreaname -- 領域名へのポインタ

戻り値:

SOLID_MEM_CACHE_InvalidateCode

void SOLID_MEM_CACHE_InvalidateCode(SOLID_ADDRESS VA, size_t size)

指定された領域のコードキャッシュを破棄します

領域が特定サイズより大きい場合、全コードキャッシュを破棄する処理になります。特定サイズの計算方法は、キャッシュ命令の呼び出し回数が全領域の呼び出し回数よりも大きくなるサイズをしきい値としています。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_InvalidateCodeStrict

void SOLID_MEM_CACHE_InvalidateCodeStrict(SOLID_ADDRESS VA, size_t size)

指定された領域のコードキャッシュを破棄します

領域が大きい場合、この命令の処理に時間がかかることがあります。範囲が大きくなる可能性がある場合は、SOLID_MEM_CACHE_InvalidateCode() を使用することを推奨します。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_Invalidate

void SOLID_MEM_CACHE_Invalidate(SOLID_ADDRESS VA, size_t size)

データキャッシュを破棄します

領域が特定サイズより大きい場合、全データキャッシュを書き戻して破棄する処理になります。特定サイズの計算方法は、キャッシュ命令の呼び出し回数が全領域の呼び出し回数よりも大きくなるサイズをしきい値としています。

領域がキャッシュのアライメントに従っていない場合、範囲外と重なる領域はデータキャッシュを書き戻して破棄する処理に変更されます。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_InvalidateStrict

void SOLID_MEM_CACHE_InvalidateStrict(SOLID_ADDRESS VA, size_t size)

データキャッシュを破棄します

領域が大きい場合、この命令の処理に時間がかかることがあります。範囲が大きくなる可能性がある場合は、SOLID_MEM_CACHE_Invalidate() を使用することを推奨します。

領域がキャッシュのアライメントに従っていない場合、範囲外部分もデータキャッシュを破棄する可能性があります。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_Clean

void SOLID_MEM_CACHE_Clean(SOLID_ADDRESS VA, size_t size)

データキャッシュを書き戻します

領域が特定サイズより大きい場合、全データキャッシュを書き戻して破棄する処理になります。特定サイズの計算方法は、キャッシュ命令の呼び出し回数が全領域の呼び出し回数よりも大きくなるサイズをしきい値としています。

領域がキャッシュのアライメントに従っていない場合、範囲外部分もデータキャッシュを書き戻す可能性があります。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_CleanStrict

void SOLID_MEM_CACHE_CleanStrict(SOLID_ADDRESS VA, size_t size)

データキャッシュを書き戻します

領域が大きい場合、この命令の処理に時間がかかることがあります。範囲が大きくなる可能性がある場合は、SOLID_MEM_CACHE_Clean() を使用することを推奨します。

領域がキャッシュのアライメントに従っていない場合、範囲外部分もデータキャッシュを書き戻す可能性があります。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_CleanAll

void SOLID_MEM_CACHE_CleanAll()

全データキャッシュを書き戻します

SOLID_MEM_CACHE_Flush

void SOLID_MEM_CACHE_Flush(SOLID_ADDRESS VA, size_t size)

データキャッシュを書き戻してから破棄します

領域が特定サイズより大きい場合、全データキャッシュを書き戻して破棄する処理になります。特定サイズの計算方法は、キャッシュ命令の呼び出し回数が全領域の呼び出し回数よりも大きくなるサイズをしきい値としています。

領域がキャッシュのアライメントに従っていない場合、範囲外部分もデータキャッシュを書き戻して破棄する可能性があります。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_FlushStrict

void SOLID_MEM_CACHE_FlushStrict(SOLID_ADDRESS VA, size_t size)

データキャッシュを書き戻してから破棄します

領域が大きい場合、この命令の処理に時間がかかることがあります。範囲が大きくなる可能性がある場合は、SOLID_MEM_CACHE_Flush() を使用することを推奨します。

領域がキャッシュのアライメントに従っていない場合、範囲外部分もデータキャッシュを書き戻して破棄する可能性があります。

パラメータ:
  • VA -- 領域の先頭アドレス

  • size -- 領域のサイズ(byte)

SOLID_MEM_CACHE_FlushAll

void SOLID_MEM_CACHE_FlushAll()

全データキャッシュを書き戻してから破棄します

SOLID_MEM_AllocIO

int SOLID_MEM_AllocIO(SOLID_PHYADDRESS PA, size_t size, SOLID_ADDRESS *VA)

IO割り当て空間にIOを割り付けます

パラメータ:
  • PA -- 割り付けるIOの物理アドレス

  • size -- 割り付けるIOの範囲(byte)

  • VA -- 割り付けた領域の先頭アドレス

戻り値:

SOLID_MEM_FreeIO

int SOLID_MEM_FreeIO(SOLID_ADDRESS VA, size_t size)

IO割り当て空間のIOを解放する

パラメータ:
  • VA -- 解放するIOの先頭アドレス

  • size -- 解放するIOのサイズ(byte)

戻り値:

SOLID_MEM_CheckIO

int SOLID_MEM_CheckIO(SOLID_PHYADDRESS PA, SOLID_ADDRESS *VA, size_t *size)

IO割り当てがされているかを問い合わせる

パラメータ:
  • PA -- 問い合わせるIOの物理アドレス

  • VA -- 割り当てられた領域の先頭アドレス

  • size -- 割り当てられたIOの範囲(byte)

戻り値:

SOLID_MEM_AllocPA

int SOLID_MEM_AllocPA(size_t size, SOLID_ADDRESS align, SOLID_PHYADDRESS *PA)

SOLID_RAM管理領域から物理メモリを確保する

パラメータ:
  • size -- 確保するサイズ(byte)

  • align -- 確保する領域のアライメント(byte)

  • PA -- 確保した領域の先頭アドレス

戻り値:

要実装関数

メモリ関連の要実装関数の定義は、impl_mem_conf.h にあります。

#include "impl_mem_conf.h"

SOLID_MEM_CONF

typedef struct _SOLID_MEM_CONF_ SOLID_MEM_CONF

説明

物理/論理メモリ領域設定用構造体

定義

typedef struct _SOLID_MEM_CONF_ {
    SOLID_ADDRESS paddr;
    size_t        size;
    unsigned long attr;
    const char*   name;
    SOLID_ADDRESS vaddr;
} SOLID_MEM_CONF;

メンバー

paddr

使用する領域の物理アドレス

size

使用するメモリ領域のサイズ

attr

属性:

SOLID_RAM:

通常RAM

SOLID_IO:

IO空間

SOLID_CORE:

コアサービス用

SOLID_RESERVE:

領域予約用

name

領域を識別する文字列('0'終端)

vaddr

マッピングする論理アドレス

IMPL_MEM_GetConfig

void IMPL_MEM_GetConfig(SOLID_MEM_CONF **pp_list, int *p_len)

メモリ設定リストを取得する。

この関数で取得された論理アドレスの設定はSOLIDで自動的に割り付けられます。

メモリマップデザイナを使用している場合、この実装を変更する必要はありません。

パラメータ:
  • pp_list -- メモリ設定

  • p_len -- メモリ設定の個数