目次

ytakanoは書きました

  • 「はりぼてOS」が基底となっております。
  • 下記から拾っても、他の環境では動かない可能性があります。
  • 実機環境は、「Pentium-133[MHz]」ですので、これ以外では動かない場合があります。
  • 仮想環境は、(2011-05-26)現在Windows7上のVirtualBox4.Xです。これ以外では作業をしていません。
  • 【記】http://www6.shizuokanet.ne.jp/ytakano/

PCIと機器設定

  • PCI−BIOSが搭載されているのであれば何も考える必要がありませんでした。
    注意する点と言えば、機器が数珠繋がりになっているので、機器ごとの割り込み処理内で、
    管理下の装置が発行している要求の有無を検査しなければならないと言うことだけ。
    要求していれば処理するし、していなければ何もせず割り込み処理を抜ければ良い。
    ただそれだけ。
    割り込み制御側のリセット(EOI)とかは、エッジセンスの時と変わりません。
    最後に一回行えば良いわけです。各割り込み処理内で行ってはいけません。
    むろんの事ですが、PCI対応BIOS非搭載であったり、PCI対応BIOSの設定してくれた内容
    を替えたい場合は、あれやこれやとせねばならんのですが、全部お任せにしてしまえば、
    後は謎の回路が始末してくれているみたいです。互換機の互換度ってすげ〜。
    ちなみに、I/O APIC?難しそうなので使っていません。

堅い円盤

「HDD起動」をはりぼてOS(拙作版)用にでっち上げてみました。
ゴールはさらに遠くなり(新たな問題が・・)、山は増える一方ですが、なんとか起動できるようになりました。

  • 実機にいきなりは無謀だろう
    実機のハードディスクに書き込める度胸はありませんので、まずは仮想ディスクから。
    ではどの型式にするかなのですが、Windows7機能として作成できるし、Virtual Boxでも使えるし、
    QEMUでも(今の所)問題なく取り扱えたので、VHD型式に決定。
  • [GB]サイズの取扱い。
    家のハードディスクには、そんな容量余裕はないので却下。32[MB]で十分。
    拡張bios呼ぶのも面倒だから嫌。
  • さて、ひとまず32[MB]でも
    とりあえず調査目的で総量32[MB]のディスクを<FAT>で作成してみました。
    基本区画を8[MB]毎に3区画。
    自動的にFAT12になったMBRの区画情報の中身は次のようになっていました。
    00000000|                                           00 02
    00000010| 03 00 01 07 06 01 80 00-00 00 00 40 00 00 00 07
    00000020| 07 01 01 0C 0A 02 80 40-00 00 00 40 00 00 00 0C
    00000030| 0B 02 01 11 0E 03 80 80-00 00 00 40 00 00 00 00
    00000040| 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA
    詳細は別に譲るとして、最初の区画が3Fhセクターではなく、80hセクター目になっていました。
  • 第2区画を起動ディスクに割り当ててみる
    00000000|                                           00 02
    00000010| 03 00 01 07 06 01 80 00-00 00 00 40 00 00 80 07
    00000020| 07 01 01 0C 0A 02 80 40-00 00 00 40 00 00 00 0C
    00000030| 0B 02 01 11 0E 03 80 80-00 00 00 40 00 00 00 00
    00000040| 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA
    はい、ちゃんと起動フラグが立ちました。
    あ、何も指定しなくても勝手にIPLを書き込んでくれるのね。
    そのBPBは、次のようになっていました。
    00000000| EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 04 08 00
    00000010| 02 00 02 00 40 F8 0C 00-3F 00 FF 00 80 40 00 00
    00000020| 00 00 00 00 80 00 29 A6-4F 4B 96 4E 4F 20 4E 41
    00000030| 4D 45 20 20 20 20 46 41-54 31 32 20 20 20 
    ヘッドが255個もあるって言ってますね、大丈夫だろうか。
    知りたかったのは、+1Ch目の値。当該IPLがどのセクターに存在するのか。
    どうやって、IPLが知るんだろうと思っていたのですが、「隠しセクター項目」がそれっぽい。
  • MS-DOS6.2で[format /s]
    なんとなく255ヘッドが気になったので、MS-DOS6.2でFDISK。
    今度は区画を32[MB]一つとしてFAT16で作成。
    そうすると、区画のBPBは次のようになりました。
    00000000| EB 3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 02 00
    00000010| 02 00 02 00 E8 F8 E7 00-3F 00 10 00 80 00 00 00
    00000020| 00 00 00 00 80 00 29 FB-11 32 35 48 41 52 49 42
    00000030| 4F 54 45 20 20 20 46 41-54 31 36 20 20 20
    こっちは、10h面って言っていますね。
  • 全部作るの?VHD
    いきなりは無謀だろうと言う事で、原本を作っておいて、コピーして上書きする事に。
    まぁ、そのうちVHDフッターとMBRを作って・・・・いつになるかな。
  • さぁ起動だ!
    MBRはコピー物。IPLもセクターが判ればなんとかなる。
    という事で作ってみました。
    ; --------------------------------------------------
    ; HDD用IPLの掲載は終了します・・長いので(2012.6)
    ; --------------------------------------------------
  • ヘッドの数について
    やっぱり、ヘッドが255個もあると読めないみたいです。
    あっさりエラーになってくれました。

いつもより速く動く堅い円盤(仮)

