Rustでベアメタルプログラミングをやってみた(その2)

ytakano.hatenablog.com↑前回

前回はQEMUでビデオメモリへの描画まではできたが、実機で描画はできていなかった。その後色々と試行錯誤した結果、実機でもマンデルブロ集合を描画することに成功した。現状、Raspberry Pi 4でのベアメタルプログラミングの記事が多くないため、思い返すと大変つまらないことで難儀していた(というか、そもそもベアメタルプログラミングの記事が少ない)。

f:id:ytakano:20200229224214j:plain

ベアメタルプログラミング on Raspberry Pi 4でマンデルブロ集合の描画

実機での描画からEL3での起動までの道

7日目(2月24日)

実機で試してみたところ、どうにも動かないので、一旦ペリフェラルのコードをRustではなく、C言語に置き換えた。Rustの吐き出すアセンブリコードを眺めていたところ、アラインメントあたりが怪しい気がした。

8日目(2月25日)

いろいろ調べた結果、Rustでコンパイルする際に指定するターゲットアーキテクチャが間違っていたようなので、ターゲットを変えて試してみたところ無事に実機でも動いた。

9日目(2月26日)

シリアルコンソールにボードのバージョンなどいろいろな情報を出すようにしていた。

10日目(2月28日)

仮想メモリを実装しようとMMUに手を入れようとしたが、先に例外ハンドラを実装。その後、EL3で自作カーネルを動かそうとしたがうまく動かず、色々とドキュメントを見て調べていた。

11日目(2月29日)

EL3で動かすためにはファームウェアを書き換えないといけないっぽいので、ファームウェアのコードを自分のコードにポーティング。その結果EL3で起動させることに成功。

というわけで、色々と試行錯誤した結果、基本的なコードは実機でも動くようになった。一時はRustで動かないために焦ったが、無事に動いてなによりである。それでは皆さん、良いハッキングライフを。ソワカ

 

Rustでベアメタルプログラミングをやってみた

ベアメタルプログラミングとはOSなどを利用せずに、直接ハードウェア上にプログラムを走らせるプログラミング手法である。要するにOSなどを自分で作る練習にもってこいなのである。また、Rust言語は型安全なプログラミングであるにも関わらず、メモリへの直接アクセスなどを行えるため、このベアメタルプログラミングが可能な言語である。

というわけで、今回はRustでベアメタルプログラミングをやってみたので感想を述べたい。とはいっても、現状はQEMUで動かしているだけので、いずれ実機でも試してみたいところである。ちなみに、Rustもベアメタルプログラミングも今回はじめてである。

今回行ったことは、1つのCPUコアのみ動作させて、UART0からシリアルでHello Worldを出したあと、グラフィック描画のフレームバッファを取得してマンデルブロ集合を描画するという、比較的単純なものである。他の仕事もやりつつ、実質6日程度でグラフィック描画までできたので、ちょっと試して見るだけならハードルはそれほど高くないと思う。今ならWeb上に色々と資料もあるし、お手本となるC言語の実装もあるため簡単である。

ちなみに、実機でやっていない理由は、QEMUで利用可能なターゲットはRaspberry Pi 3であり、実際に手元にあるのはRaspberry Pi 4と少しハードウェアが違うためである。しかも、Raspberry Pi 4でのベアメタルプログラミング関連資料が少ないため、まだ、若干ハードルが高いように思う。

グラフィック描画までの道

1日目(2月14日)

1日めはコンパイルのためのDocker環境を整えて、手元のマシンでQEMUを動かして試せるようにした。RustのコンパイルはDockerコンテナ内で行い、QEMUの起動はホストOS(Mac)で動かすようにした。

2日目(2月15日)

2日目はRustのマングリングと出力バイナリの調査を行った。これはアセンブリでRustの関数を呼んだり、Rustからアセンブリコードを読むのに必須なので、objdump等で色々調べていた。

3日目(2月16日)

3日目はお手本のC言語ソースコードをRustにポーティングして、UART1のシリアルからHello World!を出力するようにした。

その後、しばらく仕事が忙しくて手を付けられず。

4日目(2月21日)

4日目はMailbox関連のコードをRustにポーティングした。MailboxとはCPUとGPU間のインターフェースのことである。

