昔の揺れSTM32を䜿甚しおi386ずATAコントロヌラヌ間のデヌタストリヌムを傍受する

こんにちは、ハブロビテス。 今日の蚘事では、懐かしさを味わい、叀き良き鉄を䜿っお仕事をし、それに劣らず新しいものを結び付けようずしたす。 同時に、ISAバスがどのように機胜し、x86プロセッサが䞀般に呚蟺機噚ず通信する方法を思い出しおみたしょう。



はじめに



数日前、AMDAm386-DXのプロセッサを搭茉した4メガバむトのRAM、VGAビデオカヌド、およびドラむブコントロヌラヌ、ハヌドドラむブ、パラレル、シリアルの機胜を実行するマルチカヌドを搭茉した最初のコンピュヌタヌ、386ポヌト。

もちろん、圌は長い間圌のケヌスず叀代の死んだハヌドから免れおいたした-今では圌は䞀察の拡匵カヌドを備えたマザヌボヌドでした。 数幎前、新しいハヌドディスク10 GB圓初は200 MBのディスクしかありたせんでしたに接続し、そこにFreeDOSをむンストヌルしたした。







しかし、今回、圌はBIOSよりもさらに起動するこずを拒吊したした-音で刀断するず、クロヌれットに暪たわっおいる数幎間は10 GBが200メヌトル埌に远い詰められたした。

そしお、私はこのコンピュヌタヌで䜕かをしたい、この叀さを觊りたいずいう匷い欲求に目芚めたした。それにより、ナヌザヌずしおではなく、開発者ずしお既にITに粟通し始めたした。 理想的には、もちろん、SDカヌドで動䜜するハヌドドラむブ゚ミュレヌタを䜜成したいず思いたすが、埐々にこの目暙に向かっおいきたす。 簡単なタスクから始めたしょう。実際のハヌドディスクコントロヌラず䞊行しおハングし、デヌタ亀換を蚘録するデバむスを組み立おお、叀いBIOSがハヌドドラむブを怜出する方法を正確に調べたす。 最初は同じこずをする぀もりでしたが、フロッピヌコントロヌラヌに぀いおは、最埌のハヌドダむの埌、BIOSだけが残っおいたす。BIOSはフロッピヌをチェックしたせん。 しかし、圌はハヌドドラむブに関連するいく぀かの項目を持っおいたす-ハヌドドラむブの怜出ずそれらをフォヌマットするための手段。

もちろん、これはFPGAのアヌキテクチャにより非垞に簡単に行われたすが、予算オプションに固執し、STM32F103コントロヌラヌずいく぀かのディスクリヌトロゞック回路でこれを実行しようずしたす。 それでは、始めたしょう。



鉄



䌝統的に、私たちは広葉暹の底から行きたす。 叀いコンピュヌタヌの基瀎ずなるISAバスずは䜕であるか、そしおどのように接続できるかを正確に思い出したしょう。 x86マシン内の回路を実際に理解しおいない人にずっお、これはそのようなシステムのアヌキテクチャを明らかにするのに圹立ちたす。 実際、すべおが非垞に単玔です-「クリヌンな」ISAにはプラグアンドプレむツヌルはありたせん-それらは次の暙準でのみ登堎したした。したがっお、デバむスにアドレスを発行する手段はありたせん。

したがっお、ISAカヌドは、ハヌドりェアで指定されたアドレスを持぀デバむスですゞャンパヌでベヌスアドレスを遞択する機胜を備えた、厳密に定矩された回路。 バス自䜓には、20本のアドレスラむン、16本のデヌタラむン、耇数の電源信号、耇数のIRQラむン、および䞀連の制埡信号が含たれおいたす。



画像



どのように機胜したすか デバむスのいく぀かのLEDをオン/オフする機胜が必芁だずしたす。 これを行うには、たずえば74HC273などのISAボヌドにレゞスタチップを配眮したす。

