mmap()获得带有偏移量的64位值

时间:2013-01-31 01:59:24

标签: c raspberry-pi

我被问到这个问题:

  

使用您的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并将其与原始数字相结合的部分。欢迎任何帮助或指导。

1 个答案:

答案 0 :(得分:2)

来自你引用的说明:

  

请记住,对于这种情况,mmap()只能在页面上运行   __SC_PAGESIZE字节,所以地址0x20003004不能直接映射 - 地址必须是__SC_PAGESIZE对齐。

这意味着mmap()只能映射到与__SC_PAGESIZE对齐的地址。这也意味着mmap()返回的地址可以取消引用至page_size。即,如果mmap()的{​​{1}}调用返回0x20003000,则可以在0x20003000内取消引用指针。

我会把剩下的作为读者的练习。