30日でできるOS自作入門【4日目】
概要
これはMozyの1人アドベントカレンダー 2018 の4日目の記事です。
書こうとした経緯は、こちら
今日の内容
- プログラム部分をどんどん書き換える
今日やったこと
ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ~中略~ ; プログラム本体 entry: MOV AX,0 ;レジスタ初期化 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msg putloop: MOV AL,[SI] ADD SI,1 ; SIに1を足す CMP AL,0 JE fin MOV AH,0x0e ; 一文字表示する MOV BX,15 ; カラーコードを指定 INT 0x10 ; ビデオBIOS呼び出し JMP putloop fin: HLT ; 何かあるまでCPUを停止させる JMP fin ; 無限ループ msg: DB 0x0a, 0x0a ; 改行を2つ DB "hello, world" DB 0x0a ; 改行 DB 0 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa ; 以下はブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
ハマりポイント
- ORG命令って昨日までのコードのどこに出て来ていたんだろう
- このくらいになってくると書いたアセンブラとバイナリの対応がわからなくなってくる
- 諸々の疑問の解決に最後にあげたブログの内容がすごく参考になった
知ったこと
- ORG命令
- origin の略
- なぜ 0x7c00 なのかはこの節を読み込んでいくとわかるらしい
- 機械語が実行時にどこに読み込まれるかを指定する
- この命令をかくと、$ の意味が昨日までとは変わって、出力ファイルの何バイト目であるかではなく、読み込まれる予定のメモリ番地に変わる
- JMP命令
- jump の略
- これはC言語でいうgoto文
- entry; はラベルでjumpとセットで飛び先の指定に使ったりする
MOV命令
- move の略
- 基本的にただの代入である
- MOV AX,0 とは AX = 0; ということ
- SS, AX とは何かっていうのもまた読んでいくとわかるらしい
レジスタの説明
- AX アキュムレータ
- CX カウンタ
- DX データ
- BX ベース
- SP スタックポインタ
- BP ベースポインタ
- SI スタックインデックス
- DI デスティネーションインデックス
- これらは全て16ビットのレジスタ
- その証としてX が付いていてこれは extend (拡張)という意味
- 昔はCPUが8bitだった時代の名残で進化したんだぜという意味で付いている。
参考にした
Write blog every week のススメ
Write blog every week のススメ
この記事は、write-blog-every-week Advent Calendar 2018の3日目の記事です。 write-blog-every-week への Joinはこちらから
経緯
以前、以下の記事でも言及をしましたが、私は毎週ブログを書くことを目的に活動するコミュニティ Write blog every week に参加をしています。
mozy-ok.hatenablog.com
そこで、今日はアドベントカレンダー企画として、毎週1記事以上のブログ記事を書き、コミュニティで活動することでどんな変化があったかをまとめてみたいと思います。
メリット
単純にPVが伸びる🎉
まずは、Write blog every week に参加したことで定量的に変化がおきました。
( 前3ヶ月と比較した結果です )グループで煽り煽られる文化があるので毎週継続するモチベーションが長続きする ( コレが一番大きい。
書いたブログに反応があって楽しい!
ブログを書くことで技術や知識が定着する
- コンパイラ勉強会などに参加をしてメモをどんどん公開したことで周辺知識を調べるときに足ががりにできている
毎週技術関連のブログを書くためのコツなど
私は、基本的に技術に関する記事を書いているのですが、業務や趣味などでハマったことや使ったツールの使い方のメモなどを書いておき、それを肉付けしてまとめて記事を書くという流れを取っています。
こうすることで、ブログネタを逃さない工夫をしています。
また、勉強会に参加して積極的に参加してきましたブログを書くことで、自分の知らないことと理解していることの境界が以前よりも明確にわかるようになってきました。
厳密さのお話し
技術ブログにありがちな、書くことに関して間違えないようにと考えすぎて記事がなかなか完成しないというのがあります。
私は、自分の中での7割くらいの納得に達したら、見た人も納得してくれるだろうという感じで楽観視して記事を書いています。
基本的には間違いを書かないようにと調べて記事を書いているのですが、時間とコストが膨大になっていくので、ある一定のレベルを超えたと判断したら、えいや、と、どんどん公開してコメントされたり言及されたりした部分を直したりするスタンスでいます。
( 技術に関してちゃんと調べるときは個人のブログはおいておいて、とにかくドキュメント読むか英語でググるでしょ? (ニッコリ
なので、そもそも世界に何も生まれないよりは、しょぼいものでも書いた方がいいと思って Done is Better than perfect の精神で記事を書くことにしています。
まとめ
毎週ブログを書くことで、自分の中で文章を書く習慣や、発信する習慣が付いてきました。
発信する物を探すために勉強会に出たりなど行動にも変化が出てきました。
明日は、@dskst9 さんの Advent Calendar です!
バトンをおつなぎしました! よろしくお願いしまっす!!
あと、発展した形として個人的に Write blog every day (一人アドベントカレンダー) を実践しています。
こちらも応援と応援と応援をよろしくお願いします!!
adventar.org
30日でできるOS自作入門【3日目】
概要
これはMozyの1人アドベントカレンダー 2018 の3日目の記事です。
書こうとした経緯は、こちら
今日の内容
- 昨日書いたアセンブラを書き直してみる
今日やったこと
; hello-os ; TAB=4 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" DW 512 DB 1 DW 1 DB 2 DW 224 DW 2880 DB 0xf0 DW 9 DW 18 DW 2 DD 0 DD 2880 DB 0,0,0x29 DD 0xffffffff DB "HELLO-OS " DB "FAT12 " RESB 18 ; 本体 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd ; メッセージ DB 0x0a, 0x0a ; 改行2つ DB "hello, world" DB 0x0a ; 改行 DB 0 RESB 0x1fe-$ ; 0x001feまで0x00埋め DB 0x55, 0xaa ; ブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
ハマりポイント
特になかった。😆
結構順調だ。
知ったこと
- 0x0a は改行を意味する
- DB "hello, world" のようにDB命令は文字列を書くことができるのね
- RESB 0x1fe-$ の$ は行が先頭から数えて何バイト目かを教えてくれる変数である
- DW命令
- data word の略称
- ワードとは16bitのこと。つまり2バイト
- DD命令
- data double-word の略称
- 32bitのことで つまり4バイト
30日でできるOS自作入門【2日目】
概要
これはMozyの1人アドベントカレンダー 2018 の2日目の記事です。
書こうとした経緯は、こちら
今日の内容
- helloosをアセンブラで作り直してみる
今日やったこと
昨日はバイナリエディタでosが起動し、hello worldを出力するまでのファイルを作りました。
今日はアセンブラで再実装してみます。
最初は、DB命令のみで18万行を超える物を書こうかなと思ったけど、やめましたw
なので、RESB命令も使った helloos.nasを作ってみます。
使うのは、この本の著者の方が作った、NASM(なすむ) というアセンブラです。
22行になって短くなりましたね!
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 RESB 16 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
ハマりポイント
最初に18万行を書こうと思い立って、さすがにむりやと気付いた部分w
知ったこと
DB命令とは
- data byte の略
- つまりファイルの内容を1バイトだけ直接書く命令です
- このDB命令さえあればどんなデータもどんなプログラムも記述できる
- そんな訳でアセンブラに作れないファイルはない
RESB命令とは
- reserve byte の略
- とりあえずここに10バイトほど開けておいてくださいという意味で
- RESB 10 のようにつかう
- こう書いたら10バイトは予約済みとなる
- 今回は単に開けておくだけではなく、開けた部分を 0x00 で埋める用途で使っている
- そのためこの命令のおかげで18万行も書かなくてすむようになった ( スゴイ
- 最後の行 RESB 1469432 は圧巻だよね
30日でできるOS自作入門【1日目】
概要
これはMozyの1人アドベントカレンダー 2018 の1日目の記事です。
書こうとした経緯は、こちら
今日の内容
- 環境設定
- 動作確認まで
今日やったこと
環境設定
自分の環境は Macbook Pro 2015 macOS High Sierra バージョン10.13.6 です。
まずはここを参考に進めていこう qiita.com
そして以下のリンクから、HariboteOS.zip をダウンロードして解凍した
30日でできる! OS自作入門 | マイナビブックス解凍したら、
HariboteOS.iso
というファイルができた これをいわゆる右クリックなどして、「開く」を選択するとこんな感じだった
projectsディレクトリとtolsetディレクトリをさっき作成したHariboteOSディレクトリにコピーしたtolsetOSXをダウンロードして解凍
http://shrimp.marokun.net/osakkie/wiki/tolsetOSX/ tolsetOSX-070221.dmg
こんな感じだった
そして、z_toolsをHariboteOSディレクトリにコピーしたQEMU emulatorをダウンロード
調べて見ると、どうやら参考にしたGitHubの通りではなく、homebrewからqemuをインストールする方がいいようなので
brew install qemu
を実行
バージョンを確認してみるとversion 3.0.0が入ったようだ。
$ qemu-system-i386 -version QEMU emulator version 3.0.0 Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
- そしてサンプルを実行するためにシェルスクリプトを実行する
curl https://raw.githubusercontent.com/tatsumack/30nichideosjisaku/master/bin/install.sh | sh
結果
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1467 100 1467 0 0 4513 0 --:--:-- --:--:-- --:--:-- 4527 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 142 0 142 0 0 242 0 --:--:-- --:--:-- --:--:-- 242 100 131k 0 131k 0 0 90078 0 --:--:-- 0:00:01 --:--:-- 394k おわり!がんばってOS作ってね!
すごい! 頑張って作ります!!
そして最後に動作チェック
cd ~/HariboteOS/01_day/helloos0 make run
結果
自分でも試してみるぞ
Makefileをhelloos.img
から、自分で手で打ち込んだhello_my_os.imag
に書き換えて実行!!
$ make run cp hello_my_os.imag ../../z_tools/qemu/fdimage0.bin make -C ../../z_tools/qemu qemu-system-i386 -L . -m 32 -localtime -vga std -fda fdimage0.bin qemu-system-i386: -localtime: warning: This option is deprecated, use '-rtc base=localtime' instead. WARNING: Image format was not specified for 'fdimage0.bin' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions.
ハマりポイント
HariboteOS.iso
を開いてファイルをコピーとかあったけど、 右クリックなどして、「開く」ことが一瞬わからなかった
知ったこと
先人たちの知恵ってすげえ。。
こうやってどんどん便利なツールが提供されていくんだね。
これからどんどん作っていくぞ
一人アドベントカレンダー 仲間を勝手に探して追加するスレ
タイトルの通り
一人アドベントカレンダーをしようとする猛者たちを集めるスレッド
https://adventar.org/ から探しています
みなさん一緒に頑張りましょう!!! 💪💪
俺の
adventar.org
一覧
同じwrite blog every week 仲間のKojirockさん! 頑張りましょう!
adventar.org
同じwrite blog every week 仲間のyoshitaku_jpさん! 頑張りましょう! adventar.org
内容はどんなものになるんでしょうか!? きになる
adventar.org
深層学習とか機械学習気になります!!
adventar.org
一年間の総まとめ!
adventar.org
すごい! 2016年もトライしてる
adventar.org
「a」 なるほど深いですねぇ
adventar.org
ずっと君のターンだぜ!!! 頑張りましょう
adventar.org
スイーツ!?
adventar.org
JSの配列周りきになる
adventar.org
お絵かき!
adventar.org
ルータ! めっちゃ知りたいルータの話
adventar.org
DAWの武者修行! すげえ
adventar.org
目指そう!!!
adventar.org
お絵かき!! 毎日見ます!!
adventar.org
ひと〜りだけど、独〜りじゃない
adventar.org
React!
adventar.org
Elixir & Phoenix きになる
adventar.org
多才!!
adventar.org
おひとりさま!!
adventar.org
すげえ内容が全て埋まってるぜ
adventar.org
3年目! すごいぜ先輩!!
adventar.org
トマトx シープ でトマシープさんかな 可愛い!
adventar.org
やばい記事のタイトルだけでめっちゃきになる
adventar.org
Oracle Cloud Infrastructure!! きになります!
adventar.org
Rust!!
adventar.org
Terraform!!
adventar.org
卒論やりながら!? 一緒に頑張ろう!!
adventar.org
腹痩!?
adventar.org
3年目⁉︎ すごい
https://adventar.org/calendars/3151:embed:city
我が抜けておるって人はこっそりコメント欄に書いておいてください!! 追記します。。
Mozyの1人アドベントカレンダー 2018 をやるぞ!!
概要
これはMozyの1人アドベントカレンダー 2018 の0日目の記事です。
この記事は、1人アドベントカレンダーを思い立った経緯を語るページです。
経緯
最近、私は、Write blog every week という Slackチャンネルに参加をしています。
そこで、毎週継続してブログ記事を書いて投稿して、ブログを書きそれが人に見られるという楽しさを知りました。
書いたブログに反応があるって本当に楽しいですよ。次はここを色々と工夫して書いてみよう、どんな反応が返ってくるかなぁと想像して書く楽しみが増えました!
そして事件はおこる
先日コンパイラ勉強会にいき、自分の低レイヤーへの知識の無さを思い知りました。
これがその時のブログ記事です
mozy-ok.hatenablog.com
人生で、一度はコンパイラをという言葉も出てきましたし、
家には、「30日でできるOS自作入門」という本が先日買ったばかりで積読していた状態でした。
- 作者: 川合秀実
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 36人 クリック: 735回
- この商品を含むブログ (299件) を見る
そこで自分は、閃いたわけです!
アレ? これ、アドベントカレンダーでブログを書くのと、30日でできるOS自作入門ってめちゃくちゃ相性いいじゃん! と。
そして、これはいい機会だと思ってやり始めることにしたわけです。
アドベントカレンダーが25日で終わりって気づいたのはついさっきというのは内緒w (ヤバいww
そんなこんなでMozyの 1人アドベントカレンダー 2018 始めます!
応援と応援と応援をよろしくお願いいたします!