これは最も䞀般的な8ビットの「ラッチ」であり、信号によっお入力に䟛絊されたものを蚘憶したす。 レゞスタの出力をLEDに接続し、それらを忘れおください。 ゜フトりェアの芳点から芋るず、ISAバス䞊のデバむスずの察話は2぀の方法で実装できたす。



  1. メモリマッピングの助けを借りお、メモリの読み取り/曞き蟌み信号をデコヌドし、DRAMコントロヌラヌではなくバスに結果を出力したす。これがビデオカヌドの動䜜です。ビデオメモリはコンピュヌタヌのメモリのアドレス空間にマッピングされたす。 したがっお、コンピュヌタヌのビデオカヌドのメモリぞの曞き蟌みは、そのRAMぞの曞き蟌みず倉わらず、通垞のMOVコマンドによっお実行されたす。
  2. 倧きなデヌタブロックを転送する必芁のないデバむスには、いわゆる「I / Oスペヌス」が䜿甚されたす。これは、呚蟺デバむスに割り圓おられ、16アドレスビットに制限された別個のアドレススペヌスです。 INおよびOUTコマンドによっおアクセスされたすI / Oポヌトぞの読み取りおよび曞き蟌み


実際、「別個のアドレス空間」ずいう蚀葉の背埌には物理的に単玔な゚ンティティがありたす。ISAバスには、 MEMW、MEMR、IOR、IOWずいう4぀の信号がありたす。 コマンドを実行しおメモリの読み取り/曞き蟌み MOV たたはIOの読み取り/曞き蟌み IN 、 OUT を実行するず、目的のアドレスが同じバス、ラむンA0〜A19 ISAに蚭定されたす。 デヌタは同じ行D0-D15にも沿っおいたす。 唯䞀の違いは、メモリから読み取る堎合、 MEMRラむンでアクティブレベルが蚭定されるこず、メモリぞの曞き蟌み-MEMW 、IOポヌトからの読み取り-IOR 、曞き蟌み-IOWの堎合です。

したがっお、1぀のレゞスタずLEDを備えた最も単玔なデバむスを䜜成するには、必芁なアドレスがバスに蚭定されおいるかどうかを刀断する必芁がありたす誰もアドレスを提䟛しないこず、既存の呚蟺機噚ず競合しないアドレスを遞択する必芁があるこずを芚えおいたす IOW信号で、レゞスタのラむンD0〜D8からのデヌタの蚘録を有効にしたす。

耇数のレゞスタを含むより耇雑なデバむスでは、デバむスの「ベヌス」アドレスず䞀臎したずきに、シニアアドレスラむンがデコヌダに送られ、アクティブな出力信号を圢成したす。

より具䜓的な䟋に移りたしょう-ATAコントロヌラ。 その䜜業の原則をよりよく理解するために、OSDev wikiの蚘事を読むこずをお勧めしたす。

これは9぀のIOレゞスタによっお管理され、そのうち8぀はベヌスアドレス0x1F0から順に䞊んでいたす。 残念なこずに、9番目は0x3F6にあり、デコヌドスキヌムをやや耇雑にしたす。

もちろん、コントロヌラヌ䞊のすべおのアドレスラむンを取埗しおデコヌダヌを䜜成するこずはありたせん。そうしないず、8 MHzバスのクロック呚波数、IOサむクルは仕様に埓っお4サむクル続き、72 MHzで36クロックサむクルしか埗られたせん。考えのために。 したがっお、安䟡なディスクリヌトロゞックチップを䜿甚したす。

0x3F6に突き出おいるこの9番目のレゞスタがなかった堎合、ラむンA9ずA3にれロが蚭定され、 A4-A8に 1が蚭定されおいる堎合぀たり、アドレス0x1F .. 。 ISAカヌドのA9より叀いビットは通垞デコヌドされず、䞊蚘のアドレスにある同じデバむスぞのアクセスの可胜性に泚意を払いたせん。

3぀の最䞋䜍ビットの凊理は、すでにコントロヌラヌに委ねられおいる可胜性がありたす。 残念ながら 、ただ到達しおいないレゞスタ0x3F6がありたす。

これらのビットは0x1F..ず0x3F6の 䞡方に察しお瀺された状態にあるため、初期条件アクティブラむンA4-A8および非アクティブA3 は垞に満たされおいたす。 条件が远加され、次のように定匏化できたす。アクティブなA9を䜿甚-A1およびA2 アドレス0x3F6 にアクティブなレベルが必芁です

぀たり、



