プロが教えるわが家の防犯対策術!

アセンブリの本を読むと、画面に文字を表示する際にはシステムコールを利用しています。

通常はシステムコールを利用すれば問題ないのですが、ブラックボックス的に使うのが嫌なので、一度は内部の動作を理解したいと考えています。
システムコールを使わずに画面に表示するにはアセンブリでどう記述したらよいのでしょうか?
または、システムコールではどのような処理をしているのでしょうか?
ディスプレイのデバイスドライバが関わっていると思うのですが、そうであるなら、デバイスドライバではどのような処理がされているのか知りたいのです。

OS、処理系はなんでも構いません。
この本を読めばいいよ、という情報でも構いませんのでご教示ください。

A 回答 (6件)

>ということは、素人が細かい部分まで独学で理解するのは難しいのかも知れませんね。



最近のビデオカードのドライバは、メーカー内のハードに精通した担当者しか書けないみたいですね。まぁ、ハードの詳細仕様が公開されていないので書けって言われても難しいですが。
http://opentechpress.jp/developer/07/09/04/01172 …
Linux系オープンソースでチャレンジは行われているみたいですが、完成したドライバまでたどり着いたプロジェクトは無いようです。
上記ページからたどって、R300の未完成のオープンソースのドライバを見てみましたが、大量のソースコードで読む気もおきません。
興味があったらたどってみてください。
    • good
    • 0
この回答へのお礼

なるほど。
昔の単純なビデオカードの仕組みを理解する程度で満足することにします。
どうもお世話になりました。

お礼日時:2007/09/17 00:54

まずベーシックなグラフィックVRAMについての説明から。


実際のハードは色々と工夫がしてあって様々な構造をしているのですが、ここは単純な構造と仮定して説明します。
VRAMは、RGBの各色の明るさをドット毎のデータとして持ちます。俗に24ビットカラーと呼ばれるものは、24ビット=3バイトで1つのドットのデータを構成していて、RGBが各1バイトづつの情報を持ちます。1バイトで256段階の明るさを表現し、RGBの明るさの組み合わせで色を表現します。
http://www.hm.h555.net/~irom/g_about/color_01.htm
VRAM上には、[R][G][B]を1組として、横x縦のドットサイズ分メモリ上に連続して並んでいます。
[R][G][B][R][G][B][R][G][B]・・・・・・[R][G][B]
[R][G][B][R][G][B][R][G][B]・・・・・・[R][G][B]
[R][G][B][R][G][B][R][G][B]・・・・・・[R][G][B]
 ・
 ・
 ・
[R][G][B][R][G][B][R][G][B]・・・・・・[R][G][B]
↑こんなイメージです。
CPUからは、RGBの3バイト単位で単なるメモリとして書き換えを行います。
実際のVRAMは、効率の問題から4バイト単位だったり、別の工夫がしてあったりします。

>素人考えではVRAMへ転送する指令は共通にしてしまって、あとはグラフィックカードで適当に処理してくれればドライバが必要ないと思うのですが、それでよろしいでしょうか?
その通りです。ハード仕様がすべて厳密に決まっていれば、処理は固定化できてドライバが不要にはなりませんが、様々なバリエーションは不要になります。
ただし、VRAMの初期化や解像度、色数など変更は、細々としたVRAMコントローラのレジスタ設定が必要ですからドライバで吸収してやらないとプログラム側がやることが多すぎます。

本物のPCのビデオカードは、各メーカーが特色出すためや元々厳密にハード仕様が決まっていなかった事から拡張に次ぐ拡張を重ねてきました。逆にハード仕様が厳密に決まっていたら、これほど急激に高性能なビデオカードに発展することは無かったでしょう。

現在のビデオカードは、単にドットを表示するだけではなく様々な機能を搭載しています。
(1)様々な解像度や色数や垂直同期周波数やら細かい設定を切替できる機能。
(2)WindowsAPIのグラフィック系の機能(塗りつぶしやラインを引くなど)をCPUで行わずVRAM側ハードで実現するアクセラレータ機能。
(3)ビデオ再生をサポートするアクセラレータ機能。
(4)3Dに関する3次元の頂点計算やドット単位のエフェクトを行う3Dアクセラレータ機能。
これらは、メーカー毎に独自の実装でメーカー内でもビデオカードのチップのバージョン毎に違っているのが現状です。

本物のドライバの役割。
(1)PCI,AGP,PCI-Xなどの様々なバスで接続されているVRAMへのアクセス方法をプログラム側から隠蔽し同一な方法でのドットデータの転送を可能にします。WindowsPCでは、CPUから見るとVRAMメモリに直接書き込むことはできません。WindowsAPIやDirectXなどを使ってメインRAMからVRAMにドットデータを転送してもらいます。実際の制御はドライバが行います。
(2)グラフィック描画のWindowsAPIを実際のビデオカードの制御コマンドに書き換えて、ビデオカードに指令を出します。
(3)DirectXのバージョンの違いがあっても正しく動くように差分をドライバ側で吸収します。DirectXの様々な機能をビデオカードの制御コマンドに置き換えるのもドライバの役割です。
とハード制御やら、バージョン違い吸収、インターフェイスの単純化など複雑なことをしていますので、ドライバのプログラムは複雑で巨大ですし、ハードウェアの知識なしにソースを理解することはできません。
    • good
    • 1
この回答へのお礼

週末は出かけていて、お礼が遅くなり申し訳ございません。
ご丁寧なご説明ありがとうございましたm(_ _)m。
大変よくわかりました。

>メーカー毎に独自の実装でメーカー内でもビデオカードのチップのバージョン毎に違っている

ということは、素人が細かい部分まで独学で理解するのは難しいのかも知れませんね。

お礼日時:2007/09/16 23:56

>ディスプレイドライバが担う役割は


