10

OSの実験をしています。これまで、私のコードはすべてリアルモードのBIOS割り込みを利用して、ハードディスクとフロッピーを操作していました。しかし、私のコードがCPUの保護モードを有効にすると、すべてのリアルモードBIOS割り込みサービスルーチンが使用できなくなります。ハードディスクとフロッピーをどのようにIR/Wできますか?今、いくつかのハードウェアドライバーを実行する必要がありますか?どうすれば始められますか?これがOSの開発が難しい理由のひとつですか?

ハードウェアはすべて、特定の制御レジスタまたはデータレジスタからの読み取りと書き込みによって制御されることを知っています。たとえば、ハードディスクのコマンドブロックレジスタの範囲は0x1F0から0x1F7であることがわかっています。しかし、非常に多くの異なるハードウェアのレジスタアドレスがPCプラットフォームで同じであるかどうか疑問に思っていますか?または、それらを使用する前にそれを検出する必要がありますか?それらを検出する方法は??

フロッピーまたはハードディスクを保護モードでR/Wする方法がわからないため、BIOS割り込みを使用して、必要なすべてのカーネルファイルをフロッピーからメモリにロードする必要があります。しかし、カーネルファイルがリアルモードの1Mスペース制限を超えた場合はどうすればよいですか?

どんな回答に対しても、私は深い感謝の意を表します。

アップデート

最初にプロテクトモードを切り替えてからリアルモードに戻す方法があることをぼんやりと思い出します。そして、BIOSルーチンを保護モードで使用できます。多分私は間違ったことを覚えています。誰かがそれを正しく覚えていましたか?

4

9 に答える 9

5

プロテクト モードとリアル モードを切り替えることは可能ですが、ほとんどの場合、それを望んでいるわけではありませんこれが 286 での処理方法です (保護モードからリアル モードへの切り替えを意図的にサポートしていないため、非常に不器用です)。ただし、386 以降では、保護モードでタスクとして実行できる V86 モードが追加されました。

BIOS をプロテクト モードで使用する場合は、ほぼ確実にこの方法を使用します。基本的に、V86 タスクを作成し、そこに切り替えて BIOS を使用し、別のタスクに戻ってプロテクト モード コードを実行できます。

これで遊んでみたい場合は、DOS エクステンダであるDJGPPを参照してください (基本的には、ディスク I/ O など) とともに、かなり古いバージョンの gcc のポートが含まれているため、その上で実行されるコードを記述できます。

DOS エクステンダーの商用市場は現在、本質的に死んでいるため、少なくとも 1 つの以前の商用 DOS エクステンダー ( HX ) がオープン ソースとして利用できるようになりました。それをいじるつもりなら、おそらくOpenWatcomコンパイラーでそれを使用したいと思うでしょう。

編集:(たとえば)1 MBを超えるファイルを読み取る方法に関しては、単純ですが扱いにくいです。データをチャンクで読み取り、読み取りが終了したら、メモリを再マップするか、コピーします読んだ内容を本当に必要な場所に移動してから、別のチャンクを読みます。

ハードウェアとの対話に関する限り、ある程度機能するものが必要なのか、それとも既存のハードウェアを最大限に活用したいのかによって、多くのことが異なります。基本的な IDE ポートを使用するだけで、それほど古いものではないほとんどすべてのハード ドライブと通信できますが、ハードウェアを最大限に活用するには、かなり手間がかかります。IDE/ATAPI ドライブは、約 6 種類の異なる DMA モードを使用しており、それぞれを少しずつ設定する必要があります。それらのかなりの数は、おそらくそれらを気にしないほど古いため、最新のいくつかのみを直接サポートし、それ以外は基本的な (非 DMA) 転送にフォールバックすることをお勧めします。

于 2010-09-02T04:34:33.883 に答える
2

BIOSインターフェイスで十分なので、ハードウェアとの通信方法(デバイスドライバーが解決する問題)ではないようです。