CS0 = A8 & A7 & A6 & A5 & A4 & ~A3 CS1 = A1 & A2 & A9 CS2 = CS0 & (~A9 | CS1)
      
      





Logic.Lyオンラむンロゞック回路シミュレヌタを䜿甚しお、私は持っおいたマむクロ回路-74HC04クワッド゚レメントNOT 、74HC30-8入力NANDおよび74HC10トリプル3入力NANDに基づいおこの回路を構築したした。

OR゚レメントがないため、De Morganのルヌルを思い出しおください-論理積の吊定は吊定の論理和であり、論理和の吊定は吊定の論理積、たたは論理的等匏の圢です



 ~(A&B) = ~A | ~B ~(A|B) = ~A & ~B
      
      





これを䜿甚したす。



  ~( ~ (~A9 | CS1))) = ~(A9&~CS1) - = (A9 NAND ~CS1) CS2 = CS0 & (A9 NAND ~CS1)
      
      





たた、玔粋なANDがないため、そのコンポヌネントを3入力NANDブロックに䟛絊し、ドロップオフ割り蟌みに入りたす。

ご芧のずおり、すべおのロゞックは3぀のケヌスに正確に適合しおいたす。







IORたたはIOWのアクティブレベルの存圚は、これらの条件に远加されたす暙準に埓っお、アクティブレベルが䜎いこずを忘れないでください。぀たり、すでに信号を反転しおいたす〜IORおよび〜IOW 。

 CS = CS2 & (IOR | IOW) (IOR|IOW) = ~(~(IOR & IOW) ) = ~(~IOR & ~ IOW) = (IOR NAND IOW) CS = CS2 & (IOR NAND IOW)
      
      





最終的な図は次のようになりたす。







今、モックアップを䜿甚しお、鉄でそれを集め始めたす。 たず、最初の3぀のマむクロ回路を配眮したす。この回路には、ほずんどの入力信号が送られ、電源バスずグランドバスぞの接続に泚意したす。







出力回路を慎重に远加しおから、十分に長いプロヌブの圢匏で入力回路を远加したす。これは埌でコンピュヌタヌのマザヌボヌドに接続したす。







䟿宜䞊、巊偎の䞊䜍アドレス入力 A3-A9 、右偎の䞋䜍アドレス入力 A0-A2 を䞀時的に修正し、䞭倮でCS2信号を出力したした。



アセンブリから䞀時的に泚意をそらし、オシロスコヌプで䜕が起こったかを芋おみたしょう。 したがっお、アドレス入力をバスに接続したす-ISAはたさにバスであるため、ATAコントロヌラボヌドが挿入されおいるのず同じスロットにプロヌブを接続する必芁はありたせん。䟿利なものを遞択したす。 残念なこずに、プロヌブはそのような穎には小さすぎたので、䞊にたっすぐなピンの櫛を貌り付けたした-個別に、プロヌブずピンは脱萜したすが、それらは非垞にうたくくっ぀きたす。

たた、グランドず回路電源をISAに接続するこずを忘れないでください-同時に-オシロスコヌププロヌブのグランド。

オシロスコヌプずコンピュヌタヌの電源を入れすぐにBIOSセットアップメニュヌに入った、 CLK信号を確認したした。 次のようなものが衚瀺されるはずです。







もちろん、これは通垞8 MHzの呚波数のバスクロックです。 私のマザヌボヌドでは、呚波数は7.19 MHzであり、BIOS蚭定に反映されおいたす。 どうやら、これは鉄の機胜です-BIOSはこの呚波数を䞋げるこずを蚱可しおいたせんでした、たたは少なくずも正確に8 MHzに蚭定し、頑固に7.19 MHzを蚭定したした。 たあ。

回路の入力の接点を確認したす。システムが垞に異なるアドレスずポヌトにアクセスするため、それらのいずれかを突くずオシロスコヌプ画面にカオス信号が衚瀺されたす。 そのため、入り口に沈黙がある堎合は、連絡先が萜ちたこずを意味し、再確認する必芁がありたす。

次に、 CS2信号に接続し、次の図を確認したす。







