問題タブ [xnu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kernel - Mach vm_read が OSX 10.8.2 の期待値を返さない
最近 UNIX プラットフォームに移行したばかりで、現在はオペレーティング システムの研究を行っています。現在、私は XNU の設計/実装に特に興味を持っており、現在はプロセスとメモリのトピックに取り組んでいます。
実行可能ファイルが別のプロセスからタスクポートを取得できるようにするこのコードスニペットがあります
Mac OSX 10.8.2 には ASLR があることを認識しているため、実行するターゲット プロセスは gdb 経由で呼び出されます。
0x100000000
アドレスに Mach-O のマジック ナンバーが含まれていることを GDB 内で確認することもできます。
ただし、私のプログラムがターゲット プロセスのメモリを読み込もうとすると、期待しているマジック ナンバーではなく、ランダムな値が返されます (ランダムです)。
2157 はターゲット PID、1103 はタスク ポート、および からの結果ですmach_error_string
。また、vm_read
関数を試してみましたが、それでも同じ動作です。
installation - xnuのインストールで常に多くのxcrunエラーが発生する(OSX 10.8.3)
xnuカーネルをインストールするために多くのWebサイトを検索しました。ただし、xnu のインストール中にいくつかのエラーが発生します。
Xcode バージョン: 4.6 (インストール済みのコマンド ライン ツール)
XNU バージョン: xnu-2050.22.13
dtrace バージョン: dtrace-96
ここにエラーがあります:
xcrun:エラー:ユーティリティ「ctfconvert」が見つかりません。開発者ツールまたはPATHではありません
xcrun:エラー:ユーティリティ「ctfmerge」が見つかりません。開発者ツールまたはPATHではありません
「make install」を使用して dtrace をインストールしましたが、エラーも表示されます。私を助けてください
linux - Mac OS X: Unix ドメイン データグラム ソケット経由で fd を送信すると、recvmsg が EMSGSIZE を返す
Unix ドメイン ソケットと sendmsg/recvmsg を使用して 2 つのプロセス間で fd を送信するコードがあります。このコードは、Linux と Mac の両方で実行する必要があります (両方のプラットフォームで個別にコンパイルされます)。SOCK_DGRAM (データグラム) ソケットを使用しています。
コードで一度に 1 つの fd を送信します。Mac では、この方法でいくつかの fd を正常に送信した後、recvmsg() は EMSGSIZE で失敗します。recvmsg のマンページによると、これは msg->msg_iovlen <=0 または >= Mac では 2048 の定数である場合にのみ発生します。私のコードでは、msg_iovlen を常に 1 に固定しています。送信側と受信側でこれを確認し、recvmsg() 障害の直後にメッセージ ヘッダーを読み取って確認しました。この同じコードは、Linux でも正常に動作します。
XNU カーネル ソースを見ると、レシーバーが fd を使い果たした可能性がありますが、エラーが発生する前に 4 つまたは 5 つの fd しか送信していないため、十分な fd が残っているはずです。
fd を送信せず、データのみを送信すると、このエラーは発生しません。
コントロール メッセージをパックするコードは次のようになります。
そして、ここに受信機があります:
手がかりはありますか?前もって感謝します
macos - XNU は Kext に含まれます
フィールドにアクセスできるはずのKextに取り組んでいstruct proc->p_pid
ます。問題は、構造が XNU ソースでのみ定義されているため、incomplete definition of type 'struct proc'
コンパイル中にエラーが発生したことです。
私の観点からすると、自分のプロジェクトに XNU ヘッダーを含めることは悪臭を放つ解決策ですが、別の方法は何ですか? 構造をコピーして自分のコードに貼り付けるのですか?
macos - OS X 10.8 - システムコール後のアドレス空間レイアウト
実験的な理由から、OS X 10.8.2 (x86 LP64 カーネルを実行) ボックスでスワッピングを完全に無効にしました。
アプリからシステム コールを実行すると、アドレス空間のレイアウトはどのようになりますか? つまり、アドレス空間全体が配線されているため (スワッピングなし)、カーネルから有効なユーザー アドレスに決定論的にアクセスし、そのアドレスを含むページがメモリに常駐していると想定できますか?
私の理解はイエスですが、ユーザー空間が64ビットか32ビットかに関係なく、OS Xカーネルは常に32ビットモードで実行され、プロセスアドレス空間全体が切り替えられ、4G全体がカーネルによって使用されることを読んだ後、少し混乱しています。これは 10.8.2 に適用されますか? この場合、カーネル空間から有効なユーザー空間アドレスにアクセスできなくなりますよね?
macos - OSx のカーネル拡張に対するスリープおよびウェイクアップ プロセスの影響は何ですか?
OSx カーネルのスリープおよびウェイクアップ プロセス中に何が起こっているかを知りたいです。
カーネル エクステンションは新しいアドレス空間を受け取り、その初期化プロセスを最初からやり直しますか、それともカーネルは単にエクステンションを同じアドレス空間に戻しますか?
内部カーネル拡張機能 (IOKit ドライバーなど) も同じように動作しますか? おそらく、それらはメモリ内の別の場所にロードされていますか?
基本的に問題は、IOService へのインターフェイスを取得したドライバーが、スリープ後に問題なくそのアドレスを使用できるかどうかです。
kernel - 呼び出し命令でのページ フォールト
Apple の XNU カーネルのカスタム フォークを起動しようとしています (ソースはこちらから入手できます)。カーネルは、 start.s の 325 行目でトリプル フォールトを起こしています。
QEMU ログを調べると、アドレスのページ フォールトが指摘されています0x10BFF8
。このアドレスは、アドレス にある PML4 の 1 つ前の 4K ページ + 8 バイト0x10D000
です。call
ただし、命令がこのようにページ違反になる理由はわかりません。誰か考えがありますか?