在内核中怎样获得一个结构的物理地址(急)

时间:2022-01-19 17:31:35
我在内核中有一个结构:
struct test
{
     int a[10000];
     int b[10000]; 
};
struct test *mytest[4];

然后为每个mytest分配内核空间,以mytest[0]为例:
order=get_order(sizeof(struct test));
mytest[0]=(struct test *)__get_free_pages(GFP_KERNEL, order);
后面mytest[1]至mytest[3]是一样的。

现在的问题是:
我怎样得到mytest[0]以及其它mytest的 物理地址?我用__pa((unsigned int)&mytest[0]),结果出现很多段错误。

请高手指点,非常急的问题,谢谢了……

10 个解决方案

#1


还有一个问题也请教一下,如果我在用户空间也申请了同样的struct test结构,然后把用户空间的mytest[]的地址传递到内核空间。请问在内核空间可以直接把内核中的test拷贝到这个地址吗?如果不能怎么做呢?以第一个问题为主,这个是自己刚刚想到的。谢谢了……

#3


__pa((unsigned int)&mytest[0]),

这样取物理地址是不对的, 物理地址是由硬件规定的, 是固定的。
虚拟地址是有物理地址映射而来, 你不能直接由普通的虚拟地址得到物理地址。

要将数据传到用户空间, 可以直接 做一个 ioctl 调用 ,使用 copy_to_user 把数据传过去,
也可以把内核空间的地址映射到用户空间。

#4


这,内核程序都是对线性地址操作。。。 不针对物理地址

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

#5


呵呵,八错八错

#6


引用 4 楼 threeleafzerg007 的回复:
这,内核程序都是对线性地址操作。。。 不针对物理地址 

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

一般除了硬件相关的部分,应该都不会用到物理地址

#7


引用 6 楼 datacode 的回复:
引用 4 楼 threeleafzerg007 的回复:
这,内核程序都是对线性地址操作。。。 不针对物理地址

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

一般除了硬件相关的部分,应该都不会用到物理地址


使用物理地址 也是使用映射了内核空间的线性地址。。。  比如 ioremap 之类的

#8


物理地址,这个是动态变化的啊。

因为,内存管理会换页,当然,kernel是常驻内存的。

#9


对于高位内存__pa是不正确的,对于低位内存(小于896M),__pa返回的正好是物理地址。

#10


不过楼上回答得很有意思,建议多读下内存管理部分代码

#1


还有一个问题也请教一下,如果我在用户空间也申请了同样的struct test结构,然后把用户空间的mytest[]的地址传递到内核空间。请问在内核空间可以直接把内核中的test拷贝到这个地址吗?如果不能怎么做呢?以第一个问题为主,这个是自己刚刚想到的。谢谢了……

#2


#3


__pa((unsigned int)&mytest[0]),

这样取物理地址是不对的, 物理地址是由硬件规定的, 是固定的。
虚拟地址是有物理地址映射而来, 你不能直接由普通的虚拟地址得到物理地址。

要将数据传到用户空间, 可以直接 做一个 ioctl 调用 ,使用 copy_to_user 把数据传过去,
也可以把内核空间的地址映射到用户空间。

#4


这,内核程序都是对线性地址操作。。。 不针对物理地址

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

#5


呵呵,八错八错

#6


引用 4 楼 threeleafzerg007 的回复:
这,内核程序都是对线性地址操作。。。 不针对物理地址 

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

一般除了硬件相关的部分,应该都不会用到物理地址

#7


引用 6 楼 datacode 的回复:
引用 4 楼 threeleafzerg007 的回复:
这,内核程序都是对线性地址操作。。。 不针对物理地址

记得以前在内核开发邮件列表也有人问这个  很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。

一般除了硬件相关的部分,应该都不会用到物理地址


使用物理地址 也是使用映射了内核空间的线性地址。。。  比如 ioremap 之类的

#8


物理地址,这个是动态变化的啊。

因为,内存管理会换页,当然,kernel是常驻内存的。

#9


对于高位内存__pa是不正确的,对于低位内存(小于896M),__pa返回的正好是物理地址。

#10


不过楼上回答得很有意思,建议多读下内存管理部分代码