JUNのブログ

JUNのブログ

活動記録や技術メモ

【書評】x86本を読んだ

x86本, 正確には 「自作エミュレータで学ぶx86アーキテクチャ コンピュータが動く仕組みを徹底理解!」を読んだのでそれの感想を書きます.

また, この本の想定環境はWindowsですが, 自分はLinux環境なので, Linux環境で実行する際に気をつけるべきポイントも書きました.

ちなみに, 書評を書くのはこれが初めてなので文章が多分下手くそです. 保険を掛けていく

各章の感想

Chapter 1 C言語アセンブリ言語

この本の最初となる第1章では C言語機械語, アセンブリ言語 の関連性や特徴についての説明されています.

また, アセンブリ言語の基本命令, 2進数, 16進数, アセンブル, ディスアセンブル(逆アセンブル)のやり方などのこの後の章を読む上でベースとなる要素を解説してくれます.

基本的にこの本はわからないことがあっても読み進めていくうちにわかるようになることがあるので, わからないところがあっても基本的にはそのまま読み進めれば良いのですが, 2進数と16進数だけは出来ると出来ないではこの後の章での理解度が変わってきますので必ず理解するべきだと思います.

Chapter 2 ポインタとアセンブリ言語

この章から本格的に CPUとメモリ, ポインタ について解説が入り, そしてエミュレータ作成が始まります.

前半はレジスタやメモリの解説, 後半ではポインタの復習とプログラムを実行する上でのポインタの役割などについて説明してくれます.

CPUとメモリ, ポインタの関係性がよく理解出来ました. また, 初めてエミュレータを使いバイナリファイルを動かした時には少し感動しました.

Chapter 3 CPUがプログラムを実行する仕組み

この章では章のタイトルにもあるとおり, 今まで学んできた ポインタやアセンブリ, CPU, メモリ, etc... などの各要素が1つに集まり実際にプログラムを構築し, 実行するのが理解出来る最高に興奮する章です.

3章内にある "3.3 プログラムの実行" というセクションでは x86アーキテクチャの代表的なCPU i386を対象に各レジスタの説明と, 演算処理, メモリと補助記憶装置のCPU側から見た違い, 機械語命令の構成など盛り沢山で大変読み応えがあり, 私が一番好きなセクションでもあります.

あと, "3.6 call命令とスタック", "3.9 フラグレジスタと条件分岐命令" もとても興奮しました. 各セクションごとに感想を書くと切りがないので書きませんが, きっと読めば解ると思います.

この3章は1,2章で学んできた知識がつながる一番楽しい章だと個人的には思います. この章を読み終わる頃にはC言語コンパイルしバイナリファイルを生成し, そのバイナリファイルがどのようにCPUやメモリなどを使い動いているかがイメージ出来るようになっていると思います.

Chapter 4 BIOSの仕組みと実装

この章では BIOS の文字表示機能を実際にエミュレータに組み込み, アセンブリでソフトウエア割り込みを使ってBIOSの機能を呼び出し任意の文字列を出力するコードを作成し, 実際にそれを動かします. また, HDDやUSBなどの記憶媒体の記憶方式について解説し, 実際にUSBメモリのPBRを実際に見て, その後アセンブリ言語プログラムをPBRとして認識されるように作り 実機で動かします.

この章でパソコンの電源を押した瞬間からOS起動までの流れをつかむことが出来ました.

また, 割り込み処理の部分は 「なるほど,うまく出来てるなぁ〜」と感心しました.

全体を通しての感想

自分はアセンブリもCPUの各レジスタもなんもわからないレベルから プログラムが実行される際のCPUとメモリの動きや, ポインタの重要性を理解し, アセンブリも読めて, 少し書けるくらいになりました..
初めて低レイヤーに触ったのですが, 特に辛い思いをせず, 楽しく学べました. 私はこの本で初めて低レイヤーについて学びましたが, 読み終わった今では読む前よりも 低レイヤーに学びたい という気持ちが強まりました. そういう意味でも, 低レイヤーに興味がある人が初めて読むのにとても良いと思いました.
読み進めていくうちに各要素が繋がっていき, 段々理解出来るはやはり楽しかったです.

