mozyのかきおき

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

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

f:id:mozy_ok:20181130220523p:plain

概要

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

adventar.org

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

mozy-ok.hatenablog.com

今日の内容

  • セクタとかハードウェア部分に関しての知見を学んだ

今日やったこと

  • ハードウェアとアセンブラの関係をどんどん学んでいった

ハマりポイント

ここら辺は、座学っぽいので少し考える時間が多くてブログ執筆が進まない 笑

知ったこと

  • JNC命令
    • jump if not carry の略
    • キャリーフラグが0ならジャンプする命令
  • JAE命令
    • jump if above or equal の略
    • 大きいかもしくは等しければジャンプするという命令
  • JBE命令
    • jump if below or equal の略
    • 小さいかもしくは等しければジャンプしないという命令
    • JAEの逆みたいなもの

30日でできるOS自作入門【7日目】【祝 1週間目】

f:id:mozy_ok:20181130220523p:plain

概要

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

adventar.org

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

mozy-ok.hatenablog.com

今日の内容

  • INT 0x13の意味を調べていく
  • ハードウェアとソフトウェアの境界を実際に手に取るように理解できた

今日やったこと

昨日やり残していた、調査をするぞ
以下のページを参考に、0x13の意味を調べる http://oswiki.osask.jp/?(AT)BIOS

  • 0x13:VGAグラフィックス、320x200x8bitカラー、パックドピクセル

らしいぞ。 他には 意味がわかっていなかったディスク関連のアドレスがわかった。 以下引用。

ディスクからの読み込み、ディスクへの書き込み、セクタのベリファイ、およびシーク
AH = 0x02; (読み込み時)
AH = 0x03; (書き込み時)
AH = 0x04; (ベリファイ時)
AH = 0x0c; (シーク時)
AL = 処理するセクタ数; (連続したセクタを処理できる)
CH = シリンダ番号 & 0xff;
CL = セクタ番号(bit0-5) | (シリンダ番号 & 0x300) >> 2;
DH = ヘッド番号;
DL = ドライブ番号;
ES:BX = バッファアドレス; (ベリファイ時、シーク時にはこれは参照しない)
戻り値:
FLAGS.CF == 0 : エラーなし、AH == 0
FLAGS.CF == 1 : エラーあり、AHにエラーコード(リセットファンクションと同じ)
補足:

これで見ると、戻り値の欄にFLAGS.CF というのがあるが、これは、キャリーフラグのことらしい。
この関数を呼び出すと、エラーがない場合は、0 ある場合は、1となる。
これによって昨日解説したJC命令(jump if carry: キャリーフラグが1ならジャンプしなさいという命令) の意味が生まれてくる。
キャリーフラグは1bitしか保持できないレジスタでCPUは他にもこういったレジスタをいくつも持っている。
そのほかの項目をみていくと、ハードウェアとのつなぎ目なのだなと感じる。HDDのシリンダとかセクタとかドライブとかを指定するとな。(書いてから気がついたが、この書籍が出た時はフロッピーのセクタとかだったか笑)

ハマりポイント

基本的にここら辺は読んで行けばいい感じなのでさほど詰まっていない。

知ったこと

キャリーフラグのことは知っていたが、実際にどうやって活用するかなどを考えてコードを読み解いて使ったのは初めてだった。

1週間を迎えて

なんとも進行が遅いがどうにか1週間迎えることができた。
1週間毎日記事を書くのっていうのも結構楽しいし、最初の2日とかと違って書かなきゃではなく、今日はいつ書く時間を確保するか、今日は移動時間だな。など
時間を効率的に使わないと詰むって思考になって来たのがすごくいい影響を与えている気がする。
このアドベントカレンダー以外の業務などでの実装も精度とスピードを気にするようになって来たというか。
継続は力なり。(ただし中身が伴っていれば) 続けていきます。

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

f:id:mozy_ok:20181130220523p:plain

概要

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

adventar.org

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

mozy-ok.hatenablog.com

今日の内容

  • ついに今日から32bitモードに突入するらしいぞ
  • ディスクを読むプログラムを追記した。

    今日やったこと

    ディスクを読むプログラム

MOV  AX,0x0820
MOV  ES,AX
MOV  CH,0 ;シリンダ0
MOV  DH,0 ; ヘッド0
MOV  CL,2 ; セクタ2
MOV  AH,0x02 ; AH=0x02 : ディスク読み込み
MOV  AL,1 ; 1セクタ
MOV  BX,0
MOV  DL,0x00 
INT  0x13    ; ディスクBIOS呼び出し
JC  error

ハマりポイント

時間が取れないこと😑

知ったこと

  • JC命令
    • jump if carryの略
    • キャリーフラグが 1だったらジャンプしなさいという命令らしい
    • キャリーフラグに関してはおいおい説明があるとのこと

感想

時間が取れなかったので全然進められなかった。
INT 0x13 部分が謎な感じなので調べてみる

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

f:id:mozy_ok:20181130220523p:plain

概要

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

adventar.org

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

mozy-ok.hatenablog.com

今日の内容

  • ブートセクタだけ ?のソース ipl.list を作成した
  • 関連してコンパイルと実行に使っているMakefileを書き換える

    今日やったこと

  • Makefileを以下の流れになるように書き換えた
  • edimgというディスクイメージ作成のツール?を使ってイメージを作成する
  • qemuの特定のフォルダにimgファイルを配置して
  • qemuを起動

ハマりポイント

どんどんわからない部分が出てきたぞ。 edimg ってツールの中身を読み込まないと。

知ったこと

こんな感じに、ブートセクタ以外の部分をディスクイメージ作成ツールを使って作っていくのね。
( 今日はあまり時間が取れなかった反省。。WBEWの忘年会があるのだ

gem install が rmagick でエラー

経緯

bundle install をしたら、以下のようなエラーがでた。

An error occurred while installing rmagick (2.16.0), and Bundler cannot
continue.
Make sure that `gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'`
succeeds before bundling.

解決方法

imagemagick に関連したエラーであるとわかったので、brew uninstall して バージョンを指定してインストール。
パスを通して、brew link して解決した

$ brew uninstall imagemagick
$ brew install imagemagick@6
$ export echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.zshrc
$ gem install rmagick

参考

blog.francium.tech

Puppeteer から Headless Chromium を動かしている時のログ

f:id:mozy_ok:20181205144238j:plain

概要

Headless modeが TrueかFalseかでChromiumの動作が変化するが、それをどうやって実現しているのかが知りたかったので調査した。

以下のようにオプションで指定し変化させてログを確認してみる。
puppeteer.launch({ headless: false })

Headless が有効な時

puppeteer.launch({ headless: ture }) の場合

[ '/mozy/headless_test/node_modules/puppeteer/.local-chromium/mac-609904/chrome-mac/Chromium.app/Contents/MacOS/Chromium',
        '--disable-background-networking',
        '--disable-background-timer-throttling',
        '--disable-backgrounding-occluded-windows',
        '--disable-breakpad',
        '--disable-client-side-phishing-detection',
        '--disable-default-apps',
        '--disable-dev-shm-usage',
        '--disable-extensions',
        '--disable-features=site-per-process',
        '--disable-hang-monitor',
        '--disable-ipc-flooding-protection',
        '--disable-popup-blocking',
        '--disable-prompt-on-repost',
        '--disable-renderer-backgrounding',
        '--disable-sync',
        '--disable-translate',
        '--metrics-recording-only',
        '--no-first-run',
        '--safebrowsing-disable-auto-update',
        '--enable-automation',
        '--password-store=basic',
        '--use-mock-keychain',
        '--headless',
        '--hide-scrollbars',
        '--mute-audio',
        'about:blank',
        '--remote-debugging-port=0',
        '--user-data-dir=/var/folders/h2/489kk0vs5bl5y6232v874xsc0000gn/T/puppeteer_dev_profile-9vrPLR' ],

Headless が無効な時

puppeteer.launch({ headless: false }) の場合

 [ '/mozy/headless_test/node_modules/puppeteer/.local-chromium/mac-609904/chrome-mac/Chromium.app/Contents/MacOS/Chromium',
        '--disable-background-networking',
        '--disable-background-timer-throttling',
        '--disable-backgrounding-occluded-windows',
        '--disable-breakpad',
        '--disable-client-side-phishing-detection',
        '--disable-default-apps',
        '--disable-dev-shm-usage',
        '--disable-extensions',
        '--disable-features=site-per-process',
        '--disable-hang-monitor',
        '--disable-ipc-flooding-protection',
        '--disable-popup-blocking',
        '--disable-prompt-on-repost',
        '--disable-renderer-backgrounding',
        '--disable-sync',
        '--disable-translate',
        '--metrics-recording-only',
        '--no-first-run',
        '--safebrowsing-disable-auto-update',
        '--enable-automation',
        '--password-store=basic',
        '--use-mock-keychain',
        'about:blank',
        '--remote-debugging-port=0',
        '--user-data-dir=/var/folders/h2/489kk0vs5bl5y6232v874xsc0000gn/T/puppeteer_dev_profile-LX7XmK' ],

違い

Headless TrueとするとChromiumを起動する際に以下の指定がある。

'--headless',        
'--hide-scrollbars',        
'--mute-audio',

つまりは、headlessにしてスクロールバーを決して、音が再生しないように指定をしているようだ。

その他、それぞれのオプションに関しては順次まとめていく。

関連して

Chromium ではなく、すでにインストールしてある Chrome で起動したい場合は以下のようにパスを指定すると良い。
puppeteer.launch({executablePath: '/path/to/Chrome'});

参考文献

ChromiumChrome は何が違うかをわかりやすく解説した記事。
www.howtogeek.com

さっき書いた記事。 mozy-ok.hatenablog.com

Puppeteer で起動する Chromiumはどこにあるのか【Mac】

f:id:mozy_ok:20181205121540j:plain

答え

ここにある
/node_modules/puppeteer/.local-chromium/mac-609904/chrome-mac/Chromium.app

mac-609904 の部分は人や環境によって変わりそうです。
複数プロジェクトで Puppetterを使っているとなんどもDLしてきたりして容量の無駄なのでシンボリックリンクなどでうまく使えば良さそう。

関連して

Mac の容量がガッと増える魔法のコマンド

gist.github.com