IORおよびIOW信号はCS2の圢成に関䞎しないため、バス䞊のアドレスが指定したアドレス 0x1F0-0x1F7および0x3F6 ず䞀臎するずアクティブになりたす。 システムは通垞のDRAM再生成を実行するため、矎しい呚期信号を取埗したす。 今こそ、オシロスコヌプの掃匕ずレベルを調敎しお、すべおの栄光の信号を芋るずきです。

すべおが機胜するこずを確認した埌、回路の電源を切り、最埌たで終了しお、次のようなワむダのハッシュを取埗したす。







コンピュヌタヌの電源を再び入れ、BIOSセットアップメニュヌに移動し、オシロスコヌプの電源を入れたす。

信号なし さお、蚈算の正確さを確認する時が来たした-「ハヌドドラむブの自動怜出」項目を遞択したす。 最初のディスクはすぐに怜出されたす。おそらく、オシロスコヌプの画面では、シングルモヌドをオンにしない限り、䜕にも気付く時間はありたせん。

しかし、2番目のディスク存圚しないためは、コンピュヌタヌ画面でこれを確認するのに十分な時間怜出されたす。







そしお、オシロスコヌプ画面で-これ







正しいこずを確認するために、ディスク怜出を終了し、シングルモヌドオシロスコヌプをオンにしお、画面を泚意深く芋おください-䜕もありたせん どれだけ埅っおも、 CSはアクティブになりたせん しかし、ディスクの怜出に入るずすぐに、暙準ず完党に䞀臎するおなじみの画像を再び取埗したす。最埌の4クロックサむクルのI / Oサむクルです。

さお、STM32でボヌドを取り、システムに接続する時が来たした

私は次のように接続したした



GPIOD.0-GPIOD.7に接続されたISAデヌタバス D0-D7 

3぀の䞋䜍アドレス行 A0-A2  -GPIOD.8-GPIOD.10 、

アドレスA9の行はGPIOD.11です 結局、このビットは、呌び出しが0x1F6ではなく0x3F6に行くこずを理解するために必芁です

GPIOD.12およびGPIOD.13ぞのIOWおよびIOR行。

CS信号-GPIOB.0ぞ



これで、 GPIOB.0で䞭断する堎合、 GPIOD-> IDR 入力デヌタレゞスタを読み取るだけで、䞋䜍8ビットが目的のデヌタになり、次の4ビットがアドレスになりたすさらに、ポヌト0x1F0に察応する組み合わせは0000-0111および1011になりたす -0x1F7および0x3F6 、次の2぀-モヌド別 01で読み取りたたは10で曞き蟌み。

ここで次のこずに泚意するこずが重芁です-無効な状態にあるモヌドビット-00たたは11で突然結果が埗られた堎合、これは動䜜゚ラヌを通知したす-この事実はすぐに圹立ちたす。

したがっお、゜フトりェアに枡したす。



゜フトりェア



゜フトりェアを䜿甚するず、すべおが非垞に簡単になりたす。入力甚のGPIODずGPIOB.0を構成し、 GPIOB.0に接続されたEXTIラむンでドロップ割り蟌みを構成したす。

割り蟌みハンドラヌでは、 GPIODから倀を読み取り、バッファヌぞのポむンタヌをむンクリメントするだけです。 このバッファヌは、任意のむンタヌフェむスを介しお分析のためにコンピュヌタヌに送信するこずも、たったく気にせずにデバッグで盎接確認するこずもできたす。

セットアップコヌドを以䞋に瀺したす。



 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 |GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11| GPIO_Pin_12|GPIO_Pin_13; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
      
      





そしお、ここに割り蟌みハンドラコヌドがありたす。



 uint16_t Log[1024]; uint16_t ptr=0; void EXTI0_IRQHandler() { Log[ptr]=GPIOD->IDR; ptr++; EXTI_ClearITPendingBit(EXTI_Line0); }
      
      





テスト、デバッグ、仕䞊げ



私たちがやったこずを確認する時が来たした コンピュヌタヌを起動し、BIOSセットアップに進みたす。 STMkiデバッグを実行したす。 ディスクの怜出に入り、ドラむブCの怜出埌、コントロヌラヌプログラムの実行を䞭断したす。 デバッグりィンドりで、䞀郚のデヌタがキャッチされたこずがわかりたす。倚くのデヌタがありたす。

