ioapic*)IOAPIC;に配置されている。addressである。0xFEC0_0000となっている4。デフォルト値が0xFEC0_0000となっているというわけだ。numberを指定している。#irqの要素に値を書き込むことを行っている。fieldを書き込めば良い。これは、cpuの番号を表す。xv6ではmultiprocessorに対応している5が、そのときにcpu番号が割り振られているので、その番号を指定する。MSB}2行目で24bitの左シフトとなっているのは、bit63:56にcpuの番号を書き込みたいという意図から。Tableに書き込むことで伝えたことになる。Controller)で、この頃から各IRQとデバイスとの対応が取られていたようだ。Reference[1-5]が分かりやすい資料になっている。vector(32+1)がCPUに伝達され、CPU側で自動的にいろいろ準備をして、vector.plのvector33が呼び出される。"Interrupt発生直後のhardware(x86)の対応"を参照のこと。skip}keyboard入力の場合、kbdgetcでcharacterをreadし、uartputcでcharacterをCPU側に送信し7、cgaputcで文字とカーソル部分をconsoleに書き込む。UARTについては次章で、CGA(VGA)については最後の章で取り扱うことにする。controllerから受け取るデータを変換して、ascii文字にする。interruptが走るので、上手いこと処理する。controllerの簡易FPGA実装しているReference[1-6]をざっくり見ればニュアンスは分かると思う。本記事ではできるだけ詳細に見ていきたいので、基本的には一次情報であるreference[2-1]を参照する。portのFPGA実装だが、よりレイヤの低い参考文献として分かりやすいと思う。Receiver/Transmitterの略でシリアルポート。UARTだったが、拡張版の16450や16550がある。16550はバグが有ったので9、修正版の16550Aがチップセット(自分の場合はsouthbridgeのPIIX4)の中に統合されている。パラレルポートは主にプリンタで使用されるっぽい。vector(32+4)とredirection先となるCPU#0を書き込んでいる。最後に設定がうまく言っているか確認している。0);それぞれ詳しく見ていく。uartputcについては、keyboard入力の挙動についての記事でまとめたい。port一覧(Reference[2-7])に簡易的なportの用途が書いてあるので、関係ありそうな用語を追っていくと良いと思う。AとBは共用っぽい?)。listの03F8-03FFの部分も簡易的に参考になると思う。addressからのoffsetである。順番にuartinitが何をしているのかを見ていきたい。Registerに0を書き込んでいる。あるので、0とすることでFIFOの機能を全てdisableにしている。これはbit0=1かつbit1=0の場合に有効なので、気にしなくて良い。0x80);について。(DLAB))をONにしているだけだ。Register.とある。latchをセットするときに使用するビットだ。次小節で詳しく述べたいと思う。latchをセットするモードに入った。COM1+1=0x3f9は上位8bitとなっている。以下、なぜ0x0C=115200/9600を書き込む必然性があるのかについて説明したい。以下の説明についてはReference[2-8]に全面的に頼っている。CPUで言うところのclock周波数を想像してもらえれば良い。portなのでデータをbit/clkごとに送受信する。最大16bitの送受信を取り扱うので、1.8432[MHz]/12=115200[bit/s]が得られる。一方で、AT互換機のシリアルポートでは標準規格であるRS-232-Cに準拠しており、最大伝送速度が9600bit/sとなっている。register)がある。Crystalsより表にもある通り、115200/9600=12をdivisorにセットする。latchは16bitとなっている。bitなどを含んだ総ビットを意味する。bitなどを除いた正味の伝送速度である(少しこの部分自信ない)。rates.とあり、こちらが一般的なようだ。(DLAB))をOFFにしている。1に1をセットしている。これは伝送するbitの単位の指定。この様にセットした場合は8bitとなる。Registerを参照のこと。残りはよくわからないが1をセットすると、機能がenableになるたぐいのものだと思う。xv6では全て0にセットされている。Registerと呼ばれる。Interruptをenableにするflagだとある。UARTの受信データが届いたときにinterruptを発生させるかのフラグ。bufferが空になったことをinterruptによって伝えるものだ。UARTの「その後」の節で触れるように、consoleへの出力の際にUARTが使用されるので、そのたびにinterruptを生じては困るのでOFFにしている。0xFFがtrue出ないかどうかの確認をしている。errorのbitが並んでいる。bitが立つのでこのような確認をしているものと考えられる。inb(COM1+0);の設定。Registerを空読みしている。ここはinterruptの状態をreset(初期化)しているようだ。Registerのこと。Registerのこと。Error(THRE)をresetしているようだ。Register自体はCOM1+5のbit5で使用できる。vector(32+4)とredirection先となるCPU#0を書き込む。APICの設定説明と似たような感じなので、省略。controllerの章の「その後」の節で少し触れた。kbdgetcで得られたascii文字をconsole上に出力する。ONにしたので、interrupt(IRQ4)が発生する。consoleintr(uartgetc);}consoleintrはkeyboardのinterruptと同じだった。(ushort*)P2V(0xb8000);)されているので、この部分を中心に見ていくことにする。addressへの変換のマクロ。addressなので。以下の説明は全面的にReference[3-2]に依っている。VGA)のような感じで上位互換の関係になっている。AT互換機の殆どがVGAをサポートしているため、xv6でもVGAで(カーソル部分を)描画している。機能的にはカーソルの描画とカーソル位置の取得更新のみしか扱っておらず、CGA相当の機能しか用いられていない11。表示データを記憶する。0xB_FFFFにマップされている。3D5を介して操作12)。controllerを用いている。mode)の表示の制御を行う。INT10HをBIOSに送ることで表示に必要なサービスを提供する。Tube)はディスプレイのことで、この辺の物理的な仕組みについてはReference[3-1]が分かりやすいと思う。3D5)のread/writeを行い、VRAMに書き込んでいる。xv6では、(少なくとも明には)後者3つの機能は用いられていない。本章では、前者2つの機能に絞って説明する13。B0000hexとある14。VGAは0xA_0000からスタートのようだ15。(ushort*)P2V(0xb8000);にセットされている。controllerはMC6845互換になっているので、一次情報であるReference[3-4]を用いてなるべく確認したい。controller(内部)とCRT(ディスプレイ本体)は違うものなので気をつける。high)を0x3d4(address)に指定し、0x3d5(data)を読むことでで位置(上位8bit)を取得している。low)を0x3d4(address)に指定し、0x3d5(data)を読むことでで位置(下位8bit)を取得している。address=10となっている模様。(ushort*)P2V(0xb8000);のindexである。80*row=posになっている。(というのもCGAは80*25/16色のカラーテキストをサポートしているため。Reference[3-2]を参照のこと。)cgaputc関数の中でcharacter(c)が引数になっているので、これを元に更新される。spaceテキストモードでは、VRAMに文字コードを書き込めば、ビデオシステム内のフォントデータを用いて自動的に各ピクセルのデータに変換される。no)となっているようだ。カーソルの位置の更新をする場合は以下のような感じ。states.とある。"Exception発生直後のhardware(x86)の対応"を参照↩PIIX4のAPIC_BASEでPCIを介して変更可能だが、普通はデフォルトのまま。Completionを参照のこと。書き込む値が0なのかの必然性が分からなかったので、誰か教えてくだされ。controllerへの操作となっているがこちらはMDA(モノクロ)用。VGAのハードウェア構成が良いと思う。Reference[3-4]のFigure1が簡易的な模式図となっている。byte空間では足りない。BIOSを用いてその編制御しているものと思われる。callの内部実装の違い(xv6を例に)月別アーカイブはてなブログをはじめよう!knknkn11626さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。