coursera で The Hardware/Software Interface を受けた感想です.
目的
組込みソフトの知識を身につけるため
私はいちおう組込みエンジニアなのだが, 組込みソフトの知識がない.
すごく, そのことに危機感を感じている. 組込みソフトの知識は, 実際に業務で取り組まないと身につける機会が少ない.
しかし, 仕事ではいつまで待っていても新しいプロジェクトには移動できな い.仕事を通して知識を身につけようなんて思っていたら, 10 年経っても身 につかない気がする.
メモリ管理・プロセス管理・アセンブラ言語などなど, このあたりの知識がほしい.
アセンブラ言語の知識を身につけるため
この講座では, アセンブラ言語についても学ぶことができる.
職場でも, アセンブラ言語を利用しているという話はたまにきくので, 学んでいれば, 新しい業務にもつながることを期待.
感想
C 言語のことをなにもボクは知らなかった
一番感じたことは, 自分は C 言語のことについて理解したつもりになってい たが, それはまだまだ不十分だったということだ.
たとえば, この講義では, malloc, free の原理について解説される. そして, malloc, free を自分で実装するような課題が出される.
ヒープ領域, スタック領域がどういう役割していて, それぞれどういうようにプログラムでは利用されているか, 自分は理解していなかった. それなのに, C 言語なんて全部わかったよ! なんて思っていた自分が恥ずかしい.
まるでそれはインセプション!
課題がどれも難しく, 毎週 10 時間以上かかった. しかし, 今まで受けてきた MOOC の課題の中ではもっともおもしろかった.
そのなかでもとくにおもしろかったのは, バッファオーバーフローについての課題.
与えられたプログラムのセキュリティホールに対して バッファオーバーフローアタックを仕掛けて, まったく関係ない関数を実行したり, さらにはセキュリティホールから自分で書いたアセンブラコードを注入し て実行させたりする.
それはまるで, 映画"インセプション" のような興奮だ!
映画では, ディカプリオが他人の夢の中に侵入して,思い通りの記憶を埋め込む. そして私は, 他人のプログラムのなかに侵入して, 思い通りのコードを埋め込む.
ハッカーはこの快感をもとめて悪さをするのだろう.
内容
シラバスからそのまま引用.
Topics:
Number representation
Assembly language
Basics of C
Memory management
Operating-system process model
High-level machine architecture
Memory hierarchy
Implementation of high-level languages
Number representation
ビット演算について学ぶ.
まず, 驚いたことは, if や while のような制御文は ビット演算でかけてしまうということだ.
C 言語なんて楽勝でしょと思っていたら, しょっぱなから出鼻を折られるという..
また, コンピュータは 0 と 1 の世界で, プログラミング言語はそれを置き換 えたものに過ぎないという, 基本的なことを気づかされる.
Assembly language
x86-64 アセンブリ言語の文法を学ぶ. 意外にネットや書籍での情報が多く, 参考になった.
-
この本も読んだ.
昔のテレビゲームは, アセンブラ言語でかかれていたときく. こんな世界でガリガリコーディングをするなんて, すごいな.
Memory management
メモリがどのように利用されているかのお話.
プログラムがどうやって動いているのかをアセンブラレベルで理解して, 今までなにもわかっていなかったんだと自覚. とともに, 仕組みが分かって感動.
2^n-1
|---------------------|
| Stacks | ローカル変数, プロシージャの内容
| |
| Dynamic Data (Heap) | new や malloc で獲得できる領域
| Static Data | グローバル変数など.
| Literals | 文字列
| Instructions | プログラム. 関数
|---------------------|
0
Memory hierarchy
キャッシュアーキテクチャとその制御アルゴリズム, 仮想メモリについて. C 言語通じて, コンピュータアーキテクチャも学べる.
| registers | |
| L1 Cache | SRAM |
| L2 Cache | SRAM |
| Memory | DRAM |
| local 2nd storage | local disks |
| remote 2nd storage | Web Servers |
私は, ストレージ屋だ. (そしてもうやめたい) キャッシュ技術を学ぶと, ストレージを支える技術というものは, かなりの部分がキャッシュが関わっているのだと思った.
- Disk の性能をあげるためには?
- ホスト I/O の性能をあげるためには?
とりあえず, 特許でこまったらキャッシュを思い出す. 講義でも, CS の世界での問題解決の常套手段が関節参照だ! と力説してた.
これから
今までセキュアコーディングなんてまったく意識したことがなかった. 無知のまま脆弱性をプログラムに仕込んでしまうことは恐ろしいと思った. もうすこし, セキュアコーディングについて学んでおこうと思った.
アセンブリ言語はこれ以上は深堀りしなくていいかな. . . なんとなくだけれども, プログラムの仕組みが理解できたし, あまりおもしろいものではないので.