26

私の OS X ボックスでは、カーネルは 32 ビット バイナリですが、64 ビット バイナリを実行できます。これはどのように作動しますか?

cristi:~ diciu$ ファイル ./a.out
./a.out: Mach-O 64 ビット実行可能ファイル x86_64
cristi:~ diciu$ ファイル /mach_kernel
/mach_kernel: 2 つのアーキテクチャを持つ Mach-O ユニバーサル バイナリ
/mach_kernel (アーキテクチャ i386 用): Mach-O 実行可能 i386
/mach_kernel (アーキテクチャ ppc 用): Mach-O 実行可能 ppc
cristi:~ diciu$ ./a.out
cristi:~ diciu$ echo $?
1
4

6 に答える 6

44

CPU は、カーネル コンテキストにトラップされると、64 ビット実行モードから 32 ビットに切り替えることができます。また、32 ビット カーネルを構築して、64 ビット ユーザー空間アプリから渡された構造を理解することもできます。

いずれにせよ、MacOS X カーネルは、独自の別のアドレス空間に存在するため、ユーザー アプリからのポインターを直接逆参照しません。たとえば、ioctl 呼び出しのユーザー空間ポインターは、最初にその物理アドレスに解決され、次にカーネル アドレス空間に作成された新しい仮想アドレスに解決される必要があります。ioctl のポインタが 64 ビットか 32 ビットかは問題ではありません。どちらの場合も、カーネルはそれを直接逆参照しません。

そのため、32 ビット カーネルと 64 ビット バイナリを混在させることができ、その逆も同様です。できないことは、32 ビット ライブラリと 64 ビット アプリケーションを混在させることです。それらの間で渡されるポインターが切り捨てられるためです。MacOS X は、リリースごとに 32 ビット バージョンと 64 ビット バージョンの両方で、より多くのフレームワークを提供しています。

于 2008-09-08T15:34:59.263 に答える
6

バイナリを実行するのはカーネルではありません。プロセッサーです。

バイナリはライブラリ関数を呼び出しますが、それらは 64 ビットである必要があります。また、システム コールを行う必要がある場合、自分自身が 64 ビットであるにもかかわらず、カーネルが 32 ビットしかないという事実に対処するのは彼らの責任です。

しかし、それはあなたが心配する必要があるものではありません。

于 2008-09-08T15:27:46.753 に答える
6

すべての32 ビット カーネルが 64 ビット プロセスを実行できるわけではないことに注意してください。Windows には確かにこのプロパティがなく、Linux で実行されているのを見たことがありません。

于 2008-09-10T07:06:04.103 に答える
2

64 ビット バイナリをロードして実行できる 32 ビット カーネルには、メモリ マッピング、プログラムのロード、およびその他の 64 ビットの問題を処理するための 64 ビット コードが必要です。

ただし、スケジューラーや他の多くの OS 操作は、他の問題に対処するために 64 ビット モードで動作する必要はありません。ドライバー、タスク、メモリ割り当て、およびマッピングを処理するために、必要に応じてプロセッサを 32 ビット モードに切り替えます。 、割り込みなど

実際、OS が実行することのほとんどは、64 ビットで実行すると必ずしも高速に実行されるとは限りません。OS は重いデータ プロセッサではなく、それらの部分 (ストリーム、ディスク I/O など) は変換される可能性があります。 64ビットに(とにかくOSへのプラグイン)。

しかし、裸のカーネル自体は、64ビットの場合、おそらくタスクスイッチなどを高速化することはありません.

これは特に、ほとんどの人がまだ 32 ビット アプリを実行している場合に当てはまります。そのため、モードの切り替えは必ずしも必要ではありません。オーバーヘッドの少ない操作であっても、時間がかかります。

-アダム

于 2008-09-08T15:50:56.840 に答える
1

ELF32 ファイルには 64 ビット命令を含めることができ、64 ビット モードで実行できます。それが持っている唯一のことは、ヘッダーとシンボルの編成が32ビット形式であることです。シンボル テーブル オフセットは 32 ビットです。シンボル テーブル エントリは 32​​ ビット幅などです。64 ビット コードと 32 ビット コードの両方を含むファイルは、内部計算に 64 ビット レジスタを使用する 32 ビット ELF ファイルとして自身を公開できます。mach_kernel は、そのような実行可能ファイルの 1 つです。得られる利点は、32 ビット ドライバーの ELF をリンクできることです。4GB より下にあるポインターを、他のリンクされた ELF バイナリーに渡すように注意すれば、問題なく動作します。

于 2009-06-17T13:44:57.447 に答える
0

カーネルが 64 ビットであっても、カーネル拡張機能 (つまり、通常はドライバー) が 64 ビットであるという効果的な利点しか得られません。実際には、すべて 64 ビットのカーネル拡張か、(現在のように) すべて 32 ビットのカーネル拡張が必要です。実行中のカーネルのアーキテクチャにネイティブである必要があります。

于 2008-09-08T15:32:08.757 に答える