編集部イチオシ

パソコンを回路レベルで自作する (Intel x86 IA-32)

@kaitou_ryaku が一人で作るCPU (x86) の進捗管理用メモ。随時更新。 最新状況(2019/09/21): 自作CPU上の自作OS上でテトリスが動いた 元はこれ https://qiita.com/advent-calendar/2017/lowlayer
173
前へ 1 ・・ 3 4 次へ

↑この日はスタックに載せる文字列に関し、ひどく頭の悪い勘違いをしていた。スタックへのpush, popは4byte単位だが、movによる書き換えは1byte単位で可能(でないとchar型が扱えない)ことを完全に失念していた。

2019/08/17 ブートプロセスを真面目に考え始める。メモリマップをちゃんと扱おうとして、始めてリンカスクリプトを書いてldした。

解答略 @kaitou_ryaku

自作CPUのROMに書き込む用のバイナリ列を作っている。当初はC言語をコンパイルして得た機械語をバイナリエディタで加工して調整してたのだが、CPUの機能が増えるにつれ、割り込みベクタ・ハンドラ・リセットベクタ等の記述も必要になってきた。そこで「リンカ」を使い始めたのだが、これは神のツールや

2019-08-17 00:02:55
解答略 @kaitou_ryaku

リセットベクタの決定方式として最も綺麗なのは、H8マイコンのように「RAMアドレス0x00に割り込みベクタを入れて、その最初にリセットベクタを入れて、起動時にeipに値をコピーする」という戦略だと思う。一方、x86は「深い意味はないが、eip=0xFFFF0から開始する」という間の抜けた戦略をとっている。

2019-08-17 00:14:40
解答略 @kaitou_ryaku

* パソコンの電源スイッチを入れる * CUIにコマンドを入力してエンターキーを押す この2つは全く関係ないように思えるが、CPUの気持ちになると大変よく似た行為に見えてくる。違うのは * プログラムのロード元 (ROM or HDD) * プログラムカウンタの初期化方式 (ハード or ソフト) というところだけ

2019-08-17 00:25:49
解答略 @kaitou_ryaku

x86の環境依存性 C言語 (共通) ↓ API (POSIXで共通) ↓ ABI (OS毎に異なる。cdeclとか) ↓ アセンブラ (nasm, gasで異なる) ↓ hoge.o (UNIXだと形式的にはELFで共通) ↓ リンカスクリプト (形式的には共通。メモリマップの中身はOS毎に異なる) ↓ hoge.out (形式的にはELFで共通) ↓ x86 (全PC共通)

2019-08-18 00:25:13
解答略 @kaitou_ryaku

System Verilogの中で最高級に気持ち悪い仕様は、配列範囲の計算の中で「2つ以上の式が出てきたらダメ」というやつだ。つまり a = b[23 : 16]; ← セーフ の代わりに int i = 2; a = b[i*8+7 : i*8]; ← アウト と書くのはダメなので int i = 2; a = b[i*8 +: 8]; ← セーフ と書く必要がある

2019-08-18 01:18:59

↑この最後の記法を使ったらmodel simが固まったので、素直に最初の記法を使うのが良さそう。

2019/08/20 自作OSを動かすための布石としてIOの割り込み周りをちゃんと作り込む。

解答略 @kaitou_ryaku

自作中のCPU、この辺の割り込みコントローラ周りが酷い仕様になってたので、8086と同様にINTR線とINTA線を用意して、ちゃんとした形に作り直した。これで冒頭のツイートに書いたような現象は発生しない。チップセットからの割り込み信号が来る→CPUが処理を開始→INTAでACK信号を返す、という仕組みだ

2019-08-20 01:48:31
解答略 @kaitou_ryaku

🈴 1⃣ 2⃣ 3⃣ 4⃣ 5⃣ 6⃣ 7⃣ 8⃣ 9⃣ 0⃣ ♊♐ 🆙 🇶 🇼 🇪 🇷 🇹 🇾 🇺 🇮 🇴 🇵 ⏺ ⠀🔠 🇦 🇸 🇩 🇫 🇬 🇭 🇯 🇰 🇱 *⃣ ℹ ⠀⠀🔣 🇿 🇽 🇨 🇻 🇧 🇳 🇲 ◀▶ ☑⬆ ⠀⠀🆒 ✝ 🆎 ⬜⬜⬜⬜ 🈚 🈂 🆎 ⬅⬇➡

2019-08-21 01:03:57

2019/08/21 自作CPU上で自作OSが動いた

解答略 @kaitou_ryaku

宣言:今日中にOSを完成させる

2019-08-21 21:45:57
解答略 @kaitou_ryaku