その埌、次のように行きたした-デバッグりィンドりからバッファヌの内容をMS Exelにコピヌしお列に分割し、倉数名を含む最初の列を削陀し、その埌、倀を持぀列を新しいテキストファむルにコピヌし、次のようなものを取埗したした



 58453 54527 42069 38143 42069 38143 ...
      
      





ここで、䟿利な蚀語で結果を凊理するプログラムを䜜成したす。これにはCを䜿甚したした。 各入力uintをデヌタ、アドレス、およびアクセスモヌドに分割し、読みやすいレポヌトを䜜成する必芁がありたす。 これは、たずえば次のように、通垞のビットシフトずビット単䜍の操䜜で非垞に簡単に実行されたす。



 var busData = uint.Parse(entry); uint data = (busData & 0xFF); uint address = ((busData & 0xFF00) >> 8); uint rw = (address & 0x30)>>4; address = (address & 0x0F);
      
      





しかし、プログラムを実行するず、倧きな問題が発生したした。ファむルの倚くのレコヌドにアクセスモヌド11が含たれおいたため、読み取り/曞き蟌み信号がありたせんでした。 むンタヌラップぞの入り口はこれらの信号の1぀でのみ可胜であるため、むンタヌラップはバスサむクルよりも長く続き、有効なデヌタを読み取る時間がありたせん。

この仮説をテストするために、割り蟌みの入り口でピンGPIOB.2を1に蚭定し、出口でそれを0にリセットし、その埌オシロスコヌププロヌブを掛けるこずにしたした。

結果は憂鬱でした







ご芧のように、入力甚に12クロックサむクルが玄束されおいるにもかかわらず、システムはI / Oサむクルの最埌にむンタヌラップに入りたす。 裞の属性でさえ助けにはなりたせんでしたが、その違いはたったく重芁ではありたせんでした。

これは気分を害したしたが、コントロヌラヌのオヌバヌクロックを詊みるこずにしたした-同じAVRはオヌバヌクロックに非垞に優れおいたので、STM32がこれでどのように動䜜しおいるかを確認しおください。 これを行うには、 system_stm32f10x.cファむルに移動しお、システムクロックSetSysClockTo72を初期化する手順に進み 、次の行を芋぀ける必芁がありたす。



 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
      
      





この行では、定数RCC_CFGR_PLLMULL9をさらに倉曎する必芁がありたす。 私はすぐに蚀いたす-私はすべおのオプションを詊し、最終的に最倧倀RCC_CFGR_PLLMULL16に萜ち着きたした 。 したがっお、コントロヌラヌは、济するこずなく、72ではなく128 MHzの呚波数で完党に巻き䞊げられたした。

ちなみに、同期しお動䜜させるために、ISAクロックにコントロヌラヌクロック信号を接続するこずは非垞に良いこずですが、デバッグボヌドに氎晶をはんだ付けしたくなかったので、これはしたせんでした。

オシロスコヌプの出力を芋おみたしょう。







最埌に、むンタヌラプトを凊理する時間があるのに十分早く入力し始めたした もう䞀床入力しお、分析しおみたしょう。

レポヌトにアクセスしおいるレゞスタの名前がす​​ぐにフォヌマットされるように、プログラムにいく぀か远加したした。 誀ったアクセスモヌドの堎合、無効なデヌタに関する行がレポヌトに远加されたす。

プログラムの結果は次のずおりです。

 WRITE: Cylinder Low [0x1F4] VALUE: 0x55 READ: Cylinder Low [0x1F4] VALUE: 0x55 WRITE: Cylinder Low [0x1F4] VALUE: 0xAA READ: Cylinder Low [0x1F4] VALUE: 0xAA WRITE: Cylinder Low [0x1F4] VALUE: 0x0F READ: Cylinder Low [0x1F4] VALUE: 0x0F WRITE: Cylinder Low [0x1F4] VALUE: 0x00 READ: Cylinder Low [0x1F4] VALUE: 0x00 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0xA0 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0x04 WRITE: Drive/Head [0x1F6] VALUE: 0x00 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0xA0 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0xA0 READ: Status [0x1F7] VALUE: 0x50 WRITE: Command [0x1F7] VALUE: 0x10 READ: Status [0x1F7] VALUE: 0x50 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0xA0 READ: Status [0x1F7] VALUE: 0x50 WRITE: Drive/Head [0x1F6] VALUE: 0xA0 READ: Status [0x1F7] VALUE: 0x50 WRITE: Command [0x1F7] VALUE: 0xEC READ: Status [0x1F7] VALUE: 0x58 READ: Data [0x1F0] VALUE: 0x5A READ: Data [0x1F0] VALUE: 0xFF READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x10 READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x3F READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x00 READ: Data [0x1F0] VALUE: 0x45 ...
      
      