むしろ、プロテクトモードリング0(BIOS呼び出しや他のすべての特権命令に無制限にアクセスできる)と、アプリケーションコードが通常存在するプロテクトモードリング3との間で通信する方法を知る必要があります。これはシステムコールです。ほとんどすべてのアーキテクチャは特権モードで割り込みハンドラを実行するため、ソフトウェア割り込みはシステムコールを実装する1つの方法であり、x86はsyscallこの目的のために最適化された命令も提供します。

もちろん、すべてのメモリに直接アクセスできるフラットメモリモデルを使用して、リング0ですべてを実行することもできます。

リング0/リング3はx86の用語ですが、MPUを備えたすべてのシステムは、物理アドレスによるメモリへのアクセスを可能にする特権モードの概念をサポートしています(スプリットメモリ-I / Oアーキテクチャの場合、すべてのI/Oスペースへのアクセス)。

于 2010-09-02T03:47:51.570 に答える
1

V86:はい、進むべき道ですが、OSをセットアップする場合:

これを試してみてください(ロングモード用に設計されていますが、動作するはずです。これはまだテストしていませんが、まだ動作しない理由はわかりません。問題はnasmではありません。

LDH8s16ビットELF/aoutリファレンス。これは、GRUBからロードするための標準です。

32ビットCSがオフになっていることを知っているので、その場所を再確認する必要があります。それ以外の場合は問題ないようです。

これはコードを見つけるのが難しいです。

-;32ビットに変更しますか??

;this code is placed somewhere after 10000h
;-----we're in LONG MODE-----
  mov          dword [.stckptr], esp   ;first of all save stack
  sgdt         [.gdtv32]               ;save your gdt pointer
  lgdt         [.gdtv16]               ;load a new one
  sidt         [.idt32]                ;save your idt pointer
  lidt         [.idt16]                ;load real mode idt
  ;far jump in long mode is not possible, do a trick
  push         DESC_REAL
  push         @f-10000h               ;this is CS*10h, modify if needed!
  retfd
.stckptr:
  dd           0
  align        16
.gdtv32:
  dw           0
  dd           0
  align        16
.gdtv16:
  dw           .gdtend-.gdt-1
  dd           .gdt,0
  align        16
.gdt:
  dd           0,0                      ;null descriptor
DESC_DATA=8                                 ;descriptor in YOUR GDT (modify)
DESC_LONG=$-.gdt
  dd           00000000h,00209800h      ;32 bit  mode cs -MOD ME
DESC_REAL=$-.gdt
  dd           0000FFFFh,00009801h      ;16 bit real mode cs (modify base if needed!)
.gdtend:
  align        16
.idt32:
  dw           0
  dd           0
  align        16
.idt16:
  dw           3FFh
  dd           0
  USE16

;-----we're in COMPATIBLITY MODE-----
  ;disable paging and protmode at once
@@:   mov          eax, cr0
  and          eax, 7FFFFFFEh   
  mov          cr0, eax

  ;set up real mode segment registers and stack
  mov          esp, realmode_stack_top          ;modify it to your needs!
  xor          ax, ax
  mov          ds, ax
  mov          es, ax
  mov          fs, ax
  mov          gs, ax
  mov          ss, ax
  ;convert long mode rip to real mode cs:ip
  ;jmp CS:(pmode address)-CS*10h

  jmp          1000h:@f-10000h                  ;modify if needed!
;-----we're in REAL MODE-----
@@:   ;***********call some BIOS interrupt here**********
  mov          ax, 3
  int          10h


  ;switch back to long mode
  mov          eax, cr0
  or           eax, 80000001h
  mov          cr0, eax                         ;enable protmode and paging

  ;jmp         DESC_LONG:@f
  db           66h
  db           0EAh
  dd           @f
  dw           DESC_LONG
  USE32
;-----we're in protected MODE-----
@@:   lgdt         [cs:.gdtv32]                    ;restore gdt
  mov          ax, DESC_DATA                   ;read YOUR DATA descriptor to selectors
  mov          ds, ax
  mov          es, ax
  mov          fs, ax
  mov          gs, ax
  mov          ss, ax
  lidt         [.idt32]                        ;restore idt
  mov          rsp, qword [.stckptr]           ;restore stack
  ;must be a non rip-relative jump
  mov          eax, @f
  jmp          eax
@@:

  ;AS WE WERE!
于 2013-01-27T06:18:32.603 に答える
1

レガシーIDEを使用する場合、すべてのハードウェアは同じ方法で通信します。カスタムドライバーの作成について心配する必要はありません(十分に理解できれば、すべて同じ仕様に従っていると言われていても、気付くでしょう。 、それらはすべて楽しい癖があります)

http://www.t13.org/http://www.t10.orgには、関連する仕様があります。勇気がある場合は、SATAドライバーを作成することもできます。 IntelのWebサイト(http://www.intel.com/technology/serialata/ahci.htm)のAHCI仕様

于 2010-09-02T03:37:54.423 に答える
1

32 ビット モードからハード ドライブ (または USB キー) を読み取るコードが必要な場合は、私の OS プロジェクトPwnOSからいくつかを見つけることができます。DMA などはサポートしていませんが、基本は機能します。具体的には、trunk/Core/IO/ATA Driver.asm には、ハード ドライブなどの ATA デバイスを読み取るためのコードが含まれています (マジック ナンバーなし! :D)

危険を冒したくなかったので、デバイスを作成するためのコードを作成しないことにしましたが、非常に似ています。仕様は、「cottontail os dev」の最初の Google ヒット (ATA/ATAPI-6 ドキュメントが必要になります) で見つけることができますが、従うのは少し難しいです。

ご不明な点がございましたら、お気軽にお問い合わせください。64 ビット モードにセットアップするためのコードと、OS 開発用に特別に設計したアセンブリ言語エディタ (Inventor IDE を検索) も用意しています。 -bit、32 ビット、および 64 ビットのコードを、定義されたアドレスとファイル オフセットに配置します。そうすれば、毛羽立ちではなく、気になる部分に集中できます。

于 2010-09-17T03:00:31.363 に答える
0

オペレーティングシステムを作成している場合は、ストレージデバイスを含め、使用する必要のあるハードウェア用のデバイスドライバーが実際に必要です。このような初期段階でドライバーが必要にならないようにしたい場合は、grubなどの既存のブートローダーの使用を検討できますが、最終的にはドライバーが必要になります。

于 2010-09-02T03:33:35.130 に答える
0

保護モードに関する一連のチュートリアルがここにあります。Tut15 と tut16 は効果的に DOS と BIOS を v86 モードで実行し、すべての割り込みが機能します。

于 2011-11-29T09:52:56.600 に答える
0

このプロジェクトは今では古いものですが、ユタ州の OSKit プロジェクト — 1990 年代後半の他のオペレーティング システムは、今日の PC で RAM とディスク ドライブを見つけることができるため、最新のマシンでまだ実行される可能性がありますか? — 特定のオペレーティング システムとは別にビルドされたデバイス ドライバー スタックであり、C コードを記述するだけで独自のカーネルを開発できました。

ちょっときちんとしていました。「Hello, world」をコンパイルできます。C で OSKit に対して実行し、起動して「Hello, world」と出力する起動可能な OS を取得します。そして停止しました。:-)

いずれにせよ、本当に「OS の実験」を行っているのであれば、試してみることをお勧めします。または、少なくともそのコードを、いくつかのドライバーを起動して実行する方法のガイドラインとして使用してください。もちろん、「OS の実験」というよりも「x86 についてのあいまいな事実を学ぶ」ということを実際に行っている場合は、必要以上のことを行う可能性があります。:-)

http://www.cs.utah.edu/flux/oskit/

于 2010-09-10T15:07:23.350 に答える
-1

ATAPIデバイスは同じポートを使用します。1MB + 64kの制限を超えるために、DPMIをエミュレートできますが、そうです、プロテクトモードを学びましょう。

于 2010-09-02T03:26:48.327 に答える