そのVRAM、昔はマザーボードに一緒になってたのは何となく想像できると思う。
時代が進み拡張で行っているけれど作ってる会社が違うからあべこべな信号指令を出しちゃう事になる。
例えばだけど指令として 0x4f が表示データ転送 というつもりでマザーが発令しても グラフィックボードは 0x4f は特定のメモリを消去する命令かもしれない。

それをとりもつのがドライバ。
そしてマザー側はOSが既定している方法でドライバへ指令を渡す事によって期待通りの仕事をグラボにさせる事ができるようになるという。
なにせドライバって言うくらいだからね。
極端な話、マザー側からはグラボの接続ポートへ対してグラボの命令群や格納データ郡を送れば直接制御できる。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

つまり、同じ動作をさせたい場合でもメーカーが異なるとグラフィックVRAMへ転送する指令が異なるから、ドライバが必要ということですね。

素人考えではVRAMへ転送する指令は共通にしてしまって、あとはグラフィックカードで適当に処理してくれればドライバが必要ないと思うのですが、それでよろしいでしょうか?

勘違いがあったらすみません。

お礼日時:2007/09/15 06:14

#1のultraCSさんではないですが私からも説明します。



VRAM(画面)は、RAMという名前が付くとおりCPUから見れば単なるメモリです。テキストVRAMであれば、メモリの特定の場所に文字コードを書き込むと画面に文字が表示されます。画面への表示は、ハードウェアが行いCPU側では特に意識する必要はありません。

これが参考になるかも↓余分なこともかかれてますが(^^ゞ
http://members.aol.com/njprog/pakai_24.html

MS-DOSからのテキストVRAMの制御は、ここが参考になると思います。
http://www7.plala.or.jp/keny01/asm/dos-ex/index. …

フリーで使えるMASMはこちら↓
http://lets-go.hp.infoseek.co.jp/prog02.html

>この過程はやはり通常のマシン語で記述されているのでしょうか?
>通常のマシン語はCPU内のレジスタとメモリ上のデータのやりとりを記述するものが多いと思うのですが、画面の制御もできるのでしょうか?

別にメモリを操作するだけですので、C言語でも書くことができます。
画面の表示の制御は、画面専用のコントローラ(ハードウェア)が行っています。画面専用のコントローラにパラメータを設定することで解像度や画面モードの切り替えを行うことができますが、これも単なる特定のメモリに値を書き込むことでパラメータを変更することができます。全部自分でやるとなると、その設定も必要になります。

グラフィックVRAMも必要であれば解説しますので、補足してください。
    • good
    • 0
この回答へのお礼

大変お詳しいご回答ありがとうございました。
リンク先の文章も大変わかりやすかったです。

CPUで行うことはVRAMへの転送までなので、とくにドット1つを青色に光らせるマシン語があるわけではないのですね。

もう少し教えていただきたいのですが、ディスプレイドライバが担う役割はどの辺りでしょうか?

お礼日時:2007/09/15 00:50

#1です。

手元に解説書がないので、概念的になってしまうし、最近使って折らず、MicrosoftとZilog/Intel/Motorolaのニーモニックが頭の中で混ざっているので間違いを書くかもしれないのはご容赦いただくと言うことで

テキストRAMへの転送は通常のMOVなどで絶対アドレスにテキストコードを転送するだけです。

MOV AX,'A'
MOV [xxxxh],AX

で、xxxxhに'A'が書き込まれ、画面上の該当位置に'A'が表示されることになります。
グラフィックも含め周辺チップの制御は、通常は、チップ上のレジスタに書き込むことで行います。書き込み動作は、CPU側のレジスタに値をセットして、実装されているポートに書き込むことでデータがチップ上に転送されます。

MOV AX,data
OUT yyh

といった感じです。

なお、AT-BIOSくらいは使った方が良いと思いますね。チップの制御は書き込み時間の遅延や動作遅延を考慮してウェイトを掛ける(NOPのループなど)必要があり、BIOSではそれを考慮しています。

まあ、入り口としては、DEBUG/SYMDEBで直接ニーモニックを打ち込んで、どのように動くか試してみるのが良いでしょう。
    • good
    • 0
この回答へのお礼

大変よくわかりました。
どうもありがとうございました。

お礼日時:2007/09/14 23:51

多分、遼遠な道だと思うので、概念だけ説明しますね。



テキストでよければ、メモリ上のテキストエリアに直接コードを書き込んでしまえば画面には反映されます。ただ、絶対アドレスになるので、CPUがリアルモードでないと難しいかもしれません。バージョンの低いMS-DOSあたりを使い、メモリーマネージャなどは使わないのが簡単かと思います。
アドレスについては、MDA/CGA/EGA/VGAといった画面モードで変わります、知るにはPC-AT(名称は忘れましたが、inside PC-ATのような)のアーキテクチャを解説した書籍が必要です。
テキストVRAMを書き換えれば、あとは、適当なタイミングでリフレッシュされてVRAMに反映され、画面に表示されます。グラフィックも考え方は同様ですが、こちらは更に複雑になります。

なお、現在のグラフィックチップはより高度な命令を高速に実行できるようになっているので、デバイスドライバであっても、複雑な命令を組み合わせて作られており、単純にVRAMを書き換えるような作りにはなっていませんから、デバイスドライバのソースを見ても参考にはならないかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おかげさまで概念はつかめました。

>テキストVRAMを書き換えれば、あとは、適当なタイミングでリフレッシュされてVRAMに反映され、画面に表示されます

この過程はやはり通常のマシン語で記述されているのでしょうか?
通常のマシン語はCPU内のレジスタとメモリ上のデータのやりとりを記述するものが多いと思うのですが、画面の制御もできるのでしょうか?

お礼日時:2007/09/14 22:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!