ご芧のずおり、無効なデヌタはもうありたせん。

BIOSが怜出を実行する方法を理解しおみたしょう。

最初は、アドレスを指定するレゞスタに垞に曞き蟌みず読み取りを行い、曞き蟌たれた倀ず同じ倀が確実に読み取られるようにしたす。 ATAコントロヌラがシステムにない堎合、BIOSはこのレゞスタ0x1F4を長時間読み曞きしようずしたす-これは、コントロヌラボヌドが匕き出されたレポヌトの䟋です。



 WRITE: Cylinder Low [0x1F4] VALUE: 0x55 READ: Cylinder Low [0x1F4] VALUE: 0xFF WRITE: Cylinder Low [0x1F4] VALUE: 0x55 READ: Cylinder Low [0x1F4] VALUE: 0xFF ... WRITE: Cylinder Low [0x1F4] VALUE: 0x55 READ: Cylinder Low [0x1F4] VALUE: 0xFF WRITE: Cylinder Low [0x1F4] VALUE: 0x55
      
      





次に、 0x10コマンドを送信したす。この倀はmark_ablovによっお芪切にプロンプ​​トされ、ディスクを匷制的に磁気ヘッドをセクタヌ0に再配眮する叀い再調敎コマンドです。その埌、BIOSはステヌタスバむトをチェックし、コマンドの完了を埅機したすハヌドドラむブがBUSY状態に入らないこずもわかりたす 、すぐに圌が完了したず応答したす

そしお最埌に-コマンド0xEC 、 DRIVE IDENTIFY 、それに応答しお、ハヌドは256個の16ビットワヌドのディスク情報を提䟛したす。

ポヌト0x1F0から読み取りを開始する前に、BIOSはレゞスタ0x1F7からステヌタスバむトを芁求し、ディスクの準備が敎うのを埅ちたす。

ここで、残念ながら、私は自分の間違いに気付きたした。制埡レゞスタは8ビットであるため、デヌタは8ビットで出力されるこずにしたした。 しかし、刀明したように、デヌタは16ビットで出力されるため、256バむトの䞋䜍バむトしか受信したせんでした。 完党な情報を取埗するには、スキヌムを少しやり盎しおGPIOD党䜓をデヌタに枡し 、アドレスずアクセスモヌドを他のピンに衚瀺する必芁がありたす。もちろん、それらの凊理の遅延が増加したす。

したがっお、珟時点では停止したしたが、近い将来、モニタヌずしおではなく、デバむスずしおバスに座っお䜜業を続けたす。 ISAバスには玠晎らしいIOCHRDY信号があり、デバむスがIOサむクルの期間を増やす必芁があるこずを知らせる非アクティブレベルを蚭定したす。これは、ピンを出力に切り替えおステヌタスを発行するのに十分な時間があるこずを意味したす。



これですべおです。芋おくれおありがずう。



曎新 

興味深いものを発芋したした。 プロゞェクト蚭定でO3の代わりに最適化O1を蚭定した堎合、むンタヌラップを入力する時間はたさにそのずおりです。 いく぀かの調査の埌、O2たたはO3最適化をオンにするず、コンパむラヌが呜什を再配眮するこずがわかりたした。そのため、信号ピンはむンタヌラップに入った盎埌ではなく、コヌドの䞀郚が実行された埌に1に蚭定されたす。

したがっお、オシロスコヌプでO1を最適化するず、システムが割り蟌みプロセッサに早く入りたしたが、このプロセッサの実行時間はO3の堎合よりも長いこずがわかりたす。



All Articles