メモリ

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 (主にテスト用)

メモリ領域種別

これらの定数はメモリマップデザイナIMPL_MEM_GetConfig() でメモリ領域の種別を指定するのに使用します。

SOLID_RAM

通常のRAM空間として設定します。メモリ属性SOLID_MEM_ATTR_DATA が設定されます。

SOLID_IO

IO空間として設定します。メモリ属性SOLID_MEM_ATTR_IO が設定されます。

SOLID_CORE

コアサービス用の空間として設定します。

SOLID_RESERVE

予約済みの空間として設定します。

SOLID_ROM

読み取り専用の空間として設定します。メモリ属性SOLID_MEM_ATTR_CACHEABLESOLID_MEM_ATTR_BUFFERABLE、および SOLID_MEM_ATTR_READONLY が設定されます。

SOLID_DIRECT

メモリ属性フラグ (SOLID_MEM_ATTR_...) とこの定数の論理和 (|) を取ることにより、独自のメモリ属性を設定できます。

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_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_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 -- 領域名(文字列, NULL終端)

  • 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 -- 確保した領域の先頭アドレス

戻り値:

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
struct _SOLID_MEM_ALLOC_INFO_

説明

メモリ使用状況取得用構造体

定義

typedef struct _SOLID_MEM_ALLOC_INFO_ {
    size_t total;
    size_t used;
} SOLID_MEM_ALLOC_INFO;

メンバー

size_t total

総確保サイズ(byte)

size_t used

使用中サイズ(byte)

SOLID_MEM_GetAllocInfo

int SOLID_MEM_GetAllocInfo(int area, SOLID_MEM_ALLOC_INFO *pInfo)

メモリ割り当て状況の取得

SOLIDが管理しているメモリの使用状況を取得します。

パラメータ:
戻り値:

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

メモリ領域種別を指定します。

const char *name

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

参考

予約済みメモリ空間名は 定義済みのメモリマップ名 を参照してください

SOLID_ADDRESS vaddr

マッピングする仮想アドレス

IMPL_MEM_GetConfig

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

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

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

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

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

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