長年の目標であった、ハードディスクのDMA読み書き化にようやく到達。
同時に不具合やら、問題やらがチョモランマ。どうすべ。

  • 用意するもの
    • 1.PCIバスコンフィギュレーションを読み出せるコード(書いて下さい)。
    • 2.PIOで読み書きできるハードディスクドライバコード(書いて下さい)。
    • 3.できればFDCのDMA処理ができていると良い。
      • DMA処理手順は、FDもATAも変わりません。仕組みが同じなので当たり前ですけど。
  • ATAの解説では少し不明だった分
    • IDENTIFY DEVICEコマンドで読み出した256語(512バイト)より
           F                                                          0
        ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
      53|予|予|予|予|予|予|予|予|予|予|予|予|予|2 |1 |0 | 53語目をshortで読み出した場合。
        └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
        [2] Word88   有効     Ultra DMA(以下UDMA)選択状況。または機器が有するUDMA機能
        [1] Word64-70有効     とりあえず未使用なのでどうでも良い
        [0] Word54-58有効     同上
        予:予約   大抵は0(期待してはいけない)
        廃:廃止   たぶん0(期待してはいけない)
        不:不明   わからない
  • 機器が対応しているATA/ATAPIの機能を示します。
         F                                                           0
      ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
    80|予| e| d| c| b| a| 9| 8| 7| 6| 5| 4| 3| 2|廃|予| 
      └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
  • UDMA転送モード
         F                                                           0
      ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
    88|予| 6| 5| 4| 3| 2| 1| 0|予| 6| 5| 4| 3| 2| 1| 0| 
      └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                                  選択中                         機能有
    88語目のビット8から14までが、現在選択中のUDMAモードになります。
    現在は、BIOS設定で既に割り振られているものとしていますので、参照するだけですが。
    下位バイトは、UDMA機能を有しているとビットが立ちます。UDMA-6機能を有していると、
    それ以下のビットが全部”1”になります。
    VirtualBox4.xのPII-X4チップセットはUDMA-2までの対応なので、
    仮想ハードディスクがATA-6対応であっても、UDMA-2機能以下しか選べません。
  • PCIコンフィグレーション
    • インテルさん家からPII-X4の仕様書を拾って来て下さい。デバイスIDとか、PCIレジスタの内容とかが記述されています。
      QEMUの場合は、PII-X3みたいです。
      「IDE Controller IO Space Registers」と言う項目辺りにPCIレジスタの内容が書かれています。
  • 大まかな手順
    • 1.PCIレジスタアドレスの取得
      • PCIコンフィグレーションを検索して、(0x8086/0x7111)のデバイスを探します(PII-X4の場合)。
        そのI/O空間アドレスを取り出します。
  • 2.IDENTIFY DEVICE命令を発行して諸元を求めます。
    • シリンダ数やらLBA数やらと、53語目の内容を取得して、88語目が有効かどうかを判断します。
      88語目の上位バイトが0ですと、たぶんUDMAは使えない装置です。あきらめましょう。
  • 3.UDMA処理について
    • 「SET FEATURES」命令を使います。
      レジスタバイト
      Feature0x03
      Sector Count0x40 + 転送モード番号
      Sector Number0x00
      Cylinder Low0x00
      Cylinder High0x00
      Device/Head0xa0
      Command0xef
      Sector Countレジスタへの0x40がUDMA指定で、次に続くRead/Write命令がUDMA転送である事を指示します。
      「転送モード番号」はUDMA-6が6で、以下UDMA-0の0までを番号で指定します。
      「Device/Head」のビット4は、デバイス選択ですが、今は使っていません。
      転送処理が終了したら、Sector Countを0にした同命令を送ってPIOに戻しておきます。
  • 4.処理手順です
    あ、その前にチップセット仕様書で用語を調べて下さい。
    PRD(Physical Region Descriptor), BMICx, BMISx, BMIDx(xは、[P:プライマリ][S:セカンダリ]が入る)とかです。
    • PRDテーブルの掟
      (1)PRDテーブルの先頭番地は4バイト境界でなければならない。
      (2)PRDテーブルは、64[KB]境界をまたいで配置できない。
      (3)転送先の先頭番地は偶数で、転送長も偶数バイトである事.
      最初の4バイトが転送先の番地で、次の4バイト中下位2バイトが転送長です。 必要ならいくつか要素を持つことができます。
      最後の要素の最上位ビットを1にすると、テーブルの最後となります。
  • UDMA転送設定を行う
    BMIDxへPRDテーブル番地を設定する。
    BMICxへDMA転送方向を設定する。
    BMISxのエラー[1]と割り込みビット[2]を落とす(1を書き込む)。
  • ATAデバイスの転送方式設定
    最初の「SET FEATURES」命令を送ります。
    ステータスを見て、完了を判断します。
  • 転送命令設定
    read(0xc8)/write(0xca)を、セクター情報と共に書き込みます。
    コマンドコード以外は、PIOの時と同じです。
  • バスマスター転送開始
    BMICxレジスタのビット0にstartをセットします。
  • 完了割り込み
    プライマリの場合は、割り込み14番に来ます。通常のエッジトリガ処理で対処できます。
    BMISxエラービット[1]が立っていなければ、正常終了しています。
  • 後始末
    BMICxのstartビットを落とします。
    「SET FEATURES」命令でPIOに戻しておきます。
    ステータスを見て、完了を判断します。
  • 終わり。
  • 5.忘れ物
    • Device Controlレジスタ (8bit, W, 0x03f6)
      bit1:nIEN   1のとき、両方のデバイスについてINTをマスク(割り込みが発生しない)
  • 0x00を書き込んでおくこと。すっかり忘れて大停滞していたのは内緒です。ここ試験に出ます。

