問題タブ [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.
macos - dtrace print 親プロセス コマンド
新しい実行中のプロセスごとに、開始コマンドとその親プロセスを出力するスクリプトが必要です。
私は次のプローブを使用しています:
スクリプト本体内から、コマンド ライン文字列が から作成されcurproc->p_dtrace_argv
ます。
親 pid (ppid) も利用できますが、これまでのところ、親プロセス名 (できれば親 argv[0] から取得できるフルネーム) を抽出する方法を理解できていません。
macos - プロセス コマンド ラインを抽出するときの DTrace 無効アドレス エラー
新しいプロセスのコマンドラインとそれに対応する親名を出力する dtrace スクリプトが必要です。つまり、bash から /Users/bla/myexec arg1 arg2 arg3 を実行すると、次のような結果が得られます。
parent is bash process is --> /Users/bla/myexec arg1 arg2 arg3
ただし、スクリプトの実行中に、一部のプローブでは初期化されていない変数や破損した変数があるようです。
次の bash コマンドの出力例を次に示しますsudo dtrace -C -s ./procargs.d
。プローブproc:mach_kernel:__mac_execve:exec-success
の値が初期化されていないことがわかりますcurproc->p_dtrace_argv
。
おそらく、私のスクリプトの何が問題なのか教えていただけますか?
macos - GetWorkLoop()->runAction と GetCommandGate()->runAction の違いは?
これは長い間私を混乱させてきました。私のIOkitドライバーでは、ワークループに割り込みイベントソース、タイマーイベントソースを登録しました。ハードウェア アクセスには GetWorkLoop()->runAction(pAction) を使用します。したがって、割り込みハンドラーとタイマー ハンドラーからのすべてのハードウェア アクセスと、私の pAction はシリアル化されます。しかし、IOCommandGate から別の runAction を見つけました。2つのrunActionの違いが気になります。いくつかのiokitカーネルドキュメントを調べました.明確な答えが得られませんでした.
xnu ソース:
GetWorkLoop()->runAction(inAction) を呼び出すときを意味します。inAction は、ワークループ スレッド コンテキストではなく、スレッド コンテキストで実行されます。これは正しいです?
コードは GetCommandGate()->runAction も私のスレッドコンテキストで実行されているようです。ワークループスレッドではありませんか?
macos - Mac OS X でカーネル コール スタックを出力する方法
Linux では、echo t > /proc/sysrq-trigger
システム内のすべてのスレッドのカーネル コール スタックをダンプするために使用できます。
同じ目的で Mac OS X に方法はありますか? または1つのプロセスのカーネルスタックをダンプする方法はありますか?
linux - システム コールの printf が不正な形式の出力を返す
次のように、kext を使用して OS X でシステム コールをログに記録しています。
これは に記録されsystem.log
ます。現在の問題は、printf
負荷が高い場合 (多くのシステム コールが呼び出される場合)、出力のsystem.log
形式が正しくないことが多いこと
ID]SYS_readEN] callparam, 123, ed 123, 123
です。たとえば、. 文字列はスクランブルされています。kprintf
シリアル ポートに出力するを使用すると、不正な形式のログが発生することはありません。
この動作を引き起こしているアイデアは大歓迎です!
macos - 宛先ポートに基づく IP/パケット インターフェイス ルーティング -- PF の使用または NKE の作成に関するヒントはありますか?
どのタイプの NKE を作成すべきかについてのヒントを期待しています。OS X でパケットの iproute2 スタイルのルーティングを行うことを検討しています。デフォルトでは、macOS では、「route」コマンドは IP アドレスに限定されているように見えます。ルートをポートに基づいて作成したいと思います。
拡張するために、私はポート 80 と 443 のみが許可されている企業ネットワークにいますが、非常に遅いがすべてのトラフィックを許可する 2 番目のネットワークがあります。80/443 のすべてのトラフィックをより高速な企業ネットワークに転送し、それ以外はすべて低速のネットワークに転送したいと考えています。ただし、ローカル ネットワークの IP 範囲を介して企業ネットワークと通信しようとするトラフィックは例外です。ケースバイケースで、特定のインターフェイスを他のインターフェイスよりも優先して使用するようにアプリを構成できることはわかっています。また、インターフェイスに接続されたプロキシを使用して、トラフィックがフィルターで一致した場合に別のインターフェイスにトラフィックを「転送」することもできますが、過去にメモリ/ディスクの使用量とローカル プロキシに関する問題がありました。
ポートごとに macOS のルーティングを変更することはできないため、サービス順序の最上位に位置し、トラフィックを誘導する独自の仮想ネットワーク インターフェイスを作成できたらどうでしょうか? おそらく、これはパケットの転送、場合によってはパケットの再作成を意味するため、これが最善のアプローチであると 100% 確信できるわけではありません。または、リダイレクトするトラフィックを既存のインターフェイスでリッスンし、リダイレクトされたパケットを別のインターフェイスに変更することもできます。
Apple の Web サイトにある NKE のドキュメントなどの NKE のドキュメントを読んでいると、Apple のメーリング リストへのこの未回答のポスターと同じ立場にいることに気づきました。与えられた例は、使用するインターフェイスの再割り当てではなく、ファイアウォールまたはパケットの書き換え (NAT など) に焦点を当てる傾向があります。そうでなければ良い本も私を助けることはできません。
カーネル拡張機能を書かない方が安全なので、PFでこれが可能ならそこでやりたいです。私はIPNetSentryXについても認識していますが、おそらくサポートが終了していると思われます。つまり、結局 IPFW を使用していたのでしょうか? NKEを使っているとのことですが、可能性はありますか?
考え?Github を検索しましたが、マシンのネットワーク トラフィックをルート化するための 2 つのリポジトリ、TunTap コードを使用する VPN クローンの束、およびルーター アドバタイズをリッスンする拡張機能の構築に関するこの read-meしか見つかりませんでした。残念ながら、ルーティングの例や、トラフィックのインターフェイスの変更はありません。考え?
更新 1: BSD 4.3 の PF に関するドキュメントを確認しましたが、ルーティングに必要なものがないようです。代替ルートに関する IPNetRouterX のヘルプ ページを見ると、Apple Network Kext Interface Filter を使用したいようです。
更新 2: Kext の開発に関する WWDC からの関連講演が 3 つあります。少なくとも 2010 年以降にオンラインで行われたものです。
- WWDC 2010 セッション 203 Mac OS X 用 I/O キット デバイス ドライバー
- WWDC 2013 セッション 707 Kext 開発の新機能 (最後の 3 分の 1 は、新しいデバッグ フラグと 10.9 の変更点をカバーしています)
- WWDC 2015 セッション 706セキュリティとアプリ (kexts について簡単に言及)
kext をテストするために 2 番目の VM を維持するのにどれだけの作業が必要かを考えると、kext でこれを実行したいかどうかはわかりません。事実上、iproute2 ユーザー空間ツールを使用した Linux では 1 ~ 2 行で済みますが、カーネル開発なしでは Mac では不可能のようです。基本的に、デスクトップ コンピューターで Linux ではなく OS X を選択したことに腹を立てたのはこれが初めてです。
それでも、誰かが macOS 開発ポインターで kext ネットワーク ルーティングを持っている場合、私はすべて耳にします。これは、私ができるかどうかを確認するためだけに、楽しい週末のプロジェクトになるかもしれません.
macos - プロセスの仮想メモリ空間と異なるコアダンプ サイズ
私はOS X 10.11で作業しており、次の方法でダンプファイルを生成しました:
ローリング属性を持つダンプファイルを取得しました:642M Jun 26 15:00 core.5228
その直前に、vmmap
コマンドを使用してプロセスの合計メモリ容量を確認し、予想されるダンプ サイズを推定してみました。
ただし、見積もり (238.7Mb) は、実際のサイズ (642Mb) よりもはるかに小さかった。
このギャップは説明できますか?
macos - Race: OSX での kext のアンロード中のコールバックとコールバックの削除
コールバック (kauth_unlisten_scope など) の確立/削除とコールバック自体 (xnu コードベースでは、はい、古いことはわかっています) の間に同期がないようです。これにより、コールバックを追跡/排出し、拡張機能自体の呼び出しと同期する負担がかかります。しかし、これは、スレッドがコールバックを終了し、実際に拡張コードから戻ることを通知するウィンドウがあるという点でも問題があります。
このレースを正しく回避するパターンはありますか? または、これが正しく同期されたことを示す Apple からのドキュメントはありますか?