1

これは純粋に宿題の質問です。なぜなら、あなたが実際にこれをやろうとしてはいけないことを私は知っているからです。しかし、私はこれを正しくしようとしてきました。コピーする場所の永続的な開始位置と、コピーするメモリのチャンクの正確なサイズがわかっているとします。つまり、ソースが0x28000から0x2C0000までのスタックであるとします。スタックは下に向かって大きくなるため、スタックの最上位(0x2C0000)へのポインターが与えられます。STACK_SIZEバイトを2番目のスタックにコピーします。2番目のスタックの最上部は0x30000です。基本的にこのようなもの:

                Stack 1            Stack 2
       /--+-------------------+-------------------+--/
          |        ABXLQPAOSRJ|                   |
       /--+-------------------+-------------------+--/
      0x280000           0x2C0000            0x300000
                              ^                   ^
                              |                   |
                         Top of stack 1     Top of Stack 2

memcpyを使用する必要がある場合は、0x28000から開始する必要がありますか?(memcpyがどちらの方向に読み取るかは完全にはわかりません。高いアドレスから低いアドレスへ、またはその逆)これは正しいでしょうか?

void* s = (void *)source_stack_bottom      //where source_stack_bottom is 0x280000 in this case
void* d = (void *)dest_stack_bottom    //which is 0x2C0000
memcpy(d, s, STACK_SIZE)          //STACK_SIZE is just a variable with the stack size

なぜそれが機能しないのか考えられませんが、それでも、Cがメモリを割り当てる方法についてはまだかなり混乱しています...

編集::おっと、さまざまな混乱。修正されました。

4

2 に答える 2

1

の素朴な実装は次のmemcpy()ようになります。

void naive_memcpy(void *destt, void *sourcet, size_t size)
{
   char *source = (char *)sourcet;
   char *dest = (char *)destt;
   for(size_t s = 0; s < size; s++){ *dest++ = *source++; }
}

そうです、それは最初から上向きに数えsourceますdest

于 2013-01-25T23:32:30.480 に答える
0

はい、memcpy()渡したベースアドレスからカウントアップします。

組み込みシステム用の「ベアメタル」のようなOSレスソフトウェアを作成することになった場合、またはオペレーティングシステムやカーネルを自分で実装している場合は、このようなことを行う必要があります。

于 2013-01-25T23:29:54.633 に答える