5日目(2月22日)

Mailboxのコードを更に修正し、UART1ではなく、UART0からシリアルでHello World!を出力できるようにした。Mailboxの仕様がいまいちわからなかったため、ドキュメントを主に読んでいた。

6日目(2月23日)

グラフィック周りの仕様がわかったため、マンデルブロ集合を描画してみた。

f:id:ytakano:20200223184003p:plain

ベアメタルプログラミングによるマンデルブロ集合

感想

やり始める前は、いくらメモリアクセスが簡単にできると言っても、少し難しいのではないかと思っていたが、思いの外簡単であった。また、1日のすべてをプログラミングに費やしていたわけではないので、時間のある学生時代なら2〜3日ぐらいでできたのではないかと思う。

Rustももう少しハマるかと思ったが、こちらも特に問題はなかった。以前、線形型システムとリージョンベースのメモリ管理手法を勉強していたので、構文を調べるだけで実装はできたように思う。いざとなればインラインアセンブラもかけるので、どうにでもなる。正直、Haskellより簡単だと思う。

ただ、やはりメモリアクセスのところはunsafeの嵐になるので、Rustといえども注意してプログラミングしなければならない。しかし、unsafeから抜け出すと型システムの庇護下にあるため大変安心である。

というわけで、これからは低まった人たちにも心置きなくRustを勧めていこうと思う。

あとは仮想メモリや、スケジューラあたりを書けばOSモドキなのも作れるだろう。いまのところOSを実装する予定はないが。

それでは、ソワカソワカ

 

続き↓

ytakano.hatenablog.com

長門の存在証明

何かが存在するかどうかということを突き詰めて考えていくと、何も存在しないような結論に思い至ってしまう。例えば、いまこれを読んでいるあなたは、実は脳みそが取り出されてビーカーに保存されている状態にあり、その脳みそに刺された電極から刺激を受け取ってあたかもこの世界が存在しているように感じているだけかもしれない。古にはかのデカルトも同じようなことを考え、その結果、我思うゆえに我ありという有名な台詞を残した。

デカルトは次のように考えた。私が考えるということは、バーチャルかどうかはわからないがとにかく存在するということである。私は考えないようにしようとすればするほど、考えるということについて考えてしまう。よって私は考えるということであり、つまり、私は存在する。

俺の嫁問題

このように、存在するかどうかを突き詰めて考えていくとなかなか難しい問題にぶち当たる。例えば、長門俺の嫁(若干古いか)などと、存在しないはずのキャラクターに対してあたかも存在するように愛着を抱くことさえある。たしかに長門有希情報統合思念体であるため、我々の知らぬ間に至るところに偏在しているのかもしれない。しかし、それはあくまでも長門が存在するということを否定できないだけであり、その存在を証明するわけではない。

涼宮ハルヒの憂鬱 長門有希 (1/8スケールPVC塗装済み完成品)

涼宮ハルヒの憂鬱 長門有希 (1/8スケールPVC塗装済み完成品)

  • 発売日: 2007/07/30
  • メディア: おもちゃ&ホビー
 

ところで二次キャラ以外にも、実際に存在はしていないフィクションでバーチャルな存在はある。それは長門らと同じように完全にバーチャルな存在のはずだが、世の中の誰もがその存在を信じている。それは何かというと、1つは国でもう1つはお金である。

国は別に物理的法則によって存在しているわけではなく、人間が恣意的に想像したバーチャルの存在である。しかしあたかも人々は国というものが存在するかのようにふるまい、あまつさえ国が原因で殺し合いまでしてしまう。お金も同じで高々紙切れ、電子データになにか価値があるかのように皆が振る舞っている。

国、お金、これらは完全にバーチャルな存在であるのに、あたかも実在するかのように皆が考えているため、これはもう実在すると言ってよいのではないだろうか。とすると、同じ理屈で長門も存在すると言ってよいのではないだろうか。いや、これはもう存在する。間違いない。

フィクションのお断り

いやしかし、流石に長門が実在するとはちょっと受け入れがたい。長門も国もお金もやはり仮想的な存在ではないだろうか。