本自体も200ページ弱で, 大変読みやすいと思います. また, 図やソースコードが豊富であり, 各要素についての説明も丁寧に細かく書いてあるのでC言語の入門が終わってる人なら誰でも楽しめると思います.

LInux環境で実行する際の注意点

ここからは本の感想から少し離れて Linux環境で実行する際に注意した方がいいところをいくつか挙げます.

インストールするソフトウェア

NASM

$ sudo apt install nasm

この記事がいい感じにまとまってます. : Linuxでx86アセンブラ(道具編)

gcc

以下の記事見てください. linuxize.com

変更が必要な書籍の中で実行しているコマンド

いくつかのプログラムにて, make が上手くが上手く行きません. 原因は Windows 用に Makefile が作られており, その中でコマンドツールの指定の仕方が Windows 仕様だからです.

書籍内の多くの Makefile はさほど複雑なことはしていないので, make に失敗したら自分で Makefie を少しイジるか, 自分で gcc などを使ってコンパイルすればいいと思います.

3.7

p115のアセンブラとcのオブジェクトファイルを作成しリンクして実行ファイルを作るところ

$ nasm -f elf32 crt0.asm
$ gcc -c -nostdlib -fno-asynchronous-unwind-tables -m32 -fno-pie -g -o test.o test.c
$ ld --entry=start --oformat=binary -m elf_i386 -Ttext 0x7c00 -o test.bin crt0.o test.o

次の記事を参考にしました. ldコマンドの説明

4.5

このセクションでは dd コマンドと boots という著者が作成したツールを使い USBメモリのPBRを見たり書き込んだりします.

dd コマンドについては Linux に標準で搭載されているので良いのですが, boots の方が自分の環境では依存しているライブラリのインストールが出来ずに失敗しました.

誰か出来た人おしえてください.

完走した感想 (おまけ)

完走した感想ですが, 最後の章のUSBのPBRを見る部分が出来なかったのが少し心残りです. 誰かLinux環境で動かせた人はコメントか何かで教えてください.

ここ最近は流行りの技術を追いかけるのではなく, コンピュータサイエンスをしっかりやろうと思っており, その第一歩として低レイヤーに触り始めました.
低レイヤーに関してはこの本が本当に初めてで, ちゃんと読めるか少し不安でしたが, しっかり読めました. いきなり激ムズな本だと心が折れますからね.

今日においては 別に低レイヤーをやらなくても高級言語やライブラリを触るだけでプログラムは書けてしまうのですが, やはり低レイヤーをブラックボックスとして意識せずにコードを書くのと, ある程度理解してコードを書くのとではやっぱり違ってくると思います.

今回で低レイヤーのCPUでの演算や機械語の実行方法などがわかったわけですが, 実はまだ少しモヤっとしていて, それは CPUがなぜそのような動きをするのかがわからない ということです.
勿論今回の書籍で扱っているx86を始めとしたCPUアーキテクチャで決められているからというのはわかっていますが, そうではなく, CPUを回路レベルで知りたいのです.

ということで次はこの本をやります(予定)

CPUの創りかた

CPUの創りかた

この本も読み終わったら書評を書きたいと思っていますが, この本に関しては本で知識を得るだけではなく 実際にCPUを自ら作成するところまでやりたいと思っています. だいぶ時間が掛かりそうですね.



書評を完走した感想ですが, いかんせん日本語が下手くそですね. 小学生の頃に書いた作文の方が日本語上手い気がします. Twitterでオタク構文ばっかり使ってるからですかね.
あと, 本と書籍の2つのワードが混在しているのでどちらかに揃えたい気はします.

あと, 多分自分がこれから書く書評は良い本についてしか書かないと思います. (つまらない本は途中で私が飽きて読まなくなるため)

それでは次の記事でまたお会いしましょう. さよなら〜.