如何直接在Ada中访问内存地址?

Mar*_*ons 4 operating-system ada vga

因此,我是Ada的新手,我正在尝试在其中编写内核,但是似乎找不到关于如何正确执行此操作的任何好信息。在C语言中,我会写:

unsigned char* videoram = (char*) 0xB8000;
videoram[0] = 65;
Run Code Online (Sandbox Code Playgroud)

直接访问视频ram并在其中写入“ a”。我听说我需要使用Ada数组和其他编译指示在Ada中以类型安全的方式执行此操作。这种Ada编程是否有任何好的资源?

oen*_*one 5

您可以使用以下'Address属性:

Videoram : String (1 .. Videoram_Size);
for Videoram'Address use 16#B8000#;
-- ...
Videoram (1) := 'a';
Run Code Online (Sandbox Code Playgroud)

如果您不想使用字符串和字符,则可以定义自己的数据类型。

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;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您甚至可以对索引进行范围检查,因此您不能写在Videoram范围之外。


Mic*_*der 5

如果您使用地址属性(即 Object'Address use ... ),您应该使用 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) 以便抑制默认初始化。