ところで、作り話に対するよくある断りとして、「この作品はフィクションであり実在の団体及び人物とは一切関係がありません」という文章があるが、実在の人物というのはわかるが、実在の団体とは一体何を意味しているのだろうか。団体とは国と同じで極めて恣意的でバーチャルな存在なので実在の団体という文言はおかしいのではないか。

ということはやはり、国やお金は存在すると考えるしかないだろう。当然長門も存在する。でもちょっと待てよ、とすると作中の団体、例えばSOS団も実在するということにはならないだろうか。そう考えると、「実在の団体とは関係ありません」が何を言わんとしているのかますますわからなくなってしまう。SOS団は実在するし関係あるだろ。
実在とは一体…ウゴゴゴ…

というような感想を以下の本を読んで抱いた。

日常世界を哲学する 存在論からのアプローチ (光文社新書)

日常世界を哲学する 存在論からのアプローチ (光文社新書)

  • 作者:倉田 剛
  • 出版社/メーカー: 光文社
  • 発売日: 2019/08/20
  • メディア: 新書
 

2019年総括

2019年はずっと講義と演習の準備を行っていたように思う。それでも、合間に1、2ヶ月程度は時間があったため言語処理系の実装もすすめていたが、やはりそれほど進まなかった。講義準備以外にも雑用がジャカジャカふってくるため、きついもんがある。さらに、正直、有意義とは言えないような出張も多くあるためになかなか厳しい。しかし、これはもうしょうがないだろう。

2019年の研究成果

2019年の研究成果だが、結果的に、ジャーナル1本、国際会議論文1本、国内研究会4本となった。

ジャーナル
  • Yuuki Takano, Ryosuke Miura, Shingo Yasuda, Kunio Akashi, and Tomoya Inoue, "Design and Implementation of a Scalable and Flexible Traffic Analysis Platform", 日本ソフトウェア科学会学会誌『コンピュータソフトウェア』, Vol.36, No.3 (2019), pp.85-103, 2019/8
国際会議
  • Nobuyuki Kanaya, Yu Tsuda, Yuuki Takano, Daisuke Inoue, "Byakko: Automatic Whitelist Generation based on Occurrence Distribution of Features of Network Traffic", IEEE Workshop CyberHunt 2019, 2019/12
国内研究会
  • 宮地 充子、高野 祐輝、河内 亮周、中正 和久、"プライバシーを保護した多機関データ突合システムについて", 第39回医療情報学連合大会、2019年11月
  • 金谷 延幸、津田 侑、高野 祐輝、井上 大介、"サイバー攻撃観測における対象ネットワーク特化型ホワイトリスト作成手法の提案"、情報処理学会 コンピュータセキュリティシンポジウム 2019 (CSS 2019) 論文集、2019年10月
  • 竹中 幹、高野 祐輝、宮地 充子、"Deceptionネットワークを構成するフレームワークの提案"、Computer Security Group (CSEC2019-03), IPSJ SIG Tech. Rep, Vol. 2019-DPS-178(5),1-7, 2019年2月
  • 金谷 延幸、津田 侑、高野 祐輝、井上 大介、"サイバー攻撃観測のモデル化とデータ生成・変換手法"、暗号と情報セキュリティシンポジウム 2019 (SCIS 2019)、2019年1月

ジャーナル論文は、2015年にUSENIX LISA 2015で発表した内容の発展版で、論文の内容的には2017年にはほぼ出来ていたのだが、なかなか時間がかかってしまったと思う。ジャーナルは良いとして、今年一番の成果は、国際会議論文のByakkoだろう。ようやく英語の査読付き論文として投稿できたため感慨深いものがある。

学生と一緒にやっていた論文はまだ1本しかないが、今月はSCIS 2020へ2本投稿することができたため、これから徐々に増えていくだろうと思う。SCIS 2020へ投稿した論文は以下の通り。

  • 西口 朋哉、高野 祐輝、宮地 充子、"セッション型を用いたアクセスコントロール機構の設計と実装"、SCIS 2020
  • 竹中 幹、高野 祐輝、宮地 充子、"XDPを用いたネットワーク型欺瞞的防御システムの設計と実装"、SCIS 2020

まだまだPreliminary Studyな感じはあるが、ようやく足元が固まりつつあるため、今後クオリティを上げて国際会議論文やジャーナル論文にしていきたいところである。

