アセンブリの本を読むと、画面に文字を表示する際にはシステムコールを利用しています。
通常はシステムコールを利用すれば問題ないのですが、ブラックボックス的に使うのが嫌なので、一度は内部の動作を理解したいと考えています。
システムコールを使わずに画面に表示するにはアセンブリでどう記述したらよいのでしょうか?
または、システムコールではどのような処理をしているのでしょうか?
ディスプレイのデバイスドライバが関わっていると思うのですが、そうであるなら、デバイスドライバではどのような処理がされているのか知りたいのです。
OS、処理系はなんでも構いません。
この本を読めばいいよ、という情報でも構いませんのでご教示ください。
No.6ベストアンサー
- 回答日時:
>ということは、素人が細かい部分まで独学で理解するのは難しいのかも知れませんね。
最近のビデオカードのドライバは、メーカー内のハードに精通した担当者しか書けないみたいですね。まぁ、ハードの詳細仕様が公開されていないので書けって言われても難しいですが。
http://opentechpress.jp/developer/07/09/04/01172 …
Linux系オープンソースでチャレンジは行われているみたいですが、完成したドライバまでたどり着いたプロジェクトは無いようです。
上記ページからたどって、R300の未完成のオープンソースのドライバを見てみましたが、大量のソースコードで読む気もおきません。
興味があったらたどってみてください。
No.5
- 回答日時:
まずベーシックなグラフィック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の様々な機能をビデオカードの制御コマンドに置き換えるのもドライバの役割です。
とハード制御やら、バージョン違い吸収、インターフェイスの単純化など複雑なことをしていますので、ドライバのプログラムは複雑で巨大ですし、ハードウェアの知識なしにソースを理解することはできません。
週末は出かけていて、お礼が遅くなり申し訳ございません。
ご丁寧なご説明ありがとうございましたm(_ _)m。
大変よくわかりました。
>メーカー毎に独自の実装でメーカー内でもビデオカードのチップのバージョン毎に違っている
ということは、素人が細かい部分まで独学で理解するのは難しいのかも知れませんね。
No.4
- 回答日時:
>ディスプレイドライバが担う役割は
そのVRAM、昔はマザーボードに一緒になってたのは何となく想像できると思う。
時代が進み拡張で行っているけれど作ってる会社が違うからあべこべな信号指令を出しちゃう事になる。
例えばだけど指令として 0x4f が表示データ転送 というつもりでマザーが発令しても グラフィックボードは 0x4f は特定のメモリを消去する命令かもしれない。
それをとりもつのがドライバ。
そしてマザー側はOSが既定している方法でドライバへ指令を渡す事によって期待通りの仕事をグラボにさせる事ができるようになるという。
なにせドライバって言うくらいだからね。
極端な話、マザー側からはグラボの接続ポートへ対してグラボの命令群や格納データ郡を送れば直接制御できる。
ご回答ありがとうございます。
つまり、同じ動作をさせたい場合でもメーカーが異なるとグラフィックVRAMへ転送する指令が異なるから、ドライバが必要ということですね。
素人考えではVRAMへ転送する指令は共通にしてしまって、あとはグラフィックカードで適当に処理してくれればドライバが必要ないと思うのですが、それでよろしいでしょうか?
勘違いがあったらすみません。
No.3
- 回答日時:
#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も必要であれば解説しますので、補足してください。
大変お詳しいご回答ありがとうございました。
リンク先の文章も大変わかりやすかったです。
CPUで行うことはVRAMへの転送までなので、とくにドット1つを青色に光らせるマシン語があるわけではないのですね。
もう少し教えていただきたいのですが、ディスプレイドライバが担う役割はどの辺りでしょうか?
No.2
- 回答日時:
#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で直接ニーモニックを打ち込んで、どのように動くか試してみるのが良いでしょう。
No.1
- 回答日時:
多分、遼遠な道だと思うので、概念だけ説明しますね。
テキストでよければ、メモリ上のテキストエリアに直接コードを書き込んでしまえば画面には反映されます。ただ、絶対アドレスになるので、CPUがリアルモードでないと難しいかもしれません。バージョンの低いMS-DOSあたりを使い、メモリーマネージャなどは使わないのが簡単かと思います。
アドレスについては、MDA/CGA/EGA/VGAといった画面モードで変わります、知るにはPC-AT(名称は忘れましたが、inside PC-ATのような)のアーキテクチャを解説した書籍が必要です。
テキストVRAMを書き換えれば、あとは、適当なタイミングでリフレッシュされてVRAMに反映され、画面に表示されます。グラフィックも考え方は同様ですが、こちらは更に複雑になります。
なお、現在のグラフィックチップはより高度な命令を高速に実行できるようになっているので、デバイスドライバであっても、複雑な命令を組み合わせて作られており、単純にVRAMを書き換えるような作りにはなっていませんから、デバイスドライバのソースを見ても参考にはならないかもしれません。
ご回答ありがとうございます。
おかげさまで概念はつかめました。
>テキストVRAMを書き換えれば、あとは、適当なタイミングでリフレッシュされてVRAMに反映され、画面に表示されます
この過程はやはり通常のマシン語で記述されているのでしょうか?
通常のマシン語はCPU内のレジスタとメモリ上のデータのやりとりを記述するものが多いと思うのですが、画面の制御もできるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レジスタマップって何ですか?
-
PLCとPCの通信
-
組み込みマイコンでのソフトウ...
-
TCNTとTIFRの意味
-
2つのアナログ信号が一致して...
-
PIC12F683でLEDをスイッチで点...
-
マイクロ秒で精度が出るタイマー
-
バックグラウンドのプロセスの...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
緯度、経度の 10進法と 60進法...
-
ACCESS側からEXCELの書式を設定...
-
C# シリアル通信でデータ受信...
-
Excelでのセル内容の高速消去方法
-
無限ループ中にある任意のキー...
-
プロセスのアタッチ・デタッチ...
-
メッセージボックスのボタン名変更
-
TCP/IP通信時のサーバーからの受信
-
メモリの消費量について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PLCとPCの通信
-
レジスタマップって何ですか?
-
機械語のレジスタペアについて
-
シリアル通信でのデータ取りこぼし
-
2つのアナログ信号が一致して...
-
組み込みマイコンでのソフトウ...
-
SH7144でパルス幅を測定したい。
-
フラッシュメモリへの書き込み
-
PICマイコンのCLRWDT動作について
-
マイコンSPI入門
-
PIC12F683でLEDをスイッチで点...
-
I2C I/OエクスパンダPCA9539動...
-
arduinoを使って重さ計測
-
マイコンからSDカード内のテキ...
-
デジタルマルチメータの自動計...
-
古い計量機器からのrs232cを使...
-
マイクロ秒で精度が出るタイマー
-
USBハブの自作について
-
TCNTとTIFRの意味
-
C言語プログラミングの問題な...
おすすめ情報