转换void指针到C语言的uint64_t数组



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

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

当前我正在做这个:

void *ptr;
uint64_t test;
ptr = phys_to_virt(physAddr);
test = *(uint64_t*)ptr;
printk("Test: %llxn", test);

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

如有任何建议,不胜感激。

谢谢

我正在使用内核函数phys_to_virt,它返回一个void指针,我不完全确定如何实际使用这个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];

你可能会觉得更清楚一些,意思是一样的

最新更新