mozyのかきおき

mozyの読書感想文や思考置き場

30日でできるOS自作入門【4日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の4日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

  • プログラム部分をどんどん書き換える

今日やったこと

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だった時代の名残で進化したんだぜという意味で付いている。

参考にした

yuyubu.hatenablog.com

Write blog every week のススメ

f:id:mozy_ok:20181203115219j:plain

Write blog every week のススメ

この記事は、write-blog-every-week Advent Calendar 2018の3日目の記事です。 write-blog-every-week への Joinはこちらから

adventar.org

経緯

以前、以下の記事でも言及をしましたが、私は毎週ブログを書くことを目的に活動するコミュニティ Write blog every week に参加をしています。
mozy-ok.hatenablog.com

そこで、今日はアドベントカレンダー企画として、毎週1記事以上のブログ記事を書き、コミュニティで活動することでどんな変化があったかをまとめてみたいと思います。

メリット

  • 単純にPVが伸びる🎉
    まずは、Write blog every week に参加したことで定量的に変化がおきました。
    ( 前3ヶ月と比較した結果です )

    f:id:mozy_ok:20181203120809p:plain
    ページビュー数

  • グループで煽り煽られる文化があるので毎週継続するモチベーションが長続きする ( コレが一番大きい。

    f:id:mozy_ok:20181203121138p:plain
    煽られる

  • 書いたブログに反応があって楽しい!

    f:id:mozy_ok:20181203121547p:plain
    スターがどんどん増えるぞ

  • ブログを書くことで技術や知識が定着する

    • コンパイラ勉強会などに参加をしてメモをどんどん公開したことで周辺知識を調べるときに足ががりにできている

毎週技術関連のブログを書くためのコツなど

私は、基本的に技術に関する記事を書いているのですが、業務や趣味などでハマったことや使ったツールの使い方のメモなどを書いておき、それを肉付けしてまとめて記事を書くという流れを取っています。
こうすることで、ブログネタを逃さない工夫をしています。
また、勉強会に参加して積極的に参加してきましたブログを書くことで、自分の知らないことと理解していることの境界が以前よりも明確にわかるようになってきました。

厳密さのお話し

技術ブログにありがちな、書くことに関して間違えないようにと考えすぎて記事がなかなか完成しないというのがあります。
私は、自分の中での7割くらいの納得に達したら、見た人も納得してくれるだろうという感じで楽観視して記事を書いています。
基本的には間違いを書かないようにと調べて記事を書いているのですが、時間とコストが膨大になっていくので、ある一定のレベルを超えたと判断したら、えいや、と、どんどん公開してコメントされたり言及されたりした部分を直したりするスタンスでいます。
( 技術に関してちゃんと調べるときは個人のブログはおいておいて、とにかくドキュメント読むか英語でググるでしょ? (ニッコリ なので、そもそも世界に何も生まれないよりは、しょぼいものでも書いた方がいいと思って Done is Better than perfect の精神で記事を書くことにしています。

まとめ

毎週ブログを書くことで、自分の中で文章を書く習慣や、発信する習慣が付いてきました。
発信する物を探すために勉強会に出たりなど行動にも変化が出てきました。

明日は、@dskst9 さんの Advent Calendar です!
バトンをおつなぎしました! よろしくお願いしまっす!!

あと、発展した形として個人的に Write blog every day (一人アドベントカレンダー) を実践しています。
こちらも応援と応援と応援をよろしくお願いします!!
adventar.org

30日でできるOS自作入門【3日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の3日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

今日やったこと

; 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日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の2日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

今日やったこと

昨日はバイナリエディタで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日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の1日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

  • 環境設定
  • 動作確認まで

今日やったこと

環境設定

自分の環境は Macbook Pro 2015 macOS High Sierra バージョン10.13.6 です。

まずはここを参考に進めていこう qiita.com

  1. バイナリエディタをダウンロードする
    Macだと0xEDが良いとのことなので選択
    0xED

  2. そして以下のリンクから、HariboteOS.zip をダウンロードして解凍した
    30日でできる! OS自作入門 | マイナビブックス

  3. 解凍したら、 HariboteOS.iso というファイルができた これをいわゆる右クリックなどして、「開く」を選択するとこんな感じだった

    f:id:mozy_ok:20181201123405p:plain
    HariboteOS.isoの中身
    projectsディレクトリとtolsetディレクトリをさっき作成したHariboteOSディレクトリにコピーした

  4. tolsetOSXをダウンロードして解凍
    http://shrimp.marokun.net/osakkie/wiki/tolsetOSX/ tolsetOSX-070221.dmg
    こんな感じだった

    f:id:mozy_ok:20181201123700p:plain
    tolsetOSXの中身

    そして、z_toolsをHariboteOSディレクトリにコピーした

  5. 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
  1. そしてサンプルを実行するためにシェルスクリプトを実行する
    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

結果

f:id:mozy_ok:20181201125104p:plain
動いた!!

自分でも試してみるぞ

f:id:mozy_ok:20181201155935p:plain
ぽちぽち打っていく

f:id:mozy_ok:20181201160009p:plain
どんどん打ち込んでいく

f:id:mozy_ok:20181201160032p:plain
打ち込みおわり!!!! (つかれた

Makefilehelloos.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.

f:id:mozy_ok:20181201160246p:plain
動いた!!!

ハマりポイント

HariboteOS.iso を開いてファイルをコピーとかあったけど、 右クリックなどして、「開く」ことが一瞬わからなかった

知ったこと

先人たちの知恵ってすげえ。。
こうやってどんどん便利なツールが提供されていくんだね。
これからどんどん作っていくぞ

一人アドベントカレンダー 仲間を勝手に探して追加するスレ

タイトルの通り

一人アドベントカレンダーをしようとする猛者たちを集めるスレッド
https://adventar.org/ から探しています
みなさん一緒に頑張りましょう!!! 💪💪

俺の
adventar.org

一覧

同じwrite blog every week 仲間のKojirockさん! 頑張りましょう!
adventar.org

同じwrite blog every week 仲間のyoshitaku_jpさん! 頑張りましょう! adventar.org

内容はどんなものになるんでしょうか!? きになる
adventar.org

CakePHP !!
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 をやるぞ!!

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の0日目の記事です。

adventar.org

この記事は、1人アドベントカレンダーを思い立った経緯を語るページです。

経緯

最近、私は、Write blog every week という Slackチャンネルに参加をしています。
そこで、毎週継続してブログ記事を書いて投稿して、ブログを書きそれが人に見られるという楽しさを知りました。
書いたブログに反応があるって本当に楽しいですよ。次はここを色々と工夫して書いてみよう、どんな反応が返ってくるかなぁと想像して書く楽しみが増えました!

そして事件はおこる

先日コンパイラ勉強会にいき、自分の低レイヤーへの知識の無さを思い知りました。
これがその時のブログ記事です
mozy-ok.hatenablog.com
人生で、一度はコンパイラをという言葉も出てきましたし、 家には、「30日でできるOS自作入門」という本が先日買ったばかりで積読していた状態でした。

30日でできる! OS自作入門

30日でできる! OS自作入門

そこで自分は、閃いたわけです!
アレ? これ、アドベントカレンダーでブログを書くのと、30日でできるOS自作入門ってめちゃくちゃ相性いいじゃん! と。
そして、これはいい機会だと思ってやり始めることにしたわけです。
アドベントカレンダーが25日で終わりって気づいたのはついさっきというのは内緒w (ヤバいww

そんなこんなでMozyの 1人アドベントカレンダー 2018 始めます!
応援と応援と応援をよろしくお願いいたします!