概要
本記事では「30日でできる!OS自作入門」を進めていくうちに気になった箇所、試していて躓いた箇所等をまとめる記事になります。
ちなみにわからないところはがんがんChat-GPT様に質問する気なので、間違っている点があればマサカリを投げていただけますととても喜びます。
書籍の詳細は省略いたしますので、気になられた方はぜひ書籍を購入してご自身でトライしてみてください!
今回は、Chapter1を消化していきます。
学び
Tips:書籍の進め方について
以降の章では違うのかも知れないですが、少なくともこの章では「とりあえず言われた通りやった。〇〇が何かはわかんないけど進もう」というノリで進めてもいいです。(※私は書籍中に突然出てきたDB命令
に仰天して理解するのに少し時間をかけてしまいましたが、章を進めていったら説明が書いてありました 泣)
バイナリエディタとエンコードについて
私は以前にも紹介した通り、バイナリエディタとしてVSCodeの拡張機能HEX Editorを利用しています。
そんな中でバイナリのコピペを行う際に混乱した内容があり、それをステップバイステップで紐解くことで理解できました。忘れやすそうな内容ですので一度まとめようかと思います。
何に迷ったか
HEX Editorのペースト機能を利用すると以下のような選択肢を出してくれます。
私がこれまでコーディング等で使用していたテキストエディタではこのような選択肢は出てこなかったためビビりました。
まずは単語の整理
詳細なところは調べる気力がないので大雑把にまとめます。(文字コード警察さんに叱られない程度でまとめます)
その単語が大きくどこに属する単語なのかを調べるとそれぞれ属する領域が少し違うようです。
- UTF-8:文字エンコーディングに属する。エンコードした文字列は下記のBase64とは違う管理方法でなのでバイナリエディタ上でコピーした内容をUTF-8のオプションを選択した状態で貼り付けると別の文字に変換して貼り付けられます。(詳細は後述)
- Base64:これは文字に限らない画像等のバイナリデータをテキストにエンコーディングする際に用いられます。画像云々に関しては#2でさらっとまとめてあるので、なんで急に画像云々が出てきたんだと感じられた方はご確認ください。
- Hex:これはおそらくですが、コピーした内容をバイナリデータのままであるという体でそのまま信じて貼り付けてくれる方法かと想像しています。一応Base64の貼り付けと見た目は同じ(Base64がテキストエンコーディングしてくれる人という認識なのでそりゃそうだなという感じ)ですが、終始バイナリデータだと思っているかどうかといった点がBase64のオプションを選択したときとの違いとなりそうです。
ということで、今後わたくしが利用するのはHexのオプション+場合によって貼り付けモードを切り替え
になりそうです。
UTF-8のオプションを選択して貼り付けると違う文字になるのはなんでなんだ
ここまで読んでいて気になるのは「なんでUTF-8を選んで貼り付けると文字が変わるんだ」というところだと思います。ここに関してはChatGPTさんがきれいにまとめてくれていたので、それをまず示して裏どりを行うことにしようと思います。
Q.Hex Editorのバイナリ文字列00をコピーしてUTF-8形式で貼り付けした際に41 41 3D 3Dになったのですが、なぜですか?
A. HEXエディタで「00」の部分をコピーして、UTF-8形式で貼り付けた際に「41413D3D」と表示された理由は、「00」というバイナリデータが文字列の形式に変換される過程でエンコードされた結果です。以下に、そのメカニズムを説明します。
多くのエディタはバイナリデータを扱えないため、内部的にBase64のようなエンコード方式で「00」をエンコードして文字列化します。ここで、バイナリ「00」をBase64でエンコードすると「AA==」となり、これがテキスト形式の「41413D3D」へと変換されている可能性があります。
変換の流れをまとめると:
「00」(バイナリ)→ Base64エンコード → 「AA==」
「AA==」をUTF-8だと仮定してバイト列にする → 「41413D3D」
なるほど、内部的にテキストエディタが「00」をテキストだと認識してコピーしたものを「UTF-8形式の情報だ」と言われたと判断してバイト列変換してくれたからこのようなことが起こったみたいですね。
「00」(バイナリ)→ Base64エンコード → 「AA==」
この部分は以下のサイトでどのようなエンコードが行われているか確認してみることとしましょう。
https://tool.hiofd.com/ja/hex-convert-base64-online/#google_vignette
確かに。00はAA==と認識していますね。何が起きているか調べてみたところ、以下のようなことが起きていそうです。*1
- まず、Base64のルールとして文字列を3バイト(=24ビット)ずつに区切る(区切ったものを6ビットずつに分けて変換するらしい)
- 00は00000000(0が8個)に変換される。これを6ビットずつに区切り変換したい。が、8ビット-最初の6ビット=残り2ビットなので6ビット区切りとするにはビット数が足りない。
- データが最初の1オクテット(8ビット)のみ場合は最初の6ビット分はそのまま利用し、次の2ビットには0でパディングした値を用いるので00は000000となる
- とりあえずこれで変換できるので「000000→A」の変換を行う。Base64のルールとして(変換前データを含まない)パディング部分は一般的に=でパディングする
- 00がAA==に変身した!!
Base64でエンコード済みの「AA==」をUTF-8だと思い込んでバイト列に直して貼り付ける
まずはサイト上で本当に「41413D3D」に変換されるのか試してみましょう。
https://www.edu.i.hosei.ac.jp/~sigesada/kyouzai/mojicodehenkan.html
...しっかりと変換されていそうですね。順番に理解しましょう。
- AA==に変換された文字列はBase64だと00を表現する。が、UTF-8だとそうではない
- UTF-8の対応表でそれぞれの変換を確認
- Aは40の行の+1の列にいるので41
- =は30の行の+D列にいるので3D
- それを組み合わせると、AA==が41413D3Dとなる
以上となります。何が起きたかお伝え出来ていると嬉しいです。
アセンブラについて
アセンブラとアセンブリって何が違う
誤用すると叱られそうなので違いを理解しておきましょう。
- アセンブリ:言語のほうです。理解させようとしている対象は人間です。
- アセンブラ:プログラミング言語を機械語に翻訳してくれる、命令と機械語の間にいる人だそうです。ちなみに翻訳させることをアセンブルするというらしい。
なのでこの章で出てくるDB
だのRESB
は厳密にはアセンブリで書く命令のほうですね。
アセンブラ体験!!と言っていきなりアセンブリを書かせられるので少し混乱してしまいそうになりますが、ここで筆者の方が言いたいのは「naskっていうアセンブラを作ったよ!!アセンブリのサンプル置いておくから使ってみて!!」って感じかなと想像するといいかなと思います。
苦戦したところ
バイナリを全部手入力するという苦行
もちろんコピペを使いましたが、めちゃくちゃ苦労しました。何回か心が折れました。
ですが、やっていると収穫もありました。(Hex Editorの使い方にちょっとだけ詳しくなっただけですが...)
ということで、Hex Editorで知っておかないと作業がしんどくなるちょっとしたTipsを紹介しておきます。
置換↔挿入の切り替え
気づけばワンボタンなんですが、気づかずに序盤めっちゃ慎重にタイピングしてました。
- Hex Editorの画面を開く
- 右下の「挿入」となっているところをクリック
で完了です。ショートカットは見つけられなかった...
コピペの方法
こちらでまとめましたが、バイナリエディタ状態でペーストを選択する際には選択肢が出てきてくれます。状況によって使い分ける必要がありそうではありますが、この章での「00をひたすらコピペしていってね」的な指示を全うすることに関してだけ達成するのであれば、以下の選択肢でOKです。
- 貼り付け:Hexを選択
- 貼り付けモード:挿入を選択
まとめ
今回の章では実際に手を動かすところが出てきましたね。また、作業的にもいきなりハードモードな内容がありましたが、手を動かせるのはやっぱりうれしいです。
その外にもHex Editor周りで勉強したりで時間がかかりはしましたが、書籍的にはフレンドリーな文体が続くので今後も自分のやる気と相談しながら進めていきます。
この記事が少しでもいいなと感じていただけたら、ぜひいいね等よろしくお願いいたします。
*1:RFC4686 https://tex2e.github.io/rfc-translater/html/rfc4648.html
ピックアップ単語
※書籍の中で「聞かれてもしっかり説明できないな」という単語を個人的にまとめたものです。性格的に「とりあえずわからないでいいから進めるか」というタイプなので、気が向いたタイミングでいずれ個別で記事にするかもしれません。この記事ではメモ+何がわからないといった備忘録程度のことのみ書きます。
- 今回は省略します