免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4754 | 回复: 15
打印 上一主题 下一主题

虚拟地址空间的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-20 09:30 |只看该作者 |倒序浏览
一个嵌入式系统有不同的芯片构成.每个芯片在设计时都有自己固定的虚拟地址.比如网卡的虚拟地址 0x90000000~0x900fffff
可是反汇编出来的内核程序的地址都在0xb0000000~0xb0ffffff之间.应用程序的地址空间在0x10000000 ~ 0x10800000
比较疑惑的是,为什么网卡的虚拟地址空间没有用到? 反汇编出来的地址空间和开始设计好的虚拟地址空间,两者的地址空间有没有关联?
请大侠指点.

论坛徽章:
0
2 [报告]
发表于 2009-10-20 09:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2009-10-20 11:37 |只看该作者
反汇编出来的是物理地址吧?我想。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
4 [报告]
发表于 2009-10-20 13:37 |只看该作者
lz先确定自己用的处理器构架,总线构架,和操作系统.

芯片不会确定什么虚拟地址,虚拟地址一般是是启用MMU后生效的.
那么只有操作系统才有管理到虚拟地址.
UClinux是不用虚拟地址的,我看你的几个地址感觉不像是linux而像是uclinux.
没有虚拟地址的情况下,汇编指令当然看到的都是对物理地址的寻址.
这样可以解释你的网卡的"地址" 0x90000000~0x900fffff,就是物理地址.
而一般网卡提供给系统的操作寄存器界面就属于IO操作.
所以你这段地址就是IO地址,但是你的体系结构可能是ARM的,所以不用专门的IO指令,而是用访问内存的指令,来访问这些寄存器.
另外网卡一般都是PCI总线的网卡,你说给的网卡的地址应该就是网卡上的一些寄存器组,用于控制网卡,看了你另一个帖子,要提醒,你不要指望把网络数据包写到这些寄存器里面去.
对于PCI的这段IO控制的内存地址映射,可以动态的映射到内存物理地址空间的任意段,只需要通过写PCI BAR就可能做到,但是一般嵌入式平台"喜欢"把某个设备的这段地址在软件里"写死",然后把这个值再写到设备的PCI BAR,这样分配.
如果不是PCI设备,我就不知道了,芯片是不是把它定死,很难说.

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
5 [报告]
发表于 2009-10-20 14:32 |只看该作者
在AHB总线中(AMBA总线的一种),一个slave设备有它的片选,这样在一次寻址中就通过总线产生片选,这意味着在物理内存地址空间中,slave设备的地址是固定的,它取决于片选的逻辑电路,而这个逻辑电路可能是在芯片做好就确定的.
更正以下前面的,说网络数据包不能直接写到这部分物理地址空间,可能不是对的,因为LZ的网卡占用的1M的地址空间,所以不否认这里面有可以直接承载网络数据的内存地址空间.