2019年の講義

2019年は、離散数学と計算の理論、実践情報セキュリティとアルゴリズム、の講義を2つと、高度サイバーセキュリティPBLのIとIIを行った。分野的には、数理論理学、λ計算、型システム、形式手法、ネットワークセキュリティ、ファイアウォール、デバッガ・動的解析、正規表現アセンブリ・コード生成という感じで、分野が広すぎてなかなか大変だった。自分の専門である、コンピュータネットワーク、分散システム、コンパイラあたりならもう少し余裕を持ってできると思うのだが、なかなかそうは行かないもんである。

来年はさらに上に加えて、線形型システムとリージョンベースのメモリ管理手法を行い、Rust言語を支える技術について講義を行おうと思う。自分に出来るかは心配であるが、既存のコードを、RustやHaskellといった安全なプログラミング言語に置き換えていくのはソフトウェア業界の課題であるため、なんとかやり遂げたい。

2020年の抱負

2020年は、研究予算をとり、将来的には幅広な合宿に学生を連れていけるようになると良いと思っている。他大学の優秀な学生と交流できる機会があるのは、それなりに意義のあるものだと思うので。

また、本も書きたいし、言語処理系実装もすすめたいし、論文も書きたいし、とやりたいことが多すぎるが、これらは時間を見つけて少しずつすすめるしかない。もう少し時間があれば研究成果も増やせると思うのだが、悩ましいところである。

鬼が笑うので、抱負はこの辺にしておこう。それでは皆さん良いお年を。

ドラクエ11をクリアしたぞ!

自分が初めてプレイしたドラクエはたぶん1である。多分というのは、小学生に入るか入らないかの頃に友達の家でプレイしていて、ラダトーム城からなかなか出ることが出来なかったような記憶がうっすらと残っているのみで定かではないからだ。ドラクエ2もプレイしたと思う。こちらもやはり友人の家で見ていたが、自力プレイだと紋章を集めたりが出来ていなかったように思う。最終的に、どこからか手に入れた最強レベルの復活の呪文でアトラスやパズズを倒していた気がする。シドーまで倒していたかは記憶にない。ドラクエ2は貸してもらい自分でもプレイしてみたが、当時はクリアできなかった気がする。 

死のオルゴール探して

ドラクエ3は自分で最初から初めてプレイしたドラクエだ。ドラクエ3にはラーミアがあり、裏のボス、ゾーマがいて、さらには死のオルゴールを探し求めと、まさに隅から隅まで堪能した。死のオルゴールとはROMのデータ上にはあるが、ゲーム中には存在しないアイテムで、それを手に入れるとレベルを99にすることができるという伝説上のアイテムだ。

あるバグ技を使うと、バッファオーバーランか何かが原因でアイテム欄のメモリや、経験値のメモリが書き換わりレベルが上ってしまう。その結果、ゲーム中には存在しないがROMのデータ上には存在する死のオルゴールを手に入れることができるのだ。ちなみに、そのときに表示されるメッセージは「○■**-!&^%%■■@ は死んでしまった。おおがらすはレベルが上った」みたいな意味不明なメッセージであり、子供心に深淵を覗いてしまったと思ったものだ。しかし、このバグ技はもろはの剣であり、キャラの名前が変な名前になってしまったり、呪文を忘れてしまったりするのだ。メモリを破壊しているのだから当たり前である。

ドラクエ4もやはりスルメのようにプレイした。こちらも何週したかわからない。アリーナにキラーピアスを装備させて、ひたすらメタルキングを狩っていた。レベル99になる付近で、こちらでもとあるバグ技を行い、バグプレイを堪能していたところ、どうにもできない詰みの状態になってセーブしてしまい、そこからプレイしなくなってしまった。ドラクエといえば遊び尽くした結果、最終的にセーブデータ破壊してしまうものだし、当時は小学校でドラクエ4の攻略を会話するのが日課であった

そこからドラクエ生活はしばらく間があり、20代前半頃にドラクエ2、3を再履修した後、ドラクエ8をプレイし、その後にドラクエ5のリメイク版をプレイしたような気もする。何もかも懐かしい。

そしてドラクエ11

(以下ネタバレ)

