30日でできるOS自作入門【8日目】
概要
これはMozyの1人アドベントカレンダー 2018 の8日目の記事です。
書こうとした経緯は、こちら
今日の内容
- セクタとかハードウェア部分に関しての知見を学んだ
今日やったこと
- ハードウェアとアセンブラの関係をどんどん学んでいった
ハマりポイント
ここら辺は、座学っぽいので少し考える時間が多くてブログ執筆が進まない 笑
知ったこと
- JNC命令
- jump if not carry の略
- キャリーフラグが0ならジャンプする命令
- JAE命令
- jump if above or equal の略
- 大きいかもしくは等しければジャンプするという命令
- JBE命令
- jump if below or equal の略
- 小さいかもしくは等しければジャンプしないという命令
- JAEの逆みたいなもの
30日でできるOS自作入門【7日目】【祝 1週間目】
概要
これはMozyの1人アドベントカレンダー 2018 の7日目の記事です。
書こうとした経緯は、こちら
今日の内容
- INT 0x13の意味を調べていく
- ハードウェアとソフトウェアの境界を実際に手に取るように理解できた
今日やったこと
昨日やり残していた、調査をするぞ
以下のページを参考に、0x13の意味を調べる
http://oswiki.osask.jp/?(AT)BIOS
らしいぞ。 他には 意味がわかっていなかったディスク関連のアドレスがわかった。 以下引用。
ディスクからの読み込み、ディスクへの書き込み、セクタのベリファイ、およびシーク 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日目】
概要
これはMozyの1人アドベントカレンダー 2018 の6日目の記事です。
書こうとした経緯は、こちら
今日の内容
- ついに今日から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日目】
概要
これはMozyの1人アドベントカレンダー 2018 の5日目の記事です。
書こうとした経緯は、こちら
今日の内容
- ブートセクタだけ ?のソース 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
参考
Puppeteer から Headless Chromium を動かしている時のログ
概要
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'});
参考文献
Chromium と Chrome は何が違うかをわかりやすく解説した記事。
www.howtogeek.com
さっき書いた記事。 mozy-ok.hatenablog.com