[ 本帖最后由 smalloc 于 2009-10-20 14:40 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-10-20 15:54 |只看该作者
用的PowerPC的架构,操作系统是Lynx.

开始认为0x90000000~0x900fffff 是虚拟地址,因为觉得这么大的地址空间,一般在嵌入式系统上不存在这么大的物理空间(2.25G)了,就把这个地址理解成了虚拟地址.
仔细一想,如果芯片接到地址线的高位上,有这么大的空间也就不奇怪了.

我的系统上肯定有MMU功能,所以反汇编出来的地址应该是虚拟地址.

现在剩下这么一个疑问:
程序代码或者数据在什么情况下才用到0x90000000~0x900fffff 地址空间. 这一点还没想明白.
是不是一旦代码(0xb0000000~0xb0ffffff)对网卡的驱动或者数据进行操作,汇编出来的(0xb0000000~0xb0ffffff)地址空间的代码会自动通过MMU变成对0x90000000~0x900fffff地址空间的操作? 忘赐教

[ 本帖最后由 怪怪虎 于 2009-10-20 15:55 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-10-20 15:57 |只看该作者
原帖由 prolj 于 2009-10-20 11:37 发表
反汇编出来的是物理地址吧?我想。

这个不一定, 个人觉得如果有MMU功能,就是虚拟地址,如果没有,可能是物理地址.

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
8 [报告]
发表于 2009-10-20 16:39 |只看该作者
没见过ppc,但我反复看了ARM,然后比对LZ所说的.
我只能猜想:
对于x86每进程有独立的4G线形地址空间,他们就是虚拟地址.
而LZ能把物理地址空间映射到"虚拟地址空间"来.
那只能断定操作系统对于对个进程,包括内核本身的虚拟->物理地址的映射表 对于这部分映射都一致的.
有mmu,但是可以禁用,所以"有MMU功能,就是虚拟地址"是不对的.

>>程序代码或者数据在什么情况下才用到0x90000000~0x900fffff 地址空间. 这一点还没想明白.
驱动程序里会用到这些地址做IO操作.读写寄存器.

>是不是一旦代码(0xb0000000~0xb0ffffff)对网卡的驱动或者数据进行操作,汇编出来的(0xb0>000000~0xb0ffffff)地址空间的代码会自动通过MMU变成对0x90000000~0x900fffff地址空>间的操作?
既然认定(假设)0x90000000~0x900fffff是虚拟地址,则程序直接对它操作,它会被mmu转为物理地址出去.

对于这句话:
比如网卡的虚拟地址 0x90000000~0x900fffff
可是反汇编出来的内核程序的地址都在0xb0000000~0xb0ffffff之间


不是太明白?是不是说原来地址是 0x90000000~0x900fffff
但是内核中驱动访问网卡都是0xb0000000~0xb0ffffff

还是其他意思??而且一个5个f,一个是6个f,大小也不一样.

[ 本帖最后由 smalloc 于 2009-10-20 16:43 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-10-20 20:08 |只看该作者

回复 #8 smalloc 的帖子

>>程序代码或者数据在什么情况下才用到0x90000000~0x900fffff 地址空间. 这一点还没想明白.
驱动程序里会用到这些地址做IO操作.读写寄存器.
>>>你的意思是把寄存器的内容读到这个区间内,还是区间的某些地址可以充当寄存器。 个人觉得是后者的可能性不大,因为一般寄存器也就有三四个就够用了,这么打的地址区间太浪费了。
     我觉得之所以得出这么个区间是由于网卡的地址线与cpu的地址线的连接造成的。

比如网卡的物理地址 0x90000000~0x900fffff  (注意这里是物理地址)
可是反汇编出来的内核程序的地址都在0xb0000000~0xb0ffffff之间
>>>我是想说,一旦我们的内核程序写完,编译成功后,生成a.out, 在这种情况下,反汇编a.out,生成的反汇编地址是在0xb0000000~0xb0ffffff 之间,此时的地址空间是在硬盘上反汇编出来的。虽然是在硬盘上的地址,在实际运行时,也是这0xb0000000~0xb0ffffff区间内,为什么没涉及到这个区间0x90000000~0x900fffff,个人认为有关网卡的程序和数据应该在0x90000000~0x900fffff这个区间内。而不应该在xb0000000~0xb0ffffff区间内。(默认网卡的驱动肯定在内核中,这个是一定的奥)

论坛徽章:
0
10 [报告]
发表于 2009-10-21 09:59 |只看该作者
对上边的问题有重新思考了一遍. 得到如下的结论:
不管反汇编的地址是多少,(内核0xb0000000~0xb0ffffff,应用程序0x10000000 ~ 0x10800000),最终这些二进制代码都会被考到SRAM/DRAM中运行.因为一般程序的代码最终只能在SRAM/DRAM中运行, (不考虑flash),动态数据一般在SRAM/DRAM中,静态的数据一般在flash中.也就是说程序代码会按照反汇编的编排方式存放到SRAM/DRAM中,而SRAM/DRAM的地址可能是从物理地址0x00000000开始化.至于把代码放到SRAM/DRAM的什么位置,有编程者自己实现.

为什么没用在代码中出现对物理地址0x90000000~0x900fffff的应用?
>>其实/一定要用到的,一般对某个芯片的操作/访问,我们都会有个宏定义来定义此芯片的起始地址 如#define PCI_BASE 0x90000000  在程序代码中肯定有对这个地址的应用,因而也就能访问到网卡的硬件地址了.
  另外对芯片的其他寄存器,一般会给出相对于这个基地址的一些值, 比如
   #define Controller_Reg 0x02 估计这些都是在驱动中完成的.

以上是个人分析,应为没有做过这方面的项目,但是对这些实现很感兴趣,所以个人学习了下,不对之处,忘指点.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP