メモリ
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_SHARED
-
SOLID_MEM_ATTR_NOSHARED
-
SOLID_MEM_ATTR_NORMALMEMORY
-
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_SHARED
16(SMP時は0)
共有属性
SOLID_MEM_ATTR_NOSHARED
0(SMP時は16)
非共有属性
SOLID_MEM_ATTR_NORMALMEMORY
32
キャッシュ不可の通常メモリ
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_MEM_Alloc
-
int SOLID_MEM_Alloc(SOLID_ADDRESS VA, size_t size)
論理アドレスにメモリを確保します。
指定された範囲内に既にメモリが確保されている場合はエラーが返ります。
- パラメータ:
VA -- 確保する領域の先頭アドレス
size -- 確保する領域のサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_AllocFlat
-
int SOLID_MEM_AllocFlat(SOLID_ADDRESS VA, size_t size)
論理アドレスに物理アドレス的に連続なメモリを確保します。
指定された範囲内に既にメモリが確保されている場合はエラーが返ります。
- パラメータ:
VA -- 確保する領域の先頭アドレス
size -- 確保する領域のサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
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_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_Free
-
int SOLID_MEM_Free(SOLID_ADDRESS VA, size_t size)
指定された論理アドレスを解放します。
- パラメータ:
VA -- 解放する領域の先頭アドレス
size -- 解放する領域のサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_Map
-
int SOLID_MEM_Map(SOLID_ADDRESS VA, size_t size, SOLID_PHYADDRESS PA)
論理アドレスに物理アドレスを通常メモリとしてマップします。
既にそのエリアに物理アドレスがマップされていた場合、新しいものに上書きされます。
- パラメータ:
VA -- マップする論理アドレス領域の先頭アドレス
size -- マップする領域のサイズ(byte)
PA -- マップされる物理アドレス領域の先頭アドレス
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_MapWithAttribute
-
int SOLID_MEM_MapWithAttribute(SOLID_ADDRESS VA, size_t size, SOLID_PHYADDRESS PA, int attr)
論理アドレスに物理アドレスを指定された属性でマップします。
既にそのエリアに物理アドレスがマップされていた場合、新しいものに上書きされます。
- パラメータ:
VA -- マップする論理アドレス領域の先頭アドレス
size -- マップする領域のサイズ(byte)
PA -- マップされる物理アドレス領域の先頭アドレス
attr -- メモリ属性 (SOLID_MEM_ATTR_XXXX)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_Unmap
-
int SOLID_MEM_Unmap(SOLID_ADDRESS VA, size_t size)
論理アドレスを無効状態にします。
- パラメータ:
VA -- 無効にする論理アドレス領域の先頭アドレス
size -- 無効にする領域のサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
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_ERR_OK
: 正常終了SOLID_ERR_MACV
: 割り当てなしSOLID_ERR_PAR
: 引数エラー
SOLID_MEM_GetAttr
-
int SOLID_MEM_GetAttr(SOLID_ADDRESS VA, int *attr)
指定された論理アドレスの属性を取得します。
- パラメータ:
VA -- 論理アドレス
attr -- メモリ属性 (SOLID_MEM_ATTR_XXXX)
- 戻り値:
SOLID_ERR_OK
: 正常終了SOLID_ERR_MACV
: 割り当てなしSOLID_ERR_PAR
: 引数エラー
SOLID_MEM_SetAttr
-
int SOLID_MEM_SetAttr(SOLID_ADDRESS VA, size_t size, int attr)
指定された論理アドレスの範囲の属性を変更します
- パラメータ:
VA -- 変更する領域の先頭アドレス
size -- 変更する領域のサイズ(byte)
attr -- メモリ属性 (SOLID_MEM_ATTR_XXXX)
- 戻り値:
SOLID_ERR_OK
: 正常終了SOLID_ERR_MACV
: 割り当てなしSOLID_ERR_PAR
: 引数エラー
SOLID_MEM_GetAddress
-
int SOLID_MEM_GetAddress(const char *areaname, SOLID_ADDRESS *VA, size_t *size)
領域名からアドレスを取得します
- パラメータ:
areaname -- 領域名(文字列,NUL終端)
VA -- 領域の先頭アドレス
size -- 領域のサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了SOLID_ERR_NOTFOUND
: 指定された領域が存在しないSOLID_ERR_PAR
: 引数エラー
SOLID_MEM_GetAreaName
-
int SOLID_MEM_GetAreaName(SOLID_ADDRESS VA, const char **pAreaname)
アドレスから領域名を取得します
- パラメータ:
VA -- 領域に含まれるアドレス
pAreaname -- 領域名へのポインタ
- 戻り値:
SOLID_ERR_OK
: 正常終了SOLID_ERR_NOTFOUND
: 指定されたアドレスに領域が存在しないSOLID_ERR_PAR
: 引数エラー
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_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_FreeIO
-
int SOLID_MEM_FreeIO(SOLID_ADDRESS VA, size_t size)
IO割り当て空間のIOを解放する
- パラメータ:
VA -- 解放するIOの先頭アドレス
size -- 解放するIOのサイズ(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_CheckIO
-
int SOLID_MEM_CheckIO(SOLID_PHYADDRESS PA, SOLID_ADDRESS *VA, size_t *size)
IO割り当てがされているかを問い合わせる
- パラメータ:
PA -- 問い合わせるIOの物理アドレス
VA -- 割り当てられた領域の先頭アドレス
size -- 割り当てられたIOの範囲(byte)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_MEM_AllocPA
-
int SOLID_MEM_AllocPA(size_t size, SOLID_ADDRESS align, SOLID_PHYADDRESS *PA)
SOLID_RAM管理領域から物理メモリを確保する
- パラメータ:
size -- 確保するサイズ(byte)
align -- 確保する領域のアライメント(byte)
PA -- 確保した領域の先頭アドレス
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID管理メモリ領域
-
SOLID_MEM_MINFO_RAM
-
SOLID_MEM_MINFO_OSSTACK
-
SOLID_MEM_MINFO_IOAREA
-
SOLID_MEM_MINFO_SOLID
-
SOLID_MEM_MINFO_MMU_L2
-
SOLID_MEM_MINFO_DLLAREA
定数
名前
値
説明
SOLID_MEM_MINFO_RAM
0
SOLID_RAM領域
SOLID_MEM_MINFO_OSSTACK
1
OSSTACK領域
SOLID_MEM_MINFO_IOAREA
2
IOAREA領域
SOLID_MEM_MINFO_SOLID
3
SOLID_CORE領域
SOLID_MEM_MINFO_MMU_L2
4
MMU L2/L3テーブル領域
SOLID_MEM_MINFO_DLLAREA
5
DLLAREA領域
SOLID_MEM_ALLOC_INFO
-
typedef struct _SOLID_MEM_ALLOC_INFO_ SOLID_MEM_ALLOC_INFO
SOLID_MEM_GetAllocInfo
-
int SOLID_MEM_GetAllocInfo(int area, SOLID_MEM_ALLOC_INFO *pInfo)
メモリ割り当て状況の取得
SOLIDが管理しているメモリの使用状況を取得します。
- パラメータ:
pinfo -- 取得した使用状況を格納する領域
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SMP用API
void SOLID_MEM_CACHE_CleanAllM
-
void SOLID_MEM_CACHE_CleanAllM(uint32_t cpumask)
指定されたCPUの全データキャッシュを書き戻します
- パラメータ:
cpumask -- 対象のCPUマスク(bit0:CPU0, bit1:CPU1,...)
void SOLID_MEM_CACHE_FlushAllM
-
void SOLID_MEM_CACHE_FlushAllM(uint32_t cpumask)
指定されたCPUの全データキャッシュを書き戻してから破棄します
- パラメータ:
cpumask -- 対象のCPUマスク(bit0:CPU0, bit1:CPU1,...)
要実装関数
メモリ関連の要実装関数の定義は、impl_mem_conf.h にあります。
#include "impl_mem_conf.h"
SOLID_MEM_CONF
-
typedef struct _SOLID_MEM_CONF_ SOLID_MEM_CONF
-
struct _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;
メンバー
-
SOLID_ADDRESS paddr
使用する領域の物理アドレス
-
size_t size
使用するメモリ領域のサイズ
-
unsigned long attr
属性:
- SOLID_RAM:
通常RAM
- SOLID_IO:
IO空間
- SOLID_CORE:
コアサービス用
- SOLID_RESERVE:
領域予約用
-
const char *name
領域を識別する文字列('0'終端)
-
SOLID_ADDRESS vaddr
マッピングする論理アドレス
-
SOLID_ADDRESS paddr
IMPL_MEM_GetConfig
-
void IMPL_MEM_GetConfig(SOLID_MEM_CONF **pp_list, int *p_len)
メモリ設定リストを取得する。
この関数で取得された論理アドレスの設定はSOLIDで自動的に割り付けられます。
メモリマップデザイナを使用している場合、この実装を変更する必要はありません。
- パラメータ:
pp_list -- メモリ設定
p_len -- メモリ設定の個数