GDBと繋いで幸せにな・・れるのか?(2012.06)

拙宅環境では、過去何度試みても入らなかった「eclipse」とやらがなぜかあっさり入ってしまった(3.7版)。
調子に乗ってついでにGDBとやらを調べてみたら、どうもスタブ言うのが必要らしい。
仕方がないので、でっち上げました。→ 「http://www6.shizuokanet.ne.jp/ytakano/software/src/Haribote/haribote27f_gdb01.zip

>gdb
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32". ...使用中のGDBは、mingwのオマケ。
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) set remotebaud 115200           ...通信速度を115200にする命令らしいです。
(gdb) target remote com2              ...com2で通信します。
Remote debugging using com2
0x00006604 in ?? ()                   ...break関数コールで止まるとこんな感じ。
(gdb) x/30i 0x280024                  ...逆アセンブルしてみました。
   0x280024:    push   %ebp
   0x280025:    mov    %esp,%ebp
   0x280027:    push   %edi
   0x280028:    push   %esi
   0x280029:    push   %ebx
   0x28002a:    lea    -0x5c(%ebp),%ebx
   0x28002d:    sub    $0x454,%esp
   0x280033:    movl   $0xffffffff,-0x420(%ebp)
   0x28003d:    movl   $0x0,-0x424(%ebp)
   0x280047:    movl   $0x7fffffff,-0x428(%ebp)
   0x280051:    movl   $0x0,-0x42c(%ebp)
   ・・
   0x2800bf:    push   $0x0
   0x2800c1:    push   %eax
   0x2800c2:    push   $0x80
   0x2800c7:    push   %ebx
(gdb) x/10b 0x280000                  ...メモリー内容を参照してみました。
0x280000:       0x00    0x70    0x31    0x00    0x48    0x61    0x72    0x69
0x280008:       0x00    0x00
(gdb) b *0x2803e6                     ...停止点設置
Breakpoint 7 at 0x2803e6
(gdb) c                               ...実行継続
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x000003e7 in ?? ()
(gdb)                                 ...おぉ!なんか動いている

えぇ、これ以外はまだ未検証なんですよ。はっはっは。
ついでに、上記はVirtualBoxのゲストOSである[WindowsXP]上のコマンドプロンプトで取得したものです。
拙宅環境では、「Haribote27f」も同様にVirtualBoxのゲストOSとして動かしています。

  • 大まかな手順
    • 1.「http://www.gnu.org/software/gdb/」の辺りからGDBを拾って来ましょう
      • 本体を再構築するわけではないので、展開したファイル群から必要なのは、 スタブ見本である「<展開先>\gdb\i386-stub.c」だけです。再構築をする場合は、適宜実施して下さい。
    • 2.スタブ見本をHaribote用に修正します(修正後のはzipの中に入っています。許諾に注意して下さい)。
    • 3.シリアル通信処理を記述します。「8250」か、「uart 16650」とかで検索してみて下さい。
      割り込みは未使用ですので、フラグ類だけを参照すれば良いかと思います。
  • 「haribote27f_gdb.zip」について
    • 1.開発環境は、書籍付属のものそのままです。
    • 2.書籍付属CDの「haribote27f」をハードディスク等にコピーします。
    • 3.「haribote27f_gdb.zip」を適当な所へ展開したら、そのままフォルダー名に注意しながら、
      2.でコピーした「はりぼてOS」に上書きすればなんとかなると思います。
    • 4.QEMUでは試していません。「make full」でイメージを作成したら、VirtualBoxのフロッピーに登録して起動して下さい。
    • 5.途中で止まります(bootpack.cにbreak関数記述があります)。
    • 6.gdbから接続できたら、あとはよしなに。

枯れ木も山の賑わい(13.01)

  • 静かなので、賑やかしに。以下は「30_day/harib27f」を元にしています。
    初代試作版は『RFC?何それ』ででっちあげたため、ARP→ICMP→UDPと進むも案の定TCPで躓き敗退。
    やっぱりまじめに手順を踏まないとだめか〜?で放置する事幾星霜。
    面倒だから何処かに落ちていないかな〜と探していたら「lwip」なるものが!
    でもソースを見るとz_toolsにない見たこともないヘッダ名が・・・だめじゃん。
    作るしかないかなぁ〜とさらにさまようと、ありました「kozos」。
    H8用?近いじゃん!x86と。同じ8だから仲間。と言う事で参考にさせて頂きました。
    よくよく見れば友の会の会員表に載っている方ですね。
  • 仮想環境はVirtualBoxです。
    便利ですよね、仮想環境。ありがたやぁ〜。
    haribote用と、hariboteとの通信用に別途ゲストOSの設定が必要です。適当なOSを用意して下さい。
  • 「harib27f_net01_src.zip」について
    ソースはここから→「http://www6.shizuokanet.ne.jp/ytakano/software/src/Haribote/harib27f_net01_src.zip
    イメージはこの辺→「http://www6.shizuokanet.ne.jp/ytakano/software/bin/Haribote/harib27f_net01_bin.zip
    • ZIPを展開すると、[展開先\projects]の下にわらわらとフォルダーができます。
      注)既に「harib27f」がある場合は、上書きしないように気をつけて下さい。
    • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
    • [導入先\projects\>make create]とすると、中間出力フォルダー(zout)ができると思います。
    • [導入先\projects\>make full]とすると、projectsフォルダーに「haribote.img」が作成されるはずです。
    • [導入先\projects\>make clean_full]とすると出力物は全部消えます。
    • 後は、VirtualBoxのFDDとして起動すれば動くような気がします。
    • haribote側では、デバッグ表示とGDB用にシリアル1と2を「ホストにパイプ」として子機設定しています。
      シリアルポートを利用しない場合は、無効にして下さい。
      対になるゲストOS側でも同様にシリアル設定を行い、そちらの方は「パイプを作成」を有効にし、親機として使用します。
      シリアルを利用する場合は、親機側のゲストOSを先に起動しておかないと「パイプ」がないと怒られます。
    • haribote側のIPは「192.168.56.2」になっています。
    • あ、ネットワークは「ホストオンリーアダプター」で、アダプタータイプは「PCnet-FAST3(Am79C973)」です。
      「ホストオンリー」設定ではゲストOS同士でしか繋げた事がありませんので、ホストOSとの間ではどうでしたかね?
      ま、よしなに。
    • 適当なブラウザで「http://192.168.56.2/index.html」とすれば、表示されるかもしれません。
      仮に運良く表示されてもその表示内容は気にしないで下さい。

