5

私は Ada を初めて使い、カーネルを書き込もうとしていますが、これを適切に行う方法についての良い情報を見つけることができないようです。C では、次のように記述します。

unsigned char* videoram = (char*) 0xB8000;
videoram[0] = 65;

ビデオ RAM に直接アクセスし、'a' を書き込みます。Ada でタイプセーフな方法でこれを行うには、Ada 配列と他のプラグマを使用する必要があると聞いたことがあります。この種の Ada プログラミングに関する適切なリソースはありますか?

4

3 に答える 3

6

You can use the 'Address attribute:

Videoram : String (1 .. Videoram_Size);
for Videoram'Address use 16#B8000#;
-- ...
Videoram (1) := 'a';

If you don't want to use String and Characters, you can define your own data types.. like:

type Byte is mod 2**8; -- unsigned char
type Byte_Array is array (Natural range <>) of Byte;
Videoram : Byte_Array (0 .. Videoram_Size - 1);
for Videoram'Address use 16#B8000#;
-- ...
Videoram (0) := 65;

Btw, you even get range checking for the index, so you can't write outside of the Videoram range.

于 2012-05-30T06:38:06.727 に答える
5

アドレス属性を使用する場合 (つまり、 Object'Address の使用 ... )、 System.Storage_Elements にある To_Address() 関数を使用する必要があります。これは、アドレス タイプが整数である必要がないためです。Ada リファレンス マニュアルには、次のように記載されています。

「アドレスは、事前に作成可能な初期化を備えた明確で制限のない型です」

System.Storage_Elements の Integer_Address タイプについては、次のように述べています。

「Integer_Address は (符号付きまたはモジュラー) 整数サブタイプです。To_Address と To_Integer は、このタイプとアドレスの間で前後に変換します。」

したがって、実際に使用する必要があります:

Object'Address には To_Address( 16#B8000# ) を使用します。

TED の回答から指摘すべき最後のことは、このメソッドを使用したオブジェクトの初期化が心配な場合は、宣言の後にプラグマ Import( Ada, your_object ) を追加して、デフォルトの初期化が抑制されるようにすることです。

于 2012-05-31T05:55:43.943 に答える
3

実際には2つの方法があります。

1 つは、使用するアドレスへのポインターを設定し、ポインターを介してオブジェクトにアクセスすることです。

type Video_RAM_Pointer is access all My_Video_Ram_Struct;
package Convert is new System.Address_To_Access_Conversions (Video_RAM_Pointer);
Video_RAM : constant Video_RAM_Pointer := Convert.To_Access (16#B8000#);

もう 1 つは、データを場所の上に重ねることです。

Video_RAM : My_Video_RAM_Struct;
for Video_RAM'address use at 16#B8000#;

一般的に、私は前者を使用することを好みます。特に、後者は宣言としてカウントされます。つまり、初期化コードを持つ My_Video_RAM_Struct のフィールドは、オーバーレイを宣言するたびに再初期化されます。さらに、その機能を乱用 (悪用) してあちこちにオブジェクトをエイリアスしたくなる傾向があります。これは、オプティマイザと保守プログラマの両方にとって困難です。

ポインターメソッドは、指定されたアドレスがあなたが伝えた構造を保持していると仮定するようにコンパイラーに指示するだけです。これはまさにあなたが望んでいることです。

于 2012-05-30T16:19:39.897 に答える