~主にプログラミング関係この広告は、90日以上更新していないブログに表示しています。Calendar25日目の記事です。低レイヤー技術(後述)をこれから学びたい人向けの入門記事です。自身の経験を踏まえ、より多くの人達にこのレイヤーに興味を持ってほしくて書きました。calendarのネタが作れなかったわけでは(ryなぜこんな記事を書いたかいわゆるシステムプログラミングのような低レイヤー(と言って差し支えない)ジャンルって一体何から始めれば良いのかいまいちピンと来ないし、何が面白いのかも分からないと思われている事が多いと思います。かかわらず低レイヤーの魅力や学び方の指針みたいな物を示した、いわゆる入門記事ってかなり少ないんですよね。本記事はこれからシステムプログラミングを始めたい方や、既にかじってみたが中々先が見えてこない、将来何の役に立つのか不安という方達に読んでいただけると幸いです。言え私自身も真面目に勉強し始めてまだ2年程の若造です。いう記事を書くには時期尚早かなとも思いましたが、まあ、ポエムってその気になった時しか書けないんです...緩い目で、こういう学習方法もあるのか〜程度で見ていただければと。本記事では以下のようなテーマについて、参考資料などを掲示しながら学習方法(の一例)を示していきます。(どこからが"低"レイヤーなのかについては人それぞれ違った意見があると思いますが、とりあえず今回は以下に示すようなジャンルを低レイヤーと呼ぶことにします)技術的な入門記事ではない事に注意してください。※目次の欄をクリックすると各章に飛ぶこともできます。そもそもハマるきっかけはシステムソフトウェアを初め、低レイヤー技術というのはいわゆる縁の下の力持ち的存在であり際立って目立つようなシステムではありません。まあ最初は誰もOSとかコンパイラなんて自力で作れる物なんて思ってもいないし、Linuxとかgccみたいなバカでかい複雑プロジェクトなんて携わろうとも思わないわけですが、どういうきっかけでこの道に引きずり込まれるかというと、多くの場合は既に引きずり込まれた人達が作った物や、書いた書籍、ページなどを見てつられてハマるケースが多いのかなぁと思います。(ああ簡単なOSぐらいなら案外サクッと作れちゃうのかと拍子抜けしたりとか)私の場合は2年前にセキュリティキャンプという所に行って、OSやらVMやら作っている人達を見てハマりました。i7とか第4世代とか聞いても何それ状態だったので、まあ何をやってるのかはさっぱり分かりませんでしたが、衝撃は大きかったですね。起爆剤として何らかの刺激になって頂くだけでも嬉しいですあとこの記事はロードマップ的な物ではなく、辞書的に引いて頂くことを想定しています。これから書いていく参考文献やら資料やらは、自分がやりたい事に必要になったその時に適時参考にしていただければと思います。(愚直に頭から順番にやっていくのはあまりよくなくて、この記事は私がその時々で、何となくやりたいと思ったり研究で必要になったりした際に読みこんだ資料を掲示しているだけです。学習方法といっても人それぞれなので自分に合うやり方で良いと思うんですが、まあどのジャンルをやるにせよとにかく手を動かして自分で作ってみるのが一番良いと思います。システムソフトウェアって、例えばOSとか仮想マシンがどういう仕組みで動いていて...という基礎知識も必要ですが、それ以上に"実際にそれを自力で作れるか"、"既存技術に手を入れてハックできるか"という部分が技能としては一番重視されると思います。実際に実装して物にするまでが非常に大変です。自分で書いてみるの繰り返しになると思います。世の中には既存プロジェクトなんて解析しなくても、最低限のハードウェアの仕様書だけでいきなり大規模なコードを錬成できる人もいるので、そういう人達は最後のステップだけで良いのかなぁ。System)本節はOSの自作やハック手法について述べます。OSというと通常は個人用のデスクトップやサーバーなどにインストールされる物を思い浮かべますが、組み込みの世界だと例えばゲーム機だったりスマートフォンを始めとする各種端末であったりルーターであったり、結構活躍の場は広いジャンルです。Entertainment(今はSIE)の手によって開発されてたり、GoogleのAndroidはLinuxをベース(と言うとちょっと怒られそうですが)にしていたりと、まあ完全に独自な物からforkまでいろいろとあります。既存のOSをハックするのは少し難しいかもしれないですし、いや俺は自分でOSを作りたいんだという人もいるでしょう。いずれにせよ最初は川合先生の30日OS本を読んで、小さなOSを作ってみることをおすすめします。OS自作入門」books.google.co.jp30日OS本はintelのCPUでセグメントやTSSを活用してOSを作っていきます。intelだけじゃなく、他のアーキテクチャでもOSを作ってみたい方には以下もおすすめです。組込みOS自作入門これでOSの基本構造みたいなのは何となく分かると思うんですが、例えばMMUによるページング機構だったりAPICだったりACPIだったりと重要なハードウェア機構はまだまだあります。現実世界のOSを探検して行く段階でこれらはほぼ必須となってくるので、仕様を学んで動かしてみる事をおすすめします。intelのマニュアルを見れば全て載っているのですが、いきなり1から読むのはしんどいかもしれないのでまずは以下のサイトなどでこれらのハードウェアの設定方法や動かし方を学んでみるのがおすすめです。Wikiで、OSの開発にだんだん慣れてくると、今度は既存のOSの実装を真似してみたりハックしてみたくなるかもしれません。Linuxや*BSDを読んでみても良いとは思いますが、ワンクッション置く目的で以下の書籍もおすすめします。V6という非常に簡単なカーネルを解読してみようという物で、UNIXと言えど意外と単純に実装されている事を実感できますし(まあ初期バージョンだからですが)、これぐらいなら自分で作れるかもとOSに対する見方ががらっと変わってくる書籍です。すごく良い本だと思います。なんとなくOSにも慣れきたかなと思ったらいよいよLinuxや*BSDをハックしてみたりドライバを書いたりするのも面白いでしょう。Linuxの解読だと以下がおすすめです。LinuxKernelHackJapanだいたいこの3つでLinux2.6は読むことができます。(あとLinuxカーネル解析入門という書籍もあるそうですが、私は読んだことありません)2.6ってかなり古いですが、最近のバージョンにも適応可能な基本的な設計思想やアーキテクチャが多く載っており、非常に役に立ちます。新しいバージョンのLinuxを解析する資料もあります。Linuxのブートプロセスをみる」tatsu-zine.comこの本はLinux3.3.4の64bitバージョンのコードのうち、主にgrubからカーネルローダーを通してLinuxがブートし、初期化を行う所までを追っていく物です。grubのコード解説まで載っていてブートプロセスを事細かに追うことができます。「Linuxカーネル「ソースコード」を読み解く」(未発売)書籍『Linuxカーネル「ソースコード」を読み解く』(工学社)の見本誌が届きました。出版不況のご時世にも関わらず、紙での本になります。書店で手に取ってみて、中身を見てもらえるとよいかなと思います。購入特典としてダウンロードサービスもあります。2016帯を見れば分かるのですが、なんとこの書籍4.x系に対応しているんですね。現段階ではまだ発売していないので内容に関しては分かりませんが、最新の4.x系の資料はすごく貴重です。あとはLinuxに慣れてくると組み込みボードとか自作のハードなんかに移植したりすると面白いかもしれないです。いう時はデバドラ本が役に立ちます。「Linuxデバイスドライバ」books.google.co.jpLinuxや*BSDのカーネルプログラミングに慣れてきたら、さらに興味のある人はモノリシックカーネルでないアーキテクチャのカーネルをハックしてみるのも面白いかもしれません。モノリシック以外にどんな設計があるのか、OSの理論や実装方法をしっかり俯瞰してみたい方にはお馴染みタネンバウム本をおすすめします。Edition邦訳は3版までしか無いのですが、原書だと4版があり仮想化やセキュリティなど結構ナウいテーマまで触れているようです。仮想マシンモニター(Hypervisor)本節では仮想化技術、ハイパーバイザ、エミュレータといったシステムの自作、ハック方法について述べます。仮想化技術といえばまずクラウドや分散システムの話から始めるのが定石なのかもしれませんが、しかしクラウドのようなバカでかいコンピュータリソースを前提としたシステムを個人でハックするのは現実味がなさすぎます。なく、もっと手軽に楽しめる仮想化技術の使い方を例に挙げてみます。一つはエミュレータ開発です。世の中にはゲーム機や端末のエミュレータも多く存在します。エミュレータを作るなら普段使い慣れたintelチップセット,PCI,ISA,IDEみたいなアーキテクチャでなく(ちょっと古い?)、もっと変わったアーキテクチャの物を作って見ると良いかもしれないです。フルスクラッチで自作するのも良いですし、QEMUやBochsに手を入れても良いでしょう。xqemuというプロジェクトはQEMUをベースに開発されたXBoxエミュレータです。Xboxhttp://xqemu.com/後はlibretroとかも見てみるとあまりの凄さに衝撃を受けるはずです。RetroArch(ただし当然ですが法律には触れないように気をつけてください。エミュレータ開発自体は基本的に合法ですが、他のプロセスで法にひっかかる場合もあります)後は、KVMやXenといったハイパーバイザのハック、自作ですがこれについては趣味を通り越して少し学術寄りな目的になることが多いためここでは詳しくは述べません。X上で動かしているみたいです。興味のある方はぜひ調べてみてください。エミュレータやハイパーバイザのハック、自作の始め方ですが、まずは以下の資料を読むことを強くおすすめします。「ハイパーバイザの作り方」syuu1228.github.ioVT-xの仕様から、実際のハイパーバイザ(bhyve)の実装まで網羅的に触れられており、仮想化技術の基礎を効率的に学べます。基礎を学んだら後は実際にエミュやハイパーバイザをハック,自作してみましょう。この辺は本当に参考書籍が少なく、基本的にはネットの情報に頼るしかありません。最後の方にgdbシミュレータを解析,改造している所があってエミュレータの基本構造を学ぶ事ができます。いった断片的な情報やネットの記事を頼りに簡単なエミュレータを自作できたら、今度はQEMUやKVM,Xenをハックしてみると面白いです。QEMUとKVMの実装に関しては以下の記事をおすすめします。internals)」rkx1209.hatenablog.comXenに関しては公式のドキュメントとソースコードを読み解いてハックするぐらいしか私は知りません。internals)みたいな記事も書こうとは思ってますが、少し先になると思います)洋書だと一応Xenのコード解説書籍はあります。2007年出版というのもあって結構内容は古いそうです。コンパイラ,言語ランタイム本節はコンパイラ,言語ランタイムの自作,ハックについてです。コンパイラと言うと、オレオレ言語を作って動かすというのもロマンがあって楽しいですが、本節ではどちらかというとコード生成やリンクといったいわゆるバックエンド部分を中心に述べます。SDKやプロプラリンカをそれらに移植し、ゲーム機のアーキテクチャにチューニングされたバックエンドを開発したと言われています。Conferenceで実際にSCEの人が話している発表などを見てみると分かります。)新しいハードを作れば、当然そのアーキテクチャに適したコンパイラツールチェーンを開発する必要があるわけです。各社のコンパイラへの取り組み方や実装例は、サムスンの人達による以下の資料を見るとわかりやすいです。today?"http://llvm.org/devmtg/2016-01/slides/fosdem-2016-llvm.pdfまあこういったツールチェーン移植の魅力としては、やはり普段当たり前のように使っているgccやclangが、独自のハード上で動く圧巻の光景ではないでしょうか。自作ハード用にコンパイラを移植してみたりするとその感動を味わえるかと思います。(正直私はまだ独自ハード用のコンパイラ移植はやった事がないのですが、他の人から聞いた話では非常に達成感があるとの事でした)さて、ではまず簡単なコンパイラやインタプリタを自作してみましょう。それには以下がおすすめです。コンパイラ技術によるテキスト処理から言語実装まで」books.google.co.jpこの本は主にコンパイラの構文解析やAST生成に焦点をあてており、コンパイラのフロントエンドを知るには非常に良い書籍です。実際にコンパイラを作るとなると、肝心のバックエンド(主にコード生成)が必要になってきますが、それには以下を参照すると良いと思います。原理・技法・ツール」books.google.co.jp通称ドラゴンブックと呼ばれるこの本は、コンパイラのフロントからバックまで網羅的に、時には擬似コードを示しながら説明してくれます。「最新コンパイラ構成技法」books.google.co.jpまたこちらのタイガーブックもおすすめですが、少し理論よりなのとMLによる実装を中心としているため、興味があれば見てみれば良いのかなと。他のジャンルでも役立てられると思います。ブラウザの実装に興味がある人などにもGCは必須です。コンパイラのハックにおいて欠かせないのがLLVMです。バイナリ中の命令トレース,フックやメモリ保護などにも利用でき、非常に柔軟な代物です。LLVMの概要、使い方については以下を見ると良いでしょう。「きつねさんでもわかるLLVM」tatsu-zine.comまたLLVMのコード自体をハックしてみたい方は、以下のノートを読んで見るのをおすすめします。Notesそれからコンパイラだけでなくリンカやオブジェクトファイルの仕組みを学ぶ必要が出てくる場合もあるかもしれません。いう時は坂井先生のリンカローダ本がとても参考になります。実行ファイルを作成するために必須の技術」books.google.co.jp標準ライブラリなどのランタイムを移植や改造をする必要が出てきた場合は坂井先生のこちらの書籍もおすすめです。本節ではCPU,周辺機器の設計について"少しだけ"述べます。(少しだけというのは私自身このジャンルは最近ようやく手をつけ始めた程度なので、良さそうな資料をちょろっと紹介する程度で....)既存のチップセットやCPUに関しては、それぞれベンダーの仕様書を見れば良いのですが、一度ぐらい自分でハードも設計してみたいと思った方には、以下がおすすめです。「コンピュータの構成と設計」books.google.co.jpいわゆるパタヘネ本です。パイプライン構造のふつーのCPUに関してはこの本で充分勉強できます。コンピュータのしくみ」www.shuwasystem.co.jp実際にHDLをガリガリ書いてCPUを設計したり、その上にコンパイラ移植したりする書籍です。自作CPUを考えている方にはおすすめです。定量的アプローチ」books.google.co.jpいわゆるヘネパタ本で、(私も途中までしか読めてませんが)、よりガッツリCPUアーキテクチャを学びたい方向けらしいです。慣れてきたらさて、全体的に(もしくは局所的にでも良いのですが)基礎が固まってくると、システムプログラミングはさらに面白くなってくる(はずです)。実は世の中には意外とハックできるネタというのがたくさん転がっていて、それに気づき始めるともう沼から抜けられなくなります。Phoronix....)や、有名なハッカー達のSNS、研究論文、ML等から得られます。して得た情報を元に、自分はそれらにどのように貢献できるかもしくは新たなハックを生み出せるかを考え、実際に手を動かし、完成した暁には彼らにコンタクト(パッチ,メール...)を取ってみたりするわけです。なってくれば毎日がハック漬けの非常に刺激的な日々をおくれるでしょう。今言ったような野良ハッカー(?)的な楽しみ方も良いでしょうし、何らかのジャンルのエキスパートとして研究者を志す人達もいるみたいです。マルウェア解析だったり、分散システムだったり、データベースだったりネットワークだったりとそのジャンルは多種多様です。目次へ戻るざっとこんな感じです。急ぎ足で書いたので若干文章構成がおかしかったりするかもしれませんがゆるして。結局長々と書き連ねましたが、とにかく自分のその時やりたいと思った事をどんどん進めていくのが良いと思います。その際、本記事が学習の手助けになれば幸いです。カーネルエクスプロイト入門記事part2です。)月別アーカイブはてなブログをはじめよう!RKX1209さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。