枯れ木も山の賑わい(13.06)

にぎやかし其の2。!NET はりぼてフレームワーク

  • 「.NET Micro Framework V4.2」をはりぼてOS(拙作版)用にでっち上げ。
    ずいぶんと前に偶然と奇跡が働きなんとか動いたものの、OS側へ手を加えたら動作不全に。
    その後は何をどうしても動かす事ができず絶賛大放置中だったのですが、
    ようやく「SerialPort x = new SerialPort("COM1")」が動きました。
    とは言え、また偶然だったりしますけど。.NET昇格はまた先送りです。
    いつの間にか、本家はVer4.3になってしまいましたが、とりあえずVer4.2のまま。
  • イメージはこの辺→「http://www6.shizuokanet.ne.jp/ytakano/software/bin/Haribote/os2Siki_0012-vhd.zip
    • 展開するとVHD形式ディスクイメージになります。VirtualBoxにマウントして下さい。
  • その他はこの辺→「http://www6.shizuokanet.ne.jp/ytakano/software/html/mfwV4_2_index.html
  • 稼働環境の注意書きは、【枯れ木も山の賑わい・無印】と同じです。
  • 毎度おなじみで、動かない場合はあきらめて下さい。

枯れ木も山の賑わい(14.05) ACPIシャットダウン・・だけ

  • とっても静かなので、賑やかしに。以下は「30_day/harib27f」を元にしています。
    電源を「ACPIシャットダウン」で切りたいじゃん(要VirtualBox)。
    でもサブシステムは巨大だしぃ〜、面倒だから何処かに落ちていないかな〜と探していたら・・世の中広い!
    と言う事で参考にさせて頂きました。元のソースとは設定周りで少し違います。
    ってか、元のソースは動いたのかね?まぁいいか。
  • 仮想環境はVirtualBoxです。実機検証はありません。
  • 「はりぼてコンフィギャー&パワーインターヘース」について
    ソースはここから→「http://www6.shizuokanet.ne.jp/ytakano/software/src/Haribote/harib27f_acpi_src.zip
    イメージはこの辺→「http://www6.shizuokanet.ne.jp/ytakano/software/bin/Haribote/harib27f_acpi_bin.zip
    • ZIPを展開すると、展開先の下にわらわらとフォルダーができます。
      注)既に「harib27f」がある場合は、上書きしないように気をつけて下さい。
    • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
    • 環境設定は、書籍付属のものと少し違います。お手元の環境に合わせて下さい。
    • 後は、VirtualBoxのFDDとして起動すれば動くような気がします。

