ARM を実行しているマシンをシミュレートするために C で命令セット シミュレータを作成しようとしています。私は4GBのメモリを効率的に表現できるようにする必要があり、掘り下げた後、それぞれが最初の使用時に動的に割り当てられる4MBのブロックを指す1024個のポインターの配列を作成する解決策に達しました
#define MEMSIZE 1024 //1024 * 2Mb = 4Gb
#define PAGESIZE 4194304 //4 Mb
#define PAGEEXP 22 //2^PAGEEXP = PAGESIZE
uint32_t* mem[MEMSIZE];
私の質問は、メモリの特定のアドレスにアクセスするにはどうすればよいですか?
私が試したのは、以下のようにアドレスをインデックスとオフセットに分割することですが、これはインデックスとオフセットの両方に対して 0 しか返さないようです。(memAdd はアクセスしようとしているアドレスです)
memIdx = memAdd >> PAGEEXP;
memOfs = memAdd & PAGESIZE;
アドレスを取得したら、読み取り/書き込みに使用する関数を以下に示します。
void memWrite(uint32_t idx, uint32_t ofs, uint32_t val)
{
if(mem[idx] == 0)
mem[idx] = malloc(PAGESIZE);
*(mem[idx] + ofs) = *(mem[idx] + ofs) & val;
}
uint32_t memRead(uint32_t idx, uint32_t ofs)
{
if(mem[idx] == 0)
return 0;
else
return *(mem[idx] + ofs);
}
これらは私の頭の中で正しいように見えますが、私はまだポインターに 100% 慣れていないので、これは間違っている可能性があります。
これがすでにどこかで議論されている場合は申し訳ありませんが、必要なものに関連するものを見つけることができませんでした(私のキーワードはかなり広いです)