自作CPU上でOSが動いたぞ!!!平常時はビジーループを回しておき、キーボードの入力をUARTで受信した瞬間に、割り込みハンドラを自動で呼び出して、取得したASCIIコードに1を足して、UARTで送信するプログラムを機械語で書いて、動作させている。これはもう完璧にOSで、作者がOSだと言ってるのでOSだ pic.twitter.com/0nOEt6Ccfr

2019-08-23 02:20:20
解答略 @kaitou_ryaku

動画の解説 * キーボードのaボタンを叩く→b(aの次)が表示される * sを叩く→t(sの次)が表示 * wを叩く→x 想定Q&A Q: これのどこがOSなのか? A: 全部OSです Q: 自分の知ってるOSと全然違うのですが? A: 知ってる世界が狭いですね Q: これがなぜOSなのか? A: 割り込みでIOを処理してるからOSです

2019-08-23 02:25:01
解答略 @kaitou_ryaku

昨夜OSを1日で作ると宣言した以上、とりあえず出来上がったものをOSと呼ぶしかない。はりぼてOSと主張すれば、理解のある人は理解してくれると思う。などと期待はしてないけど、まぁOSの根幹の根幹はコレなので許せ twitter.com/kaitou_ryaku/s…

2019-08-23 02:28:15
解答略 @kaitou_ryaku

自作CPU (x86, IA-32) 上で動作している、自作OSのソースコードはこちらです。リセットベクタが0x00なのは非標準的ですが、その他はx86に準拠しています。これもう世界で一番ソースコードの短いOSと言って良いのでは (暴論過ぎることは自分自身よく理解してるのでマサカリを投げないで下さいよろしう) pic.twitter.com/gokl8nmLfb

2019-08-23 02:38:28
拡大
解答略 @kaitou_ryaku

今日は自作中のもろもろを「標準」に寄せる作業の日だった。例えば文字列を表示する場合は、C言語の関数からPOSIX互換のlibc write APIを呼び出せるように自作OSを整備した。そこからLinux互換のシステムコール、write ABIを割込で発行する二段構成にした。これで機械語を廃してCでコーディングできる

2019-08-25 23:02:01

2019/08/27 自作OSにシェルを実装した

解答略 @kaitou_ryaku

宣言:今日中に自作OSにシェルを実装する

2019-08-25 23:05:35
解答略 @kaitou_ryaku

* 割り込みベクタ (UART外部割込&writeカーネルコール) * 割り込みハンドラ * カーネルコール ABI (アセンブラ) * システムコール API (↑のC言語ラッパー) * 標準Cライブラリ (stdio.hのやつ) * OSのinit関数 (hltするだけ) などを作成した。パソコンの底の方がどんな構成になっとるのか分かってきた

2019-08-27 20:01:15
解答略 @kaitou_ryaku

自作CPU上で動く自作OSの進捗ですが、ソースコードのディレクトリ構成を整理し続けていた。だいぶそれらしい感じになった感がある。そして今困ってるのが、シリアル通信端末のバックスペースが効かないことで、自作CPU側から<BS>のキーを送っても、カーソルが左に動くだけで文字が消えず、ほとほと困る pic.twitter.com/Ldw7yZde5N

2019-08-27 19:56:03
拡大
解答略 @kaitou_ryaku

自作OSと言っても、シリアル受信の外部割込にトリガーされる形で処理を行い、結果をシリアル送信するだけの超シンプルな対話プログラムを動かしたいだけなんだよな。見物人達が「シェルが動いてる!」と誤解するような何かを作れれば充分なので、ゴールは近い。ハリボテによるハッタリだけでやっていく

2019-08-27 20:06:57
解答略 @kaitou_ryaku

シェルの標準入力パーサは、helloコマンドと草コマンドと画面消去のclearの3つだけサポートしてる。コマンドラインの文字列はcmd_line_strに格納されるが、エラー処理が皆無なのでバッファオーバーランによる任意コード実行脆弱性があり、FPGA上で動的に機械語プログラミング&実行ができて色々やばい

2019-08-30 17:48:32
解答略 @kaitou_ryaku

カーネル部分のディレクトリ構成はLinuxを参考にした。libcは文字列系の原始的な関数だけ作って、printfのような高級な関数は勿論ない。特徴としては、C言語のwrite()関数がPOSIX規約を正しく守ってることと、writeカーネルコールのABI呼出規約がLinux互換なところで、割込処理も含めて割とLinuxなのだ pic.twitter.com/4fvsaogYTJ

2019-08-30 17:42:29
拡大
拡大
前へ 1 ・・ 3 4 次へ