5

我目前正在使用 Linux 内核模块,我需要访问一些存储在数组中的 64 位值,但是我首先需要从 void 指针进行转换。

我正在使用phys_to_virt返回 void 指针的内核函数,我不完全确定如何实际使用此 void 指针来访问它指向的数组中的元素。

目前我正在这样做:

void *ptr;
uint64_t test;

ptr = phys_to_virt(physAddr);
test = *(uint64_t*)ptr;
printk("Test: %llx\n", test);

我从测试中得到的值不是我期望在数组中看到的,所以我很确定我做错了什么。我需要访问数组中的前三个元素,因此我需要将 void 指针转换为 uint64_t[] 但我不太确定如何执行此操作。

任何建议将不胜感激。

谢谢

4

1 回答 1

3

我正在使用返回 void 指针的内核函数 phys_to_virt,我不完全确定如何实际使用此 void 指针来访问它指向的数组中的元素。

是的,phys_to_virt()确实返回一个void *. 的概念void *是它是无类型的,因此您可以将任何内容存储到其中,是的,您需要将其类型转换为某些内容以从中提取信息。

ptr = phys_to_virt(physAddr); // void * returned and saved to a void *, that's fine

test = *(uint64_t*)ptr; // so: (uint64_t*)ptr is a typecast saying "ptr is now a 
                        //      uint64_t pointer", no issues there
                        // adding the "*" to the front deferences the pointer, and 
                        // deferencing a pointer (decayed from an array) gives you the
                        // first element of it.

所以是的,test = *(uint64_t*)ptr;将正确地进行类型转换并为您提供数组的第一个元素。注意你也可以这样写:

test = ((uint64_t *)ptr)[0];

您可能会发现它更清楚一点,并且意味着同样的事情。

于 2013-03-27T18:35:57.770 回答