Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NSEG 19/08 chromium内部構造とIPC

NSEG 19/08 chromium内部構造とIPC

D05b3b2abff3f73f249a01d60257bdde?s=128

hATrayflood

August 10, 2019
Tweet

Transcript

  1. 2019/8/10 NSEG 19/08 chromium 内部構造とIPC by ABE Hiroki aka hATrayflood

  2. 2019/8/10 NSEG 19/08 お前 誰︖ by ABE Hiroki aka hATrayflood

  3. 2019/8/10 NSEG 19/08 ⾃⼰紹介 ・名前︓アベヒロキ (@hATrayflood) ・職業︓⾃宅サーバ管理者 ・URL︓rayflood.org/diary-temp/ ・地元︓東部町 by

    ABE Hiroki aka hATrayflood
  4. 2019/8/10 NSEG 19/08 OSSの主な領域 ・firefox ・python ・ubuntu ・コンパイラ by ABE

    Hiroki aka hATrayflood
  5. 2019/8/10 NSEG 19/08 前提 by ABE Hiroki aka hATrayflood

  6. 2019/8/10 NSEG 19/08 chromiumのコードはC/C++ しかもC++11規格を要求します 最新ではなないものの プロジェクト規模の割に新しい by ABE Hiroki

    aka hATrayflood
  7. 2019/8/10 NSEG 19/08 警告は容赦なくエラー にされるので、うっかり 未使⽤変数を残した だけでコンパイルエラー by ABE Hiroki

    aka hATrayflood
  8. 2019/8/10 NSEG 19/08 https://chromium-cpp.appspot.com/ by ABE Hiroki aka hATrayflood

  9. 2019/8/10 NSEG 19/08 本題 by ABE Hiroki aka hATrayflood

  10. 2019/8/10 NSEG 19/08 コードの理解 のために by ABE Hiroki aka hATrayflood

  11. 2019/8/10 NSEG 19/08 https://cs.chromium.org/ by ABE Hiroki aka hATrayflood

  12. 2019/8/10 NSEG 19/08 最新のchromiumの コードがインデックス化 されて検索可能 by ABE Hiroki aka

    hATrayflood
  13. 2019/8/10 NSEG 19/08 https://cs.chromium.org/chromium/src/out/ by ABE Hiroki aka hATrayflood

  14. 2019/8/10 NSEG 19/08 ビルドの過程で⾃動⽣成される コードの参照と検索も可能 by ABE Hiroki aka hATrayflood

  15. 2019/8/10 NSEG 19/08 わからないことがあったら ここで検索しましょう google検索よりも確実 by ABE Hiroki aka

    hATrayflood
  16. 2019/8/10 NSEG 19/08 モジュール 関連図 by ABE Hiroki aka hATrayflood

  17. 2019/8/10 NSEG 19/08 https://nhiroki.jp/2017/12/01/chromium-sourcecode by ABE Hiroki aka hATrayflood

  18. 2019/8/10 NSEG 19/08 全体が依存する base, urlなどもある third_party内の 他プロジェクトのコードも by ABE

    Hiroki aka hATrayflood
  19. 2019/8/10 NSEG 19/08 third_party/WebKitは third_party/blinkに 移⾏済み by ABE Hiroki aka

    hATrayflood
  20. 2019/8/10 NSEG 19/08 依存関係 の定義 by ABE Hiroki aka hATrayflood

  21. 2019/8/10 NSEG 19/08 BUILD.gn 依存するモジュール をdepsに定義 by ABE Hiroki aka

    hATrayflood
  22. 2019/8/10 NSEG 19/08 url/BUILD.gn component("url") { sources = [ ..

    ] deps = [ "//base", "//base/third_party/dynamic_annotations", "//ipc:param_traits", ] by ABE Hiroki aka hATrayflood
  23. 2019/8/10 NSEG 19/08 図を逆⾏するような 依存関係を定義すると gn genが通らなかったり 最後のリンクでエラー by ABE

    Hiroki aka hATrayflood
  24. 2019/8/10 NSEG 19/08 third_party/blink/renderer/core/BUILD.gn component("core") { output_name = "blink_core" deps

    = [ "//third_party/blink/public/common", "//third_party/blink/renderer/platform", "//third_party/blink/renderer/platform/wtf", "//content/public/common", # 不正な依存関係 ] by ABE Hiroki aka hATrayflood
  25. 2019/8/10 NSEG 19/08 開発時はビルドオプション is_component_build=true を使いましょう モジュールごとに.dll/.so /.dylibを⽣成してくれます by ABE

    Hiroki aka hATrayflood
  26. 2019/8/10 NSEG 19/08 250個ほどの共有ライブラリができる ので不正な依存関係があると リンクエラーで落としてくれます by ABE Hiroki aka

    hATrayflood
  27. 2019/8/10 NSEG 19/08 is_component_build=true がないと、ビルドが通ってしまう ことがあるので、定期的に チェックしたほうがいいかも by ABE Hiroki

    aka hATrayflood
  28. 2019/8/10 NSEG 19/08 BUILD.gn について by ABE Hiroki aka hATrayflood

  29. 2019/8/10 NSEG 19/08 ninjaにおける Makefile みたいなファイル by ABE Hiroki aka

    hATrayflood
  30. 2019/8/10 NSEG 19/08 リファレンス https://gn.googlesource.com/gn /+/master/docs/reference.md by ABE Hiroki aka

    hATrayflood
  31. 2019/8/10 NSEG 19/08 makeの置き換えなので cflagsとかldflagsとか ⾒覚えのあるものが by ABE Hiroki aka

    hATrayflood
  32. 2019/8/10 NSEG 19/08 その⼀⽅でexecutableとか shared_libraryとかの 既定ターゲットが⽤意されてたり by ABE Hiroki aka

    hATrayflood
  33. 2019/8/10 NSEG 19/08 ⼀から書いてみると ⾯⽩いかもしれない 今回はchromiumの話 なので基本差し込むだけ by ABE Hiroki

    aka hATrayflood
  34. 2019/8/10 NSEG 19/08 プロセス間 通信 by ABE Hiroki aka hATrayflood

  35. 2019/8/10 NSEG 19/08 https://nhiroki.jp/2017/12/01/chromium-sourcecode by ABE Hiroki aka hATrayflood

  36. 2019/8/10 NSEG 19/08 図の通りブラウザー本体 とウェブページ表⽰で プロセスが分離してます by ABE Hiroki aka

    hATrayflood
  37. 2019/8/10 NSEG 19/08 レンダラープロセスは 与えられたデータで ページを描画するのが仕事 by ABE Hiroki aka

    hATrayflood
  38. 2019/8/10 NSEG 19/08 そうじゃない仕事は ブラウザープロセスの役割 by ABE Hiroki aka hATrayflood

  39. 2019/8/10 NSEG 19/08 ネットワークやローカルファイル ユーザーの許可が必要な デバイスへのアクセス by ABE Hiroki aka

    hATrayflood
  40. 2019/8/10 NSEG 19/08 履歴、キャッシュ、Cookie フォームの⾃動⼊⼒ サイトのパスワード by ABE Hiroki aka

    hATrayflood
  41. 2019/8/10 NSEG 19/08 flash実⾏の 確認なんかもそう by ABE Hiroki aka hATrayflood

  42. 2019/8/10 NSEG 19/08 プロセス分離 の利点 by ABE Hiroki aka hATrayflood

  43. 2019/8/10 NSEG 19/08 コンテンツのクラッシュに 引きずられてブラウザー 本体まで死ななくなる by ABE Hiroki aka

    hATrayflood
  44. 2019/8/10 NSEG 19/08 昔はよくありましたね ・jsがこける ・flash, pdfがこける ・アンチウィルスがこける by ABE

    Hiroki aka hATrayflood
  45. 2019/8/10 NSEG 19/08 使えるメモリが増えて 容量が必要なコンテンツ を描画・再⽣できる by ABE Hiroki aka

    hATrayflood
  46. 2019/8/10 NSEG 19/08 32bitプロセスの場合 ブラウザーとコンテンツ 両⽅を2GBまたは4GBに 納めなければならなかった by ABE Hiroki

    aka hATrayflood
  47. 2019/8/10 NSEG 19/08 プロセスを分けると それぞれで2GBまたは 4GBまでメモリを使える by ABE Hiroki aka

    hATrayflood
  48. 2019/8/10 NSEG 19/08 とはいえ今は、バイナリそのものが 64bit化されているので かつての2GB/4GBの制限は もはやないに等しい。。 by ABE Hiroki

    aka hATrayflood
  49. 2019/8/10 NSEG 19/08 セキュリティ の向上 by ABE Hiroki aka hATrayflood

  50. 2019/8/10 NSEG 19/08 サイトごとにプロセスを 分けることで、バグを利⽤して 別サイトからデータを盗む といったことが防ぎやすくなる by ABE Hiroki

    aka hATrayflood
  51. 2019/8/10 NSEG 19/08 Meltdownとか Spectreとか ありましたよね by ABE Hiroki aka

    hATrayflood
  52. 2019/8/10 NSEG 19/08 プロセス分離 の⽋点 by ABE Hiroki aka hATrayflood

  53. 2019/8/10 NSEG 19/08 複数のプロセスを起動させるので その分だけ単純にメモリを消費する by ABE Hiroki aka hATrayflood

  54. 2019/8/10 NSEG 19/08 プロセス間通信の オーバーヘッドによる パフォーマンス低下 by ABE Hiroki aka

    hATrayflood
  55. 2019/8/10 NSEG 19/08 メモリ消費は仕⽅ないけど プロセス間通信は マシン性能の向上で ほぼ問題ないのでは by ABE Hiroki

    aka hATrayflood
  56. 2019/8/10 NSEG 19/08 実際、応答速度を求められる HTMLゲームも実プレイに ⽀障がないくらいだし by ABE Hiroki aka

    hATrayflood
  57. 2019/8/10 NSEG 19/08 (⾳ゲーとか格ゲーみたいな フレーム単位の操作を 求められるようなのは知らない) by ABE Hiroki aka

    hATrayflood
  58. 2019/8/10 NSEG 19/08 プロセス間通信 の実装 by ABE Hiroki aka hATrayflood

  59. 2019/8/10 NSEG 19/08 送信 content/renderer/render_frame_impl.cc void RenderFrameImpl::OpenURL(std::unique_ptr<blink::WebNavigationInfo> info) { //

    A valid RequestorOrigin is always expected to be present. DCHECK(!info->url_request.RequestorOrigin().IsNull()); WebNavigationPolicy policy = info->navigation_policy; FrameHostMsg_OpenURL_Params params; params.url = info->url_request.Url(); params.initiator_origin = info->url_request.RequestorOrigin(); params.uses_post = IsHttpPost(info->url_request); ... Send(new FrameHostMsg_OpenURL(routing_id_, params)); } by ABE Hiroki aka hATrayflood
  60. 2019/8/10 NSEG 19/08 受信 content/browser/frame_host/render_frame_host_impl.cc bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {

    ... IPC_BEGIN_MESSAGE_MAP(RenderFrameHostImpl, msg) IPC_MESSAGE_HANDLER(FrameHostMsg_Detach, OnDetach) IPC_MESSAGE_HANDLER(FrameHostMsg_UpdateState, OnUpdateState) IPC_MESSAGE_HANDLER(FrameHostMsg_OpenURL, OnOpenURL) IPC_MESSAGE_HANDLER(FrameHostMsg_BeforeUnload_ACK, OnBeforeUnloadACK) IPC_MESSAGE_HANDLER(FrameHostMsg_SwapOut_ACK, OnSwapOutACK) IPC_MESSAGE_HANDLER(FrameHostMsg_ContextMenu, OnContextMenu) ... by ABE Hiroki aka hATrayflood
  61. 2019/8/10 NSEG 19/08 content/browser/frame_host/render_frame_host_impl.cc void RenderFrameHostImpl::OnOpenURL(const FrameHostMsg_OpenURL_Params& params) { //

    Verify and unpack IPC payload. GURL validated_url; scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory; if (!VerifyOpenURLParams(GetSiteInstance(), params, &validated_url, &blob_url_loader_factory)) { return; } ... frame_tree_node_->navigator()->RequestOpenURL( this, validated_url, params.initiator_origin, params.uses_post, params.resource_request_body, params.extra_headers, params.referrer, params.disposition, params.should_replace_current_entry, params.user_gesture, params.triggering_event_info, params.href_translate, std::move(blob_url_loader_factory)); } by ABE Hiroki aka hATrayflood
  62. 2019/8/10 NSEG 19/08 送信はRenderThreadにSend(Message* msg)するだけ 受信はIPCのマクロで処理するメソッドを定義する メッセージはcontent/common/frame_messages.hで IPCのマクロで定義 by ABE

    Hiroki aka hATrayflood
  63. 2019/8/10 NSEG 19/08 ただし この⽅式は もう古い by ABE Hiroki aka

    hATrayflood
  64. 2019/8/10 NSEG 19/08 mojo by ABE Hiroki aka hATrayflood

  65. 2019/8/10 NSEG 19/08 https://chromium.googlesource.com /chromium/src/+/master/mojo/README.md by ABE Hiroki aka hATrayflood

  66. 2019/8/10 NSEG 19/08 定義 third_party/blink/public/mojom/mime/mime_registry.mojom module blink.mojom; interface MimeRegistry {

    [Sync] GetMimeTypeFromExtension(string extension) => (string mime_type); }; by ABE Hiroki aka hATrayflood
  67. 2019/8/10 NSEG 19/08 送信 third_party/blink/renderer/platform/network/mime/mime_type_registry.cc String MIMETypeRegistry::GetMIMETypeForExtension(const String& ext) {

    // The sandbox restricts our access to the registry, so we need to proxy // these calls over to the browser process. DEFINE_STATIC_LOCAL(MimeRegistryPtrHolder, registry_holder, ()); String mime_type; if (!registry_holder.mime_registry->GetMimeTypeFromExtension( ext.IsNull() ? "" : ext, &mime_type)) { return String(); } return mime_type; } by ABE Hiroki aka hATrayflood
  68. 2019/8/10 NSEG 19/08 受信 content/browser/renderer_host/render_process_host_impl.cc void RenderProcessHostImpl::RegisterMojoInterfaces() { auto registry

    = std::make_unique<service_manager::BinderRegistry>(); ... registry->AddInterface(base::BindRepeating(&MimeRegistryImpl::Create), base::CreateSequencedTaskRunner( {base::ThreadPool(), base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN, base::TaskPriority::USER_BLOCKING})); by ABE Hiroki aka hATrayflood
  69. 2019/8/10 NSEG 19/08 処理実⾏ content/browser/mime_registry_impl.cc void MimeRegistryImpl::GetMimeTypeFromExtension( const std::string& extension,

    GetMimeTypeFromExtensionCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::string mime_type; net::GetMimeTypeFromExtension( base::FilePath::FromUTF8Unsafe(extension).value(), &mime_type); std::move(callback).Run(mime_type); } by ABE Hiroki aka hATrayflood
  70. 2019/8/10 NSEG 19/08 普通の関数呼び出しっぽい 戻り値は実⾏成否判定で 実際の戻り値はポインタで もらうおなじみの⽅法 by ABE Hiroki

    aka hATrayflood
  71. 2019/8/10 NSEG 19/08 c++のtry-catchは 最適化を妨げるので これが普通ではある by ABE Hiroki aka

    hATrayflood
  72. 2019/8/10 NSEG 19/08 他にも話し たかった事 by ABE Hiroki aka hATrayflood

  73. 2019/8/10 NSEG 19/08 ・webidlとjsインターフェース ・ページ読み込み時の挙動 ・ユーザーデータの取り扱い ・独⾃のchrome://ページ ・コンテンツスクリプト ・android版の実装 by

    ABE Hiroki aka hATrayflood
  74. 2019/8/10 NSEG 19/08 重要 ⽂献 by ABE Hiroki aka hATrayflood

  75. 2019/8/10 NSEG 19/08 nhiroki's weblog Chromium のソースコードの歩き⽅ https://nhiroki.jp/2017/12/01/chromium-sourcecode @toyoshim Web

    MIDIを例にChromeにAPIを追加する⼿順概要を追ってみる https://qiita.com/toyoshim/items/1b02e6ec5728da1aef3f Chromium Browser Advent Calendar 2017 https://qiita.com/advent-calendar/2017/chromium by ABE Hiroki aka hATrayflood
  76. 2019/8/10 NSEG 19/08 chromiumの実装に 関する⽇本語の資料は この2つが特に秀逸 by ABE Hiroki aka

    hATrayflood
  77. 2019/8/10 NSEG 19/08 ・リンク集 twitter @hATrayflood http://twitter.com/hATrayflood C++ use in

    Chromium https://chromium-cpp.appspot.com/ Code Search https://cs.chromium.org/ out/ - Code Search https://cs.chromium.org/chromium/src/out/ GN Reference https://gn.googlesource.com/gn/+/master/docs/reference.md Inter-process Communication (IPC) - The Chromium Projects https://www.chromium.org/developers/design-documents/inter-process-communication by ABE Hiroki aka hATrayflood
  78. 2019/8/10 NSEG 19/08 won't fix: Firefox 3.6のクラッシュ傾向 https://wontfix.blogspot.com/2010/02/firefox-36.html 「Microsoft以外のウイルス対策ソフトは害悪なので⼊れるべきではない」とMozillaの元開発者が告⽩ -

    GIGAZINE https://gigazine.net/news/20170131-stop-using-antivirus/ 容量の壁 - Wikipedia x86_32ビットから64ビット https://ja.wikipedia.org/wiki/容量の壁#x86_32ビットから64ビット Meltdown https://ja.wikipedia.org/wiki/Meltdown Spectre https://ja.wikipedia.org/wiki/Spectre Mojo https://chromium.googlesource.com/chromium/src/+/master/mojo/README.md by ABE Hiroki aka hATrayflood