0

ドライバーやファームウェア、その他のオペレーティング システムを作成するためのベアメタル プログラミングを勉強したいと思っていますが、これらの言語を学習するための優れた教材を見つけることができません。私が見つけた asm の宝石はほとんどなく、16 進数でのプログラミングについては何も見つかりませんでした。ストレート 16 進数とは、Linux カーネルのファームウェア セクションにあるようなものを意味します。http://www.omnimaga.org/index.php?topic=6272.0という 2 か月間の検索で得た最も近いものであり、このチュートリアルには情報が少なすぎて、私の知識ではフォローアップされていませんでした。

TL;DR: hex を学びたいです。どこ?

注:私は、これがいかに困難で、記念碑的で、マゾヒスティックな試みになるかを理解しています。あなたは私に言う必要はありません。このむち打ちの旅は、学習教材がない場合よりもあったほうがうまくいきます。

2 番目の注記:オペレーティング システム、カーネル、および I/O デバイスの内部の仕組みについては、抽象的ではありますが、メモリがどのように機能し、どのように割り当てられるかについて、既に多くのことを知っています。

私の内なるオタクは落ち着きがない!

4

4 に答える 4

3

これがあなたの落ち着きのない内なるオタクを失望させた場合、申し訳ありませんが、あなたはこれらのファームウェアブロブの目的とそれらの作成パスの両方を誤解していると思います。

Linuxに存在するファームウェアファイルは、インターフェイスアダプターにアップロードする必要のあるもののチャンクであり、そのアダプターに存在するインテリジェンスによって実行されます。多くの場合、これらは非常に特殊なASICであり、ファームウェアをバイナリブロブとしてアップロードする必要があるいくつかの潜在的な理由があります。ASICプロデューサーは、チップの正確な内部動作を明らかにしたくない、または望んでいない(またはできない) )ソースコードまたは必要なツールをユーザーと共有します。

ただし、これは、ファームウェアのブロブが1日中16進コードを猛烈にパンチした結果であるという意味ではありません。これらのファイルは、通常のプログラミングに非常に匹敵するワークフローをサポートするツールチェーンで動作を開始することがほとんどです。ソースコードはいくつかのより高い言語(ただし、CやC ++などの一般的な言語の1つである必要はありません)で生成され、そのコードはバイナリファイル(ファームウェアファイル)にコンパイルされます。

ですから、これは夏の最初のバーベキューで人々を驚かせる巧妙なトリックかもしれませんが、「プログラミングヘックス」の実際のアプリケーションはほとんど存在しません。本当に深く行きたいのであれば、アセンブリは十分に深いです。最近のコンパイラ技術の改善のおかげで、ほとんどのマイクロコントローラ開発でさえアセンブリで行われなくなったため、古いDOSソフトウェアを掘り下げるのが最善の策かもしれません。そこでは、アセンブリコードで記述されたアプリケーションがたくさんあります。

于 2013-02-09T00:26:25.730 に答える
3

x86 プロセッサを 16 進数でプログラミングする方法を知りたい場合、必要な情報はすべてIntel Software Developer Manualsにあります。最も具体的には、ボリューム 2 のすべての情報が必要です。第 2 章では、一般的な命令のエンコードについて説明し、第 3 章と第 4 章では、すべての特定の命令について説明します。

于 2013-02-08T23:49:57.583 に答える
1

調べている CPU のプロセッサ オペコードを参照してください。これらのコードは、アセンブリ pnumonics を「16 進」値に変換するロゼッタ ストーンであり、アセンブラが行うことのかなりの部分です。それからそれを使って絶望します。私はアセンブリに強いバックグラウンドを持っており、リリース ビルドをデバッグするときに日常的に使用しています。しかし、単純なオペコードの読み取りと書き込みは、もはやそれほど有用ではありません。私が最後にそのようなことをしたのは、HBlanks 中の効率的なパレット塗りつぶしのために、Color Gameboy に自己修正コードを書き戻すことでした。私が言ったように、非常に専門的で、厄介なキャッシュが邪魔になる現代では役に立ちません。

于 2013-02-09T00:34:27.273 に答える
0

「Linux Assembly Tutorial」というタイトルのこのドキュメントを試しましたか

http://docs.cs.up.ac.za/programming/asm/derick_tut/

たとえば、次のような "hello world" があります (そのままコピー):

section .data
    hello:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
    helloLen:  equ $-hello             ; Length of the 'Hello world!' string
                                   ; (I'll explain soon)

section .text
    global _start

_start:
    mov eax,4            ; The system call for write (sys_write)
    mov ebx,1            ; File descriptor 1 - standard output
    mov ecx,hello        ; Put the offset of hello in ecx
    mov edx,helloLen     ; helloLen is a constant, so we don't need to say
                     ;  mov edx,[helloLen] to get it's actual value
    int 80h              ; Call the kernel

    mov eax,1            ; The system call for exit (sys_exit)
    mov ebx,0            ; Exit with return code of 0 (no error)
    int 80h

(これを取得した Google クエリは次のとおりです: https://www.google.co.uk/search?q=how+to+write+drivers&oq=how+to+write+drivers )

于 2013-02-08T23:52:56.303 に答える