我被问到这个问题:
使用您的RPi,编写一个读取自由运行系统的C函数 计时器。系统计时器每微秒计数一次。放置 这个函数的源是它自己的文件。自由运行计时器是64 位值位于物理内存地址0x20003004,但是, RPi在该存储区中一次只能访问32位。访问 这些内存位置mmap()将在文件/ dev / mem上调用。 务必始终检查错误并采取适当的措施。至 访问系统计时器: (a)检查计数器是否被映射 测试静态变量。
(b)如果未映射计数器,则
我。 打开/ dev / men只读。
II。获取系统页面大小
III。呼叫 mmap()并将返回的地址(指向32位整数)保存在a中 静态变量。通过允许mmap()设置地址来调用mmap() 映射。将长度设置为页面大小。将保护设置为 只读。将标志设置为共享映射。接下来,传递文件 open()返回的描述符,然后将偏移量设置为0x20003000。 请记住,对于这种情况,mmap()只能在页面上运行 __SC_PAGESIZE字节,所以地址0x20003004不能直接映射 - 地址必须是__SC_PAGESIZE对齐。
IV。设置 静态变量,表示发生了初始化。
诉 关闭打开的文件。
(c)如果初始化成功,则返回64 通过将索引1处的32位值与32位进行组合来得到位数 index 2处的值。索引1处的32位值包含最少值 计数器的重要32位。索引2处的32位值 包含计数器的最重要的32位。除此以外 返回0。
我能够获取第一个内存位置0x20003000
的计时器内容:
int main(int argc, char * argv[])
{
int temp;
int page_size;
int *map;
temp = open("/dev/mem", O_RDONLY);
page_size = sysconf(_SC_PAGESIZE);
map = mmap(0, page_size, PROT_READ, MAP_SHARED, temp, 0x20003000);
printf("%X \n", map);
close(temp);
return 0;
}
我迷失了它要求我获得另一个32位数0x20003004
并将其与原始数字相结合的部分。欢迎任何帮助或指导。
答案 0 :(得分:2)
来自你引用的说明:
请记住,对于这种情况,mmap()只能在页面上运行 __SC_PAGESIZE字节,所以地址0x20003004不能直接映射 - 地址必须是__SC_PAGESIZE对齐。
这意味着mmap()
只能映射到与__SC_PAGESIZE
对齐的地址。这也意味着mmap()
返回的地址可以取消引用至page_size
。即,如果mmap()
的{{1}}调用返回0x20003000
,则可以在0x20003000
内取消引用指针。
我会把剩下的作为读者的练习。