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 把数据传过去,
也可以把内核空间的地址映射到用户空间。
这样取物理地址是不对的, 物理地址是由硬件规定的, 是固定的。
虚拟地址是有物理地址映射而来, 你不能直接由普通的虚拟地址得到物理地址。
要将数据传到用户空间, 可以直接 做一个 ioctl 调用 ,使用 copy_to_user 把数据传过去,
也可以把内核空间的地址映射到用户空间。
#4
这,内核程序都是对线性地址操作。。。 不针对物理地址
记得以前在内核开发邮件列表也有人问这个 很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。
记得以前在内核开发邮件列表也有人问这个 很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。
#5
呵呵,八错八错
#6
一般除了硬件相关的部分,应该都不会用到物理地址
#7
使用物理地址 也是使用映射了内核空间的线性地址。。。 比如 ioremap 之类的
#8
物理地址,这个是动态变化的啊。
因为,内存管理会换页,当然,kernel是常驻内存的。
因为,内存管理会换页,当然,kernel是常驻内存的。
#9
对于高位内存__pa是不正确的,对于低位内存(小于896M),__pa返回的正好是物理地址。
#10
不过楼上回答得很有意思,建议多读下内存管理部分代码
#1
还有一个问题也请教一下,如果我在用户空间也申请了同样的struct test结构,然后把用户空间的mytest[]的地址传递到内核空间。请问在内核空间可以直接把内核中的test拷贝到这个地址吗?如果不能怎么做呢?以第一个问题为主,这个是自己刚刚想到的。谢谢了……
#2
#3
__pa((unsigned int)&mytest[0]),
这样取物理地址是不对的, 物理地址是由硬件规定的, 是固定的。
虚拟地址是有物理地址映射而来, 你不能直接由普通的虚拟地址得到物理地址。
要将数据传到用户空间, 可以直接 做一个 ioctl 调用 ,使用 copy_to_user 把数据传过去,
也可以把内核空间的地址映射到用户空间。
这样取物理地址是不对的, 物理地址是由硬件规定的, 是固定的。
虚拟地址是有物理地址映射而来, 你不能直接由普通的虚拟地址得到物理地址。
要将数据传到用户空间, 可以直接 做一个 ioctl 调用 ,使用 copy_to_user 把数据传过去,
也可以把内核空间的地址映射到用户空间。
#4
这,内核程序都是对线性地址操作。。。 不针对物理地址
记得以前在内核开发邮件列表也有人问这个 很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。
记得以前在内核开发邮件列表也有人问这个 很多人的回答是:有什么样的需求会要求得到它的物理地址呢? 结果往往是根本不需要。
#5
呵呵,八错八错
#6
一般除了硬件相关的部分,应该都不会用到物理地址
#7
使用物理地址 也是使用映射了内核空间的线性地址。。。 比如 ioremap 之类的
#8
物理地址,这个是动态变化的啊。
因为,内存管理会换页,当然,kernel是常驻内存的。
因为,内存管理会换页,当然,kernel是常驻内存的。
#9
对于高位内存__pa是不正确的,对于低位内存(小于896M),__pa返回的正好是物理地址。
#10
不过楼上回答得很有意思,建议多读下内存管理部分代码