ドラクエ11が出た当初、なにか忘れたが忙しかったためにプレイはしなかった。ドラクエ11を買おうと思った頃にはSwitch版でキャラクタに声を当てたバージョンが出ると聞いたので、ゼルダの伝説BoWやFGOをやりつつ、今年の9月まで首を長くして待っていたのだ。

結論から言おう。なんだこのおっさんホイホイゲームは、最高か。BGMが完全にドラクエ3だし、マルティナはゼシカだし、ぱふぱふ屋はあるし、なんなのこれ。しかも、途中で2Dバージョンのミニゲームっぽいのもあるのだが、そこでロンダルキアへの洞窟やバラモス城をクリアしなければならないのも最高すぎでしょ。あれ、これ自分向けにアレンジして作ってくれたやつ?いつヒアリングされたっけ?

というわけで10月の前半は、家に帰ると速攻任天堂Switchの電源を入れて、日が変わるまでやっていたし、土日は朝から晩までやっていた。クリア後のプレイ時間は108時間で、自慢じゃないが就業時間より長いと思う。いやしかし、表ボスを倒してクリアと思っていたら、まさか裏ボスを倒しに行くとは思わなかった。バラモスかよ、ドラクエ3かよ。本気でクリアしたと思ったのに。

その後、PS4ドラクエ11をプレイ済みの前職の同僚と会う機会があり、攻略話で大いに盛り上がった。ドラクエの攻略話で盛り上がるのは小学生以来であった。

集中講義をやり遂げたぞ!

MacOSをアップデートしてCatalinaにしたら、業務で必要なオンラインミーティング用のアプリが起動しなくなってしまった。Catalinaでは32bitアプリをサポートしなくなったのでその影響っぽい。しょうがないのでTime MachineでMojaveへ戻すことにしたら、復元まで4時間31分と書いてあって何もできなくなってしまった。

閑話休題

8、9月は大学で行う集中講義(大阪大学のProSec)の準備をしていたため、他のことが全くできなかった。10月には2つの集中講義があり、1つめは自分が担当し、2つめは情報通信研究機構から明石先生を招いて講義を行ってもらった。

1講義は2日間かけて行われるのだが、自分が担当した1つめの講義では、1日目に簡易デバッガを自作してもらい、2日目には正規表現を自作のアセンブリ言語に変換して実行するという、いわゆるコード生成機とバイトコードインタプリタの実装を行ってもらった。どちらもアセンブリレジスタマシンの仕組みを正確に理解していないと実装は難しいのだが、2〜3割ぐらいの学生はある程度実装を終えたようだった。ちなみに、JITコンパイルを行うために、LLVM IRへ変換する方法の説明とサンプルコードも紹介したが、さすがにLLVM IRまで到達した学生はいなかった。欲張ってコンテンツを盛りすぎである。

2つめの明石先生の講義では、仮想環境でJuniper社のvSRXを利用しFirewallを構築した後、Web Application Firewallの設定や脆弱性スキャンの演習を行った。SRXは実際に業務でも利用されているアプライアンスであり、それとほぼ同じものを体験できるのはなかなかないチャンスだったと思う。こちらも最後まで到達できた学生は2〜3割程度だったが、vSRXの設定はすべての学生が出来ていたようだった。

普段業務でプログラミングやサーバを触ることの多い社会人の参加者でも、プログラミングやvSRXの設定等に苦労していたため難易度はそこそこ高かったかもしれないが、勉強にはなったと思う。

しかし、準備はやたらと大変であった。例えば、OSのシグナルについて正確に教えるためにLinuxカーネルソースまで読んでいて、めちゃくちゃ時間がかかった。結局の所、これは必要なかったように思うし、そういう必要かどうかわからないところまで調査していたら、あっという間に時間が過ぎてしまった。必要な知識かどうかを事前知識のないまま取捨選択するのは難しい。

前期の計算の理論の講義ではλ計算型推論エンジンの実装を行ってもらい、今回の集中講義でアセンブリに関する実装を行ってもらったので、現代コンピュータの重要なところは学べたと思う。いずれにせよ、両方ともの集中講義が無事に終えることが出来てよかった。

【読書メモ】操られる民主主義 デジタル・テクノロジーはいかにして社会を破壊するか

