題名に書かせていただいた通りPCのVRAMにアセンブリ言語でデータを書き込むことを考えた場合、
windowsの場合はwin32APIによって直接書き込むことは出来ないため、win32よ呼び出してVRAMに書き込みたいデータを渡して、win32がVRAMにデータを書き込むことで画面に文字や色が表示されると思います。
しかし、Linuxの場合はOS自体がオープンソースであるため、VRAMにデータを書き込む過程をアセンブリプログラムで見れるのでしょうか?
「書き込む」部分アセンブリプログラムで見れるかをお尋ねしたいです。
printfに関しては文字を表示する際に関係しているため質問をわかりやすくしようとしたつもりがかえってわかりにくい内容になってしまいました。すいませんでした。
どうかよろしくお願いいたします。
//編集内容//
VRAMにアクセスする上で壁が多くあることはよくわかりました。(多分)
そこで、過去にした質問を少し変えて改めて質問したいのですが、CPUからGPUを経由してVRAMにデータを書き込むPCであるという仮定で「CPUからGPUを経由してVRAMにデータを書き込みをするⅭプログラムをコンパイルに成功して実際に文字が表示できたとします。そのC言語プログラムをアセンブリプログラムに変換したとします。そのアセンブリプログラムはハードウェアに依存したものであるため、GCCでアセンブリプログラムとして実行してもCプログラム同じような結果が出ると思います。
得られたアセンブリプログラムをVRAMにデータを書き込むひな形のプログラムとして、そのひな形のアセンブリプログラムを参照に改造して別の文字を表すようにアセンブリプログラムで書いてGCCなどでアセンブリ言語としてコンパイルできれば、アセンブリプログラムでVRAMにアクセスでき文字を表せると思うのですが、(OSも関与してくると思いますが。)私の考えは間違っているでしょうか?
完全に一からアセンブリプログラムを組んでVRAMにアクセスするのは難しいですが、以上のようにできるならばVRAMにアクセスするのは難しくないと思います。
完全に一から使っているCPU、GPUの情報からアセンブリプログラムを組んでVRAMにアクセスするのは難しいですが、コンパイラによって出力されたアセンブリプログラムをそのまま使えばVRAMにアクセスするのは難しくないと思います。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/10 01:11
2018/03/10 02:17
2018/03/10 03:11
2018/03/11 19:14
2018/03/12 10:56 編集
2018/03/12 11:58
2018/03/12 12:03
2018/03/12 15:05 編集
2018/03/12 15:20
回答8件
0
ベストアンサー
Linuxの場合はOS自体がオープンソースであるためVRAMに書き込むまでの過程を見ることができる
できるでしょうね。
この分野もw私は門外漢なので外してるかもしれないが、LinuxのウィンドウシステムはX Window Systemだと思うので、今ならX.OrgServer辺りから調べればVRAMに書き込む部分(ドライバ)まで辿り着けるかもしれない。ただグラフィックボード(ハードウェア)はいくつもあるので、物理ドライバも複数あるはずで、あなたのパソコンで動いているドライバがどれか、なんて知らないよ。
VRAMにデータを書き込む過程をアセンブリプログラムで見れる
見ることはできるでしょうが、上記ドライバはCで書いてるはずだから、動きを知るにはCのコードを読まない限り時間の無駄、実際はアセンブリコードを見ても何もわからないでしょう、これは請け合いだ(笑)。はっきり言って、VRAM操作のアセンブリコードを見ること自体にあまり意味は無いと思う。
GPUを操作しているのなら、GPUの仕様がわからないとCのコードを見てもちんぷんかんぷん、ましてアセンブリコードを見ても(Ry
それよりも、あなた自身が普通に書いたCプログラムをコンパイルしたアセンブリコードを見る、Cのコードのどこがどうなったか、大雑把でよいから掴めるようになる事が大事。
printf関数がもしOSに依存しているとしたら
全く依存しない、とは言いきれませんが、標準ライブラリなんだから、少なくともあまり依存しないように、移植性を考えて書くわけです。
アセンブリ変換すればVRAMに文字や色を表すためのデータを受け渡す部分が見れたり…
しません。printf()は絶対そんなことをしません。
なぜそう言えるか。処理には階層というものがあるから。
フォーマット文字列に従って、渡された引数を、表示すべき文字列に変換する、のがprintf()の本体であり、役目です。表示すべき文字列を作ったら、別の関数として用意された、文字列全体を表示する関数(或いはそろそろシステムコールかな?)のような物を呼び出して表示を行います。階層は2段階以上ある。
さらに、main() { printf("hello world!\n"); }
をコンパイルして出来た実行ファイル(例えばhello.exe)は、そのままビットマップディスプレイにも、ssh等で繋がった別のパソコン画面にも、シリアルケーブルで繋いだ端末にも表示する…ばかりか
$ hello.exe > message.txt
とすれば、ファイルに出力することもできます。このように、実行時に入出力先を切り替えることをIOリダイレクトと呼びます。もしprintf()の段階でビットマップに出力していたら、ファイルに出力したデータはビットマップになってしまう(笑)。
即ち、IOリダイレクトができるということは、ビットマップディスプレイに文字フォントを描き出す機能と、printf() は、実行時に連携して動作するのであって、遠く離れた・全く別の場所にあるコードだということを意味します。
念の為:処理には階層がある・・・階層を作る基礎がサブルーチンや関数ですよ。
投稿2018/03/10 02:17
編集2018/03/10 02:42総合スコア1380
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/10 04:30
2018/03/10 06:03 編集
2018/03/10 06:27 編集
2018/03/10 07:43
2018/03/10 07:45
2018/03/10 08:12 編集
2018/03/10 12:00
2018/03/10 12:02
2018/03/10 12:04
2018/03/10 12:28
2018/03/10 13:21
2018/03/10 13:54
2018/03/10 14:01
2018/03/10 14:08 編集
2018/03/10 16:48 編集
2018/03/10 16:47
2018/03/10 16:54
2018/03/10 18:20
2018/03/10 23:54
2018/03/11 01:16
2018/03/11 05:00
2018/03/11 05:08
2018/03/11 05:33
2018/03/11 06:11
2018/03/11 10:45
2018/03/11 17:08 編集
2018/03/11 19:09
2018/03/11 19:32
2018/03/11 23:25
2018/03/12 02:10 編集
2020/01/21 03:55
2020/01/21 04:30
2020/01/21 07:32
0
PCのVRAMを簡単に触る方法はないのか?というと、ないこともないです。
「UEFIアプリケーション」は中身は単なるWindowsと同じPEなのですがUEFI(BIOS)によって起動され
BIOSの力を借りますが、VRAMに書き込みができます。
利点
- ドキュメントが公開されている(らしいですよ
- フォーマットとしては、ほぼ単なるDLLなのでWindows用にDLLを作れる環境ならば作成可能(MSVCですら可能だとか)
- 実機で起動する際にブートレコードが云々などを気にせず単純にFAT32にフォーマットしたUSBストレージの指定パスに置くだけでよい
参考
https://orumin.blogspot.com/2014/12/uefi.html
https://github.com/tenpoku1000/UEFI_FreeType_MSVC
http://wiki.phoenix.com/wiki/index.php/EFI_GRAPHICS_OUTPUT_PROTOCOL
http://wiki.phoenix.com/wiki/index.php/EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE
→FrameBufferBaseがVRAMの先頭アドレスになります。
以上の方法でUEFIアプリケーションからVRAMにほぼ直接書き込めるC言語のプログラムが作れます。
そしてそれを逆汗なりアセンブリ出力なりで出したものを雛形にしたものをアセンブラに通せばアセンブリでVRAMへ書き込めます。
デバイスを直接いじってる感はありますが、グラフィックドライバをアンインストールしたWindowsと同じ状態なので
低速(というかCPUに速度が依存する)であり、デバイスを使いこなしているかというと疑問です。
投稿2018/03/12 03:42
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/12 04:55
2018/03/12 05:09
2018/03/12 05:39
2018/03/12 05:47
0
とても大雑把ですが一般的な汎用計算機の話から・・・
PCのVRAMにアセンブリ言語でデータを書き込む
これは現代的なOSの元では一般的に「不可能」です。それは例えばWindows/Linuxのカーネル、GPUメーカー提供のドライバー、OpenGLなどの全ての関連ソースプログラムを理解したとしても同じです。問題は「どのように描画しているかの処理の仕様がわかるかどうか」というレベルの話ではなく、「一般プロセスが計算機のハードウェア資源(I/Oデバイス)に自由にアクセスすることは許されていない」というレベルの話です。
なぜそうなっているかというと「現代的なOSは、一般のプログラムがどのようなバグを持っていても極力OSやハードウェアをダウンさせない」という思想で設計されているからです。
誤解をおそれずに言えば、一般プログラムはOSから「何か致命的なウィルスでも潜んでいるかのように」扱われ「勝手なことができないようガチガチに制限された中でしか動けない」のです。主記憶についても「勝手なアドレスに自由に読み書きすること」さえ許されていません。OSがお膳立てした「仮想的なメモリー空間上をアクセスすることだけ」が許されるような状況でのみ動作します。I/Oポートに直接アクセスすることもできません。その辺りを許してしまうと例えば「プログラミングを学ぼうとして、何かのプログラムをC言語などで書いて動かす」と簡単にOSやハードウェアが壊れる結果になりかねないのです。
まずは「このように安全性が配慮されているのが現代のOSである」という認識からスタートするのがよいでしょう。
さて、Raspberry Piはどうでしょうか?Linuxを動かすならある程度前述のような安全性が考慮されているとは思います。しかしながら、このハードウェアは「組み込み機器を手軽に構築できる」という思想で設計されていると思います。それゆえ一般の汎用計算機よりもハードウェアにもっと近い部分にプログラマーが接近する余地があるだろうと思います。
そういうわけでこの話題について調べるには「Raspberry Piではどうか」という前提条件が必須になると思います。で、Raspberry PiでそもそもVRAMに直接アクセスできるかを「Raspberry Pi VRAM direct access」で調べてみますと、「それが可能であるらしい」ように見えました。あるQ&Aの回答者が提示しているのは以下のプログラムがそのスタート地点だとのことです。
https://github.com/brianwiddas/pi-baremetal/blob/master/framebuffer.c
ただ、このレイヤーではVRAM=即ちピクセル単位の画素情報の読み書きが前提ですので、「文字をどうピクセルへレンダリングするか」という話題は出てこないだろうと思います。それはもっと抽象レベルに近い高水準機能に属することでその手法についていえば「フォントレンダリング」といったキーワードになるのではないでしょうか。
まぁ、しかしVRAMに何かを書きこみたいというのが質問者さんのやりたいことなのでしょうからそんな高度なフォントレンダリングを調べなくても「もっと素朴なやり方を自前で考えること」が可能だと思います。どんな画素パターンをVRAMに書けばいいかを考えればよいのです。
Text
1...**... 2..*..*.. 3..*..*.. 4..****.. 5.*....*. 6.*....*. 7.*....*. 8........
こんな素朴なパターンでも'A'には見えるんじゃないでしょか。ちなみに色については「VRAMのアクセスを直接やる」ならそのVRAMのフォーマットに全ての秘密があります。例えば3バイトでR,G,Bの順番に256諧調で画素値を指定できるようなフォーマットになっているのであれば、赤のピクセルを書き込むには0xFF 0x00 0x00という3バイトを所定の位置へ書き込めばよいですし、白にしたければ0xFF 0xFF 0xFFにすればいいです。
LinuxでならVRAMにデータを書き込む過程をアセンブリプログラムで見れると考えているのですが、この考えは間違っているでしょうか?
また、printf関数がもしOSに依存しているとしたらLinux同様にアセンブリ変換すればVRAMに文字や色を表すためのデータを受け渡す部分が見れたりするのでしょうか?
多分見ることができても、それを活用できるレベルまで理解するのは「大変困難」と言ってよいと思います。一般のOSによく出てくるTrueTypeフォントですが、その描画メカニズムを調べるだけで相当に難しいと思います。そんなものを調べていたのではいつまでたってもVRAMに書き込むプログラムの完成は見えてこないと思います。(もっと長期的にそのあたりのメカニズム・技術に挑戦するというのはそれはそれで一つの挑戦と思いますし、別に否定するような意見は持ってません)
しかし、'A'という文字コードから前述のビットマップフォントを得るぐらいなら自前でも充分作れるでしょうからそういうアプローチにしたほうがよいでしょう。LinuxやX11のソースコードを調べてconsole/terminalへ出力した文字列がどうレンダリングされるかを読み解こうとはしないほうがよいというのが自分の意見です。
投稿2018/03/10 03:55
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/10 04:03
2018/03/10 04:07
2018/03/10 04:11
2018/03/10 04:37
2018/03/10 04:41
2018/03/10 04:47
2018/03/10 05:26
2018/03/10 06:41
2018/03/10 13:57
0
**回答が付いた後で編集する場合は元の内容も残しておいてください。**あるいはどこをどう修正したかが判るようにしてください。質問と回答の内容がちぐはぐになってしまっています。
題名に書かせていただいた通りPCのVRAMにアセンブリ言語でデータを書き込むことを考えた場合、
アセンブリ言語でなければならない理由は何かおありなのでしょうか。「VRAMにデータを書き込む」ことと「アセンブリ言語でプログラムを書く」ことは別次元の話なので、分けて考えないと混乱します。
Linuxの場合はOS自体がオープンソースであるため、VRAMにデータを書き込む過程をアセンブリプログラムで見れるのでしょうか?
「書き込む」部分アセンブリプログラムで見れるかをお尋ねしたいです。
オープンソースなのだから、わざわざアセンブリプログラムに変換せずともソースをそのまま読めばよろしいでしょう。ほとんどの部分はCで書かれていると思います。
それと、VRAMにデータを書き込んでいるのはドライバーなので、見るべきなのはドライバーのソースということになります。ドライバーのソースを追っていけばいずれはVRAMに書き込んでいる部分にたどり着くと思います。
当然のことながらGPUによってドライバーは変わるので、お使いのドライバーに応じたソースを入手する必要があります。ただし、ドライバーによってはソースを公開していないかもしれません。
投稿2018/03/10 03:10
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/10 03:26
2018/03/10 03:26
2018/03/10 03:54
2018/03/10 03:56
2018/03/10 03:59
2018/03/10 04:05
2018/03/10 05:16
2018/03/10 05:25
2018/03/10 05:32
0
Linuxならオープンソースなので任意の場所にデバッグ出力などを埋め込むことが出来ますから、挙動を見るのは多少容易になるでしょう。アセンブラレベルで見れればよいという話なら、デバッガを使えばLinuxだろうとWindowsだろうと挙動を見ることは出来ますね。
ただし今時のプログラムでVRAMを直接読み書きするのは極めて希です。通常はGPUに命令を送って指示をだし、GPUがVRAMに対して読み書きを行います。もちろん旧来との互換性のためにVGAモードなどで直接VRAMに対して読み書きすることは可能ですが、このためにはディスプレイドライバをVGA互換などに設定しておかないと挙動を見ることは出来ません。
予備知識が全くない状態で挙動を見るのは無茶でしょうから、下記のURL等を参照して予備知識を得ることをお勧めします。
Wikipedia INT 10H
INT 10H: Video Services
またprintf等の文字列の表示に限るなら、BIOS呼び出しで出力しており、直接テキストVRAMに触っていることはないかと思います。
投稿2018/03/10 01:40
総合スコア472
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Rasberry PI でも買ってきて、ベアメタル(OSなし)でVRAMをいじってみればどうです?
そうすればいかに自分が思い違いしてるかというのがわかると思いますが。
投稿2018/03/10 16:59
総合スコア87749
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/11 09:45
2018/03/11 11:12
2018/03/12 05:44
2018/03/12 05:45
2018/03/12 05:49
2018/03/13 16:09
0
無駄にアセンブリにこだわっているようですが、C言語のポインタでハードウェアのI/Oに値を設定するのと、アセンブリのMOV命令で設定するのに本質的な差はないですよ。
また、ソフトウェアを駆使してハードウェアを制御する勉強をするなら他の方々もいっているようにARMやSHなどの組み込み向けマイコンでやった方が得られるものが多いと思います。
MMUやキャッシュ、メモリマップI/OなどPCではブラックボックスになっている部分を直接触ることができます。
ブートローダを作ったりイーサネットのTCP/IPプロトコルスタックを組んだりなど後々にすごく役に立つ経験になるはずです。
投稿2018/03/10 16:41
総合スコア1430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/11 09:43
2018/03/11 09:52
2018/03/11 09:57 編集
2018/03/11 10:47
2018/03/11 11:04
2018/03/11 11:19
2018/03/11 12:35
2018/03/11 12:47 編集
0
VARMで検索すればいくらでも情報が得られると思いますが、printf(アプリケーションによる文字出力)とVRAMとは直接結びついているわけでは有りません。大雑把に言うと、アプリ→システムコール(ドライバ?)→GPUに依頼→VRAMに文字の形のビットマップを作成して描画。ちょっと違うかもしれませんが、GPUによってVRAMの位置も違うしDMAの操作も違う。それをうまくやるのがドライバの役目ですd^^・・・昔Z80の頃はVRAMに直接描けたんですが;;・・・そもそも特権命令を使うアプリを実行できるのだろうか??
投稿2018/03/10 00:42
編集2018/03/10 01:13総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。