私はオペレーティング システムの設計クラスを受講しており、C で書かれたマイクロカーネルを提供され、その上に構築しています。カーネルは 32 ビット マシンを念頭に置いて設計されているようで、私は Snow Leopard を実行しています。それでクラスの友達と私はそれを 64 ビットのアドレッシングにハックしようとしてきました。
最大の問題は、インライン アセンブリを使用して現在のスタック ポインターをディスパッチャーが使用する一時変数にコピーする 1 行のコードにあるようです。
#define SET_STACK(s) asm("movl temp,%esp");
%esp
は 32 ビット レジスタであるため、当然、コンパイラはエラーを吐き出します。
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:32-bit absolute addressing is not supported for x86-64
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:cannot do signed 4 byte relocation
%rsp
だから私はそれを64ビットスタックポインターレジスターに置き換えました(そして、私はちょうど%sp
うまくいくと思います.GASは適切なプレフィックスを置くのに十分スマートであることをここのどこかで読みました)。に置き換え%esp
た後%rsp
、次のエラーが発生します。
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc8TLdjH.s:523:Incorrect register `%sp' used with `l' suffix
今、私はアセンブラの経験があまりないので、少し途方に暮れています。、およびに置き換えてみましmovl
たが、何も機能しないようです。おそらくサイズが間違っているのではないかと思いますか?mov
movq
temp
Temp はグローバル変数で、次のように宣言されています。
void* temp; // temp pointer used in dispatcher
さまざまなデータ型のサイズを出力する簡単なプログラムを作成しましたが、x86-64 の void* のサイズは 8 バイトのように見えますが、これは正しいサイズであるはずですよね?
とにかく、明らかに、誰かがこの問題を解決してくれるとは思っていませんが、正しい方向に向けるヒントがあれば大歓迎です!