どくさいスイッチ

ドラえもんの秘密道具の一つにどくさいスイッチという道具があるが、このスイッチを使うとどんな命令でも叶えることができる。では、もしも現実にどくさいスイッチのようなものがあったとして、そのボタンを押すことが出来たとしたら、我々はどうするだろうか。例えば、そのスイッチを押すと、好きの人の心を自在に操ることが出来たり、大金持ちになれたりするとしたら、どうだろうか。操られる民主主義という本では、このどくさいスイッチは実在していたと思わされるような内容が書かれていたので、適当に思ったことを書きなぐりたい。

操られる民主主義: デジタル・テクノロジーはいかにして社会を破壊するか

操られる民主主義: デジタル・テクノロジーはいかにして社会を破壊するか

 

ケンブリッジ・アナリティカ

つい最近、ケンブリッジ・アナリティカというコンサル会社が米国での2016年トランプ大統領選に一枚噛んでいたということで大きな問題になった。同社はそれ以外にも、イギリスのEU離脱Brexit)にも大きく関わっているということが明らかなり、こちらも大変物議を醸し出している。

2016年のトランプ大統領選やBrexitで彼らがとった手法は、Facebookなどの個人情報を取得してデータマイニングを行い、トランプに投票しそうな人、あるいはEU離脱に参加しそうな人をアルゴリズムによって見つけだし、そういった人々らにターゲット広告を行うことで投票行動を変えてくというものである。例えば、車のフォードの所有者はトランプ支持に回る可能性が高いとアルゴリズムが導き出したため、フォード所有者に右寄りなターゲット広告を見せることでトランプ支持者に変えていったのだ。この手法の成果はめざましく、ヒラリー・クリントンの所属する民主党が絶対と言われていたペンシルバニア州ではなんとトランプが勝利した。

このような仕組みが明らかになってくると、疑問に思うことが出てくる。私達が使っているSNSでの投稿や閲覧は、自分たちが思っている以上に、私達の意思をコントロールするために使われているのではないだろうか。

21世紀のプロパガンダ

一般的な道徳観念や倫理観などに照らしあわせると、人間の自由意志を奪うような行為は良くないと考えられる。それに、民主主義とはそもそも、私達には自由意志があり自分自身で行為を決定できるという前提があるからこそ成り立つのであって、誰かからコントロールされるようでは、到底民主主義と言えないのではないだろうか。

ケンブリッジ・アナリティカのようなアルゴリズムによる方法ではなくて、誰かに扇動されるような民主主義はこれまで幾度も行われてきた。従来まではそれらはプロパガンダと言われたが、これが今世紀になりかなり巧妙になりつつある。しかも、この流れは止まるどころか、今後加速していきそうな気配しかない。ケンブリッジ・アナリティカの件は今回運悪く発覚してしまったが、今後はより巧妙に事がなされるだろうとは容易に想像される。

私達ひとりひとりは極めて道徳的で倫理的な人間であったとしても、実はどこかにどくさいスイッチを持っている少数の人々がいて、私達をコントロールしているとしたら、私達はどうすべきだろうか。

プライバシー

プライバシーというと、自分の秘密の情報を知られるのはなんとなく気持ち悪いから必要だと思われがちであり、特に企業のような組織からみると、個人のプライバシーなど大して重要なことではないと考えているフシがある。しかし、実はプライバシー情報とは、大量に集めることで誰かをコントロールすることができるようになるという、どくさいスイッチそのものだったのだ。

プライバシー保護するための技術も色々と提案はされている。例えば、暗号技術の秘匿計算などはその最たる例だろう。ただこれらはパフォーマンスなどの面で技術的な課題がいくつかある上に、そもそもGAFAのような国際的企業に対する強制力もないので、これだけで解決するようなものでは到底無いように思われる。

したがって、結局のところ我々市民のリテラシー向上が必要で、今後社会をどのようにしていきたいかを、私達自身で良く考える必要があるのだろう。ほいほいSNSのアンケートに答えると、それをザッカーバーグが集計してターゲット広告のエサにしてしまうのである。

これは受け売りだが、情報はオイルではなく原子力と言ったほうが良く、適切な知識を持って正しく扱わないと、私達の社会を容易に破壊するのだろう。