枯れ木も山の賑わい(14.05) Haribote Precision Event Timer

  • 前回の続きで、賑やかしに。以下は「30_day/harib27f」を元にしています。
    タイマーを「HPET」で動かしたいじゃん(要VirtualBox)。
    と言う事で「はりぼてタイマー」
  • 仮想環境は「Windows + VirtualBox」です。実機検証はありません。Linuxの事は存知ません。
  • 「はりぼて・プレシジョン・イベント・タイマー」について
    ソースはここから→「http://www6.shizuokanet.ne.jp/ytakano/software/src/Haribote/harib27f_hpet_src.zip
    イメージはこの辺→「http://www6.shizuokanet.ne.jp/ytakano/software/bin/Haribote/harib27f_hpet_bin.zip
    デバッグ用の表示は整理してありませんので、よしなに。
    • ZIPを展開すると、展開先の下にわらっとフォルダーができます。
      注)既に「harib27f」がある場合は、上書きしないように気をつけて下さい。
    • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
    • 環境設定は、書籍付属のものと少し違います。お手元の環境に合わせて下さい。
    • 後は、VirtualBoxのFDDとして起動すれば動くような気がします。
  • 割り込みが来るまで
    • 「software-developers-hpet<検索↓>」
      インテルさん家に「software-developers-hpet-spec-1-0a.pdf(14.05現在)」(参1)が落ちていると思われますので、拾って来ます。
    • ACPIさん家(http://www.acpi.info/)から最新の仕様書(参2)を拾って来ます。
    • コマンドプロンプトで「VBoxManage modifyvm 仮想名 --hpet on」を実行しておく事。
      これをしておかないと、RSDT内にHPET項目が現れてくれません。
    • HPETはメモリ−マップドらしいので、BIOSのメモリーマップ→RSDT→HPETテーブルと探し出します。
      • 見つけ方は、(参2)§5.2.5.1にあります。自分で探せって事らしいです。
        (参2)§15.1にはBIOSコールで取得する方法があります。こちらはシステムのメモリーマップが返されます。
        ソースでは、asmhead.nasに関数があります。リアルモードにいる間に取得しちまえって事で。
        得られるマップからACPIが使用している領域((参2)Table 15-270 Address Range Types)を選び、
        そこにある"HPET"で始まるテーブルを探します。
        書式は、「(参1)3.2.4 The ACPI 2.0 HPET Description Table (HPET)」にあって、
        その内のBASE_ADDRESSの中身は、
        「(参2)5.2.3.1 Generic Address Structure」にありまして、それのAddress項目の内容(下位32bit)がI/Oアドレスです。
    • (参1)§2.3辺りにレジスタの説明があります。旧PITを代替して割り込みを入れられるとあります。
      • これに従ってレジスタを設定すれば割り込みが入る・・はず。
        なんですが、動いた物はなぜか仕様書と違っていたりするんですけど、なぜかな?

枯れ木も山の賑わい(14.11) LWIP再び。「!net」は、「.net」の夢を見る。

  • 毎度ぉ〜賑やかしに。以下は「30_day/harib27f」を元にしています。
    ずいぶん前にRFCをほぼ無視したネットワーク処理を作って敗退。
    結構前にkozos氏のシステムを元に作成するも、異常処理等を組み入れるのが面倒になって絶賛大放置。
    さて、今回は前回見送ったLWIPを入れてみる事にしました。
    ほけ〜っと眺めれば、LWIPが必要とするヘッダ等はとりあえず全て揃っている様子。ただ単に置いてある 場所がえらく深い所にあって、定義するのが面倒そうだと言う事だけでした。
    それから「contrib」って言う移植用パッケージも必要らしいですよ。前回はそれを知らずにエラーがドバー。
    グーグルさんにExciteしてもらって移植のお知らせを見てみると、移植用パッケージにあるcc.hとか、lwipopts.hとか を記述して、仲介・整合処理であるsys_arch.cの辺りをなんとかすれば良いらしい事も解りました。
    当然sys_arch.cが必要とする排他とか、スレッドとかを組み込まねばなりませんが、 都合の良い事に、前回とりあえず単発で作ってあるので持ってくれば良さそうです。 もっとも碌にデバッグなんぞしていないので、まぁそれなりに問題が出てくるんでしょうけど。
    人様のシステムを使う時は、あちらに合わせてご機嫌を取らないといけないのが面倒です。
    前回の続きではありませんので、注意して下さい。
  • 仮想環境は「Windows.7 + VirtualBox」です。実機検証はありませんし、Linux(mac)の事は存知ません。
  • まずは、LWIPってどうなっているのさから
    スレッドを使用するみたいなので細かに分かれているのかと思いきや、適当に眺めた限りでは、コールバック方式で処理関数を直接 呼び出しているようです。なんとな〜く不安だね。
    どういう事かと言うと、connectするとします。普通接続時は最初にARP要求が出ます。
    それからARP応答が割り込みに来たとして、受信割り込み内からLWIPの受信処理を呼び出してしまうと、 LWIP内で電文解析後に最初の電文であるSYNがその受信処理内から送出される事になるはずです。一連の処理は、なんとかしないと割り込み処理から呼び出されたままと言う事になりかねません。
    仮にそう言う流れであれば、LWIP内の受信処理を割り込み内から直接呼び出すわけにはいきませんし、受信処理にどれくらいの時間がかかるのかも定かではありません。どないしましょ。
    世間様はどうやって回避しているのでしょうか、あるいはLWIPさんが適当に処理してくれているのか。ん〜、全然見当もつきません。
  • とりあえずこうしましょ。
    んでまぁ、内蔵consoleコマンドとしてソケット処理を作って、デバイスドライバーと共にLWIPはタスク化する事にしました。
    外部アプリケーションとすると、冗談みたいな数の仲介用apiを増設する必要があるからです。
  • アプリケーションは
    「AVR32 LWIP Workshops」<検索↓>するとアプリケーション見本が落ちています。LWIPが持つ3階層のそれぞれに見本を 作ってくれています。親切な会社です。拾って来て少し変更します。
  • VirtualBox用ドライバーは
    VirtualBoxの「ホストオンリーアダプタ-」は、AMD PC-net対応のをそのまま引きずっています。
    たしかTEENなんとかと言う組み込みOSのドライバー(アセンブラ製)から起こしたような気がするのですが、細かい事は忘れました。
  • LWIPの処遇は
    さて本体ですが、割り込みからドライバータスクへ通知だけを送り、タスク内でデータを読み出したら、 LWIPタスクに受信バッファを渡す手はずです。
    そうしておけば、LWIPが送信処理を実行して、consoleコマンドから実行されているconnect()とかsend()やらとぶつかっても 送信時の排他を入れておけばタスクが違うからなんとかなるべ?というお気楽仕様。
  • LWIPの所在は
    「LWIP DOWNLOAD」<検索↓>とすると、「LWIP - A Lightweight TCP/IP stack」が見つかると思います。 そこから「contrib-バージョン」「LWIP-バージョン」というのを拾って来て、適当な所で展開して下さい。 開いたら中身を「<導入所>\haribote\subsys」の下にフォルダー毎コピーします。
    そのフォルダーに「contrib-x.x.x\port\haribote」とLWIP下のmakeファイルをコピーして、環境を整えて下さい。
  • どこを替えたの
    "/* ["の文字列で検索すると、修正部分を選択できると思いますが、「bootpack,fifo,mtask,timer辺りと割り込み処理近辺」です。
    元にないファイルは、追加分となります。
  • ちゃんと動くの?
    さぁ?別の仮想環境にあるWindows-XPでIIS-5を動かして「sockc」コマンドは動きました。 『apache?アパシェ?なんですかそれ』
    同OSからIE8ではりぼて上の「sockd」に繋ぐとそれなりに応答しました。
    あ、ちなみに上記二つとも一度動かすと止まりませんので、終了は仮想環境そのものを落として下さい。
    同じくXPから「ping」を発行すると応答しました。
    これ以外はまだなぁ〜んにも試していません。他の事を試すなら相当の覚悟が必要です。
  • と言う事で
    ソースはここから→休載中
    FDイメージはこの辺→休載中
    注)既に「harib27f」がある場合、上書きには気をつけて下さい。
    • デバッグ用の表示は整理してありません。ゴミだらけです。よしなに。
    • 未だ不良箇所が残っているはずですので、動かない場合はすっぱりあきらめて下さい。
      IPV4アドレスは、はりぼてが「192.168.56.2」で、接続先は「192.168.56.5」に固定されています。
  • ZIPを展開すると、展開先の下にわらっとフォルダーができます。
  • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
  • 環境設定は、お手元の環境に合わせて下さい。
    フォルダー毎にmakefileがあるので、修正しているとだんだんいらついてきます。落ち着いて下さい。
    「make full」した後は、VirtualBoxのFDとして起動すれば動くような気がします。

枯れ木も山の賑わい(14.12) 頁(ing無し)

毎度、枯れ木屋でございます。

  • 無限に広がる主記憶の宙
    嘘です。なんとなくシステム領域を0xf0000000へ移してみました(見かけだけ)。
  • 仮想環境は「Windows.7 + VirtualBox」です。実機検証はありませんし、Linux(mac)の事は存知ません。
    前回の続きではありませんので、注意して下さい。
  • [.data]領域をどうするか
    .text部分は元々相対なので、GDTのベースアドレスを設定するだけなので良いのですが、.data部分はどうすれば良いのかなと。
    とりあえず「haribote.sys」専用の「harisys.rul」を作って見ました。
    logic:stack_endの所をlogic:0xf0310000に変更してあります。
    0x310000というのは、makefileのstack:3136kに由来します。
  • GDT(init_gdtidtの辺り)
    ディスクリプタから出される番地は、どうやら線形番地そのものみたいなので、コード分は仮想値に変更します。
  • IDT
    こちらは、セグメントセレクタ込みで設定しますから、相対値だけですみます。すなわち何もする必要はありません。
  • MEMMAN
    面倒なので実番地=仮想番地になるようにしました。とは言ってもテーブル設定は必要です。
  • INT#14
    ページフォルトの処理を入れます。中身は何もしていません。は・り・ぼ・て
  • VESA-VRAM
    描画されないっ!#14へ飛んで来てしまう。0番地セグメントはディレクトリエントリしてあるのにぃ〜。
    そうです、vesaのビデオRAM番地は[VRAM]に入っていて、0xe0000000なんですよ、忘れていました。
    これも実番地=仮想番地になるようにディレクトリを構成します。
  • CR3
    タスクが切り替わらん!
    そりゃそうだ。TSSをよく見れば、cr3と言うメンバが入っている。あぁ、本物の切り替え用かぁ〜。
    えぇ、もちろん今は即値です。
  • これで見かけは原点復帰
    頁化の意味は?全くありません。さて、CR3はどうやって管理するんでしょうね。
    「qemu」だとキー入力が遅くなる現象が発生しますが、不明な点は気にしないようにしましょう。
  • と言う事で
    fd形式は→(15.03)に併合されました
    ソースは→(15.03)に併合されました
    注)既に「harib27f」がある場合、上書きには気をつけて下さい。
  • デバッグ用の表示は整理してありません。ゴミだらけです。よしなに。
    • 未だ不良箇所があるかもです。動かない場合はすっぱりあきらめて下さい。
  • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
  • 環境設定は、お手元の環境に合わせて下さい。

枯れ木も山の賑わい(15.02) はりぼてさんは音無ぃ(SB-16)

