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

[复制链接]
查看11 | 回复10 | 2021-1-27 06:34:30 | 显示全部楼层 |阅读模式
我在内核中有一个结构:
structtest
{
inta[10000];
intb[10000];
};
structtest*mytest[4];
然后为每个mytest分配内核空间,以mytest[0]为例:
order=get_order(sizeof(structtest));
mytest[0]=(structtest*)__get_free_pages(GFP_KERNEL,order);
后面mytest[1]至mytest[3]是一样的。
现在的问题是:
我怎样得到mytest[0]以及其它mytest的物理地址?我用__pa((unsignedint)&mytest[0]),结果出现很多段错误。
请高手指点,非常急的问题,谢谢了……

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
还有一个问题也请教一下,如果我在用户空间也申请了同样的structtest结构,然后把用户空间的mytest[]的地址传递到内核空间。请问在内核空间可以直接把内核中的test拷贝到这个地址吗?如果不能怎么做呢?以第一个问题为主,这个是自己刚刚想到的。谢谢了……
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
http://www.lupaworld.com/bbs/redirect.php?tid=40233&goto=lastpost
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
__pa((unsignedint)&mytest[0]),
这样取物理地址是不对的,物理地址是由硬件规定的,是固定的。
虚拟地址是有物理地址映射而来,你不能直接由普通的虚拟地址得到物理地址。
要将数据传到用户空间,可以直接做一个ioctl调用,使用copy_to_user把数据传过去,
也可以把内核空间的地址映射到用户空间。
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
这,内核程序都是对线性地址操作。。。不针对物理地址
记得以前在内核开发邮件列表也有人问这个很多人的回答是:有什么样的需求会要求得到它的物理地址呢?结果往往是根本不需要。
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
呵呵,八错八错
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
引用4楼threeleafzerg007的回复:这,内核程序都是对线性地址操作。。。不针对物理地址
记得以前在内核开发邮件列表也有人问这个很多人的回答是:有什么样的需求会要求得到它的物理地址呢?结果往往是根本不需要。

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

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
引用6楼datacode的回复:引用4楼threeleafzerg007的回复:
这,内核程序都是对线性地址操作。。。不针对物理地址
记得以前在内核开发邮件列表也有人问这个 很多人的回答是:有什么样的需求会要求得到它的物理地址呢?结果往往是根本不需要。
一般除了硬件相关的部分,应该都不会用到物理地址

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

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
物理地址,这个是动态变化的啊。
因为,内存管理会换页,当然,kernel是常驻内存的。
回复

使用道具 举报

千问 | 2021-1-27 06:34:30 | 显示全部楼层
对于高位内存__pa是不正确的,对于低位内存(小于896M),__pa返回的正好是物理地址。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行