Q: 19.25 我如何访问某个地址上的内存(一个内存映射设备或图形内存)?我如何在C中查看或写入内存?


A: 设置一个适当类型的指针为一个正确的数字(使用一个显式类型转换以确定你意欲进行这个不可移植的转换):

  unsigned int *magicloc = (unsigned int *)0x12345678;

然后,*magicloc表示你你需要的位置。如果这个位置是一个内存映射I/O寄存器,你可能也需要使用volatile限定符:“volatile unsigned int *magicloc”。(如果你想不按字引用某个地址,使用unsigned char * 。)

在MS-DOS下,你会发现一个像MK_FP这样的宏,用于处理段和偏移。像Gary Blaine建议的那样,你也能声明一个巧妙的数组,它允许你使用数组表示来访问屏幕内存。例如,在一个80x25文本模式的MS-DOS机器上,这个声明

  unsigned short (far * videomem)[80] =
    (unsigned short (far *)[80])0xb8000000;

你能访问位于行i,列j上的字符和特征字节,使用videomem[i][j]。

许多操作系统在一个不能直接访问I/O设备(或进程外的任意地址)的保护模式,执行用户模式程序。在这种情形,你将需要请求操作系统为你完成I/O操作。

同时参见问答4.14和5.19。

参考:K&R1 Sec. A14.4 p. 210
K&R2 Sec. A6.6 p. 199
ISO Sec. 6.3.4
Rationale Sec. 3.3.4
H&S Sec. 6.2.7 pp. 171-2


(This Chinese translation isn't confirmed by the author, and it isn't for profits.)

Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/osdep/rawmemadr.html