毎度、枯れ木屋でございます。

  • 仮想環境は「Windows.7 + VirtualBox」です。実機検証はありませんし、Linux(mac)の事は存知ません。
    前回の続きではありませんので、注意して下さい。
  • 資料を探そう
    参1)『Written by Ethan Brodsky』<検索↓>
    参2)『sbhwpg.pdf』または、『SoundBlaster.pdf』<検索↓>
    参3)『ChaN's FAT-Module with LPC17xx SPI/SSP and USB-MSD』<検索↓>
    参4)『Open Host Controller Interface Specification for USB』<検索↓>
    参1は、ソース見本があります。参2はハードウェア仕様書です。
    参3は、ソースが落ちています。オランダの親切な会社です。参4はUSB-OHCIの仕様書。
  • 音を出しましょ
    最近は、『AC'97』とか『Intel HD』だのですけど、とりあえずサウンドブラスター。
    古のほぼ業界標準ですから、見本は沢山転がっています。
    とは言え、大体がDOS用ですから、それなりになんとかしないといけません。
    初期化の部分とか、バッファとかを適当に作って、質は悪いのですが音は出ました。
    それと出力だけです。入力(録音)はありません。
    注)音量は絞っておいた方が良いです。
  • 8237A
    バイト転送しか使った事がなかったんですが、PCのワード転送は、カウンタはともかくアドレスも半分にしないといけないのでした、気をつけましょう。
  • 仮想環境にて
    VirtualBoxは、WAV音はどうにか出ましたけど、FM音源は検出できませんでした。
    QEMUの方は、書籍付属のものではサウンド指定そのものが効かないようです。最新のを拾って来て下さい。
    それだと、QEMU自体の動きが怪しいのは置いといて、FM音源はそれなりに検出できて、『mmlplay』も動きました。
    PCM音源の方は、音は出ますがなんか駄目々なので、まだなにか問題がありそうです。
    注)音量は絞っておいた方が良いです。大事な事は2度云々・・・
  • USBにメモリーを挿そう
    歌謡一曲分程度のWAVファイルは、大抵超巨大です。当然FDには入りません。しかたがないのでリーダ経由でSDカードから読み出すべく USBドライバーをでっち上げてみました。
    リーダ経由なのは、フラッシュメモリー直接だと、サブクラスコードがSCSIではないっぽいので、面倒だっただけです。
    手持ちのだと、ATAPIになっていました。
    consoleでwavコマンドが動いて、1[MB]読込に僅か1秒・・あれっ?・10秒・・おやっ?・・1分!?なんですとぉぉ。
    • ちなみに『sample.wav(44.1KHz 16bit stereo)』専用で、大英字数字8.3形式のFAT16のみ、1装置だけの取り扱い。
  • VirtualBoxでUSB
    林檎石の『KeyLargo』と言うのを模擬実行しているようです。仕様はOHCI。
    VirtualBoxでUSBデバイスを使う時はちょっと注意というか、事前作業が必要です。
    作業方法は、その辺に転がっていますので、適当に見つけて下さい。
  • と言う事で
    FD書式はこの辺→
    ソースはこちら→
    注)既に「harib27f」がある場合、上書きには気をつけて下さい。
    • いつものお約束で、動かない場合はすっぱりあきらめて下さい。
  • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
  • 環境設定は、お手元の環境に合わせて下さい。

枯れ木も山の賑わい(15.03) DynamicにLinkしてくれないLoader

毎度、枯れ木屋でございます。

  • 仮想環境は「Windows.7 + VirtualBox」です。実機検証はありませんし、Linux(mac)の事は存知ません。
    中身は大分変わっていますが、ing無しpageの続きです。
    『jpeg展開』とか独り占めはずるいじゃん、『API』とかいちいちリンクするのも実行形式が大きくなるだけじゃん、 みんなで仲良く使いましょ。
  • てなわけで、適当な思いつきで作って見ました。
    でも、coff-dllってどうやって作って、どうすればリンクできるんかね?何れにせよ面倒そうだわね。
    をっ!良い所にing無し頁機構があるではないか、それを使って固定ページを割り当てて、 空のテーブルエントリに『file_loadfile2』で読み込んだバッファの番地だけをコピーして来れば良いのではなかろうか。
    読み込んだファイルは一括して管理するAPIを作れば宜しかろう。はいっ!仕様決まり。
  • 資料を探そう
    参1)ないです、どうしましょ。
  • APIは
    0x40に追加するのは避けたいので、[naskfunc.nas]に呼び出し仲介関数を新築しました。
    API処理を適当に追加しても存在を文字列で確認できる仕組みを入れられないだろうかと言う事で、試しにヘッダを 追加してあります。ただ、今の所は所在確認用APIはありません。
    • api_loader
      指定したファイル(アプリ実行形式)を読み込んで管理に追加。呼び出したタスクの空きエントリにアドレスを格納します。
    • api_linker
      えぇ、再配置なんぞ致しません。先に追加した時に得られた4096[B]境界のオフセットを返すだけです。
      コード領域はこれでなんとかなるのですが、データ領域はどうにもならない(はず)ので、
      追加ファイル中では変数(.bss)、定数(.data)は一切使えません。
      追加ファイル中の関数を相互に呼び出す事もできません。やろうとするとすんごく手間がかかります。たぶん。
    • api_linkerを呼び出したら オフセット+0x1b番地にあるであろう関数を呼び出します。この初期化関数は、入力で与えられたオフセットを 使って、内部関数を間接呼び出し用構造体に登録して戻って来るようにします。
      後はそれを使って呼び出すだけ。ねっ?簡単でしょ、役に立たないけど。
  • HariMainはvoidじゃん
    標準状態では"void HariStartup(void)"なので、引数を取れるように改造しないといけません。
    『HariMainは嫌だ!』を参考に「スタートアップライブラリ」を作る必要があります。
  • 見本は
    『sample』と『jview』っていう外部コマンドを追加してみました。とりあえずは動いているように見えます。
  • と言う事で
    fd形式は→この辺
    ソースは→こちら
    注)既に「harib27f」がある場合、上書きには気をつけて下さい。
    • いつものお約束で、動かない場合はすっぱりあきらめて下さい。
  • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
  • 環境設定は、お手元の環境に合わせて下さい。

枯れ木も山の賑わい(15.05) 好きに作って仲良く使おうAPI

毎度、枯れ木屋でございます。

  • 仮想環境は「Windows.7 + VirtualBox」です。実機検証はありませんし、Linux(mac)の事は存知ません。
    前回の続きではありませんので、注意して下さい。
  • アプリケーションプログラムインターフェース
    書籍ではAPIに「INT命令」を使っていますし、最近のx86ではなんやら便利な命令が用意されているようです。
    INT命令の場合ですと固定番号になってしまい、動的呼び出しにするのは容易ではありません。
    固定番号によるシステム機能の呼び出しを統一するには、談合が必要となります(たぶん)。
    それは面倒で、時間がかかります。そこで各自が好きに作って持ち寄って、みんなで仲良く使いましょと言うのが今回の目的。
  • さてどうしましょ
    コールゲートを試してみましょう。
  • 何それ
    セグメントと、特権を超えられるcall命令の事で、こんな感じになっています。
         15  14  13 1  11      08 07  06  05  04          00
        ┌─────────────────────────┐
    +00 | セグメント内オフセット[15 - 00]                  | 実行関数低位番地
        ├─────────────────────────┤
    +02 | セグメントセレクタ                               | はりぼてOSコードセグメント(2 * 8)
        ├─┬──┬─┬────┬─┬─┬─┬───────┤
    +04 |P |DPL |S |  種類  |0 |0 |0 | 引数個数     |
        ├─┴──┴─┴────┴─┴─┴─┴───────┤
    +06 | セグメント内オフセット[31 - 16]                  | 実行関数高位番地
        └─────────────────────────┘
           P       : 1:セグメントがメモリ上に存在することを表す。
                   : 0:不在
           S       : 0
           DPL     : 呼び出し側の特権階層(ユーザーなので0x60です)
           種類    : 1100b	= 32bitコールゲート
    		引数個数: 32bit単位の引数個数を5ビットで指定する
    割り込みゲートみたいですね、まぁ同じだし。
    これをLDTに入れて、「call far LDT番号:0」とすると、はりぼてOS側の処理を呼び出してくれます。
  • 具体的にはどうするの
    API仲介処理はアセンブラ記述で、その先頭は次のようになっています
    添付ソースでは「haribote/subsys/cg/asmtomo.nas」にあります。
    _API関数:
           jmp short 本処理              ; + 00
           dw  0x0001                    ; + 02 major=0 minor=1(未使用です)
           dw  0x0000                    ; + 04 予備
           db  "haribote tomo api", 0    ; + 06 任意長の識別文字列
           align 4                       ; 境界整合
    本処理:
    適当に記述した文字列でAPI処理を識別して一覧を作っておき、アプリケーションが同じ文字列で照会してきたら そのタスクにあるLDTにゲートを構築し、番号を返すだけです。
    アプリケーションは、その番号を頼りにcall farする訳です。めでたし。
  • 処理速度は?
    ごちゃごちゃやっている割にはINT方式とさして変わりはないようです。
    tomoフォルダーのtomoコマンドで試して見て下さい。
  • 防犯対策は取れていますか?
    まるで考えていません。いいんです。世の中良い人ばかりです。そういう事にしておきます。
  • 持ち寄ったときの機能重複は?
    さぁ存じません。検出もできません。基本は放置です。
  • と言う事で
    fd形式は→この辺
    ソースは→こちら
    注)既に「harib27f」がある場合、上書きには気をつけて下さい。
    • いつものお約束で、動かない場合はすっぱりあきらめて下さい。ついでにいろいろゴミが混ざっています。
  • 開発環境は、書籍付属のものそのままです。projectsと同じ階層にz_toolsを置いて下さい。
  • 環境設定は、お手元の環境に合わせて下さい。

コメント欄

  • 謎の新回路はチップセット内に存在し、IRQ番号ごとにレベルにするかエッジにするかを選択できます。しかし実際の設定方法は僕にも分かっていません。 -- K 2009-09-24 (木) 01:56:04
  • PCIデバイスは今自分がIRQ要求を出しているかどうかを検出する方法が必ず用意されています(ステータスのビットなどで)。したがって、割り込みが起きた場合は、それをすべてチェックして、割り込みを起こしたデバイスがどれなのか調べます。複数あるかもしれないので、一つ見つけたからといって安心しないで最後までチェックします。見つけ次第割り込み処理をしていって、IRQ要求を下げさせていきます。全部終わったらPICに終了コードを送ります。 -- K 2009-09-24 (木) 01:59:00
  • あらま、これは初めまして。ν8259の外付けレジスタですが(0x4d0-4d1)、PCI-BIOSを作るでもしない限りは超法規的措置で良いと思われます。PCI機器に資源を割り当てる際に、空いている割込番号にレベル用のビットを立てているだけみたいです。実際は互換を維持するために結構面倒な事をしているのでしょうが、中の素子さんは見えませんから、問題が出るまで気にしない事にしました。 -- ytakano 2009-09-24 (木)
  • 相変わらず、面白そうなことをやっていますねー。どうもありがとうございます! -- K 2012-03-28 (水) 11:25:28
  • すごい・・・ -- K 2014-07-18 (金) 20:12:30

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2015-05-20 (水) 14:18:00 (1464d)