虚拟地址空间的疑问

发布于 2022-09-18 04:23:57 字数 230 浏览 12 评论 0

一个嵌入式系统有不同的芯片构成.每个芯片在设计时都有自己固定的虚拟地址.比如网卡的虚拟地址 0x90000000~0x900fffff
可是反汇编出来的内核程序的地址都在0xb0000000~0xb0ffffff之间.应用程序的地址空间在0x10000000 ~ 0x10800000
比较疑惑的是,为什么网卡的虚拟地址空间没有用到? 反汇编出来的地址空间和开始设计好的虚拟地址空间,两者的地址空间有没有关联?
请大侠指点.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

计㈡愣 2022-09-25 04:23:57

反汇编出来的是物理地址吧?我想。

小情绪 2022-09-25 04:23:57

lz先确定自己用的处理器构架,总线构架,和操作系统.

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

絕版丫頭 2022-09-25 04:23:57

在AHB总线中(AMBA总线的一种),一个slave设备有它的片选,这样在一次寻址中就通过总线产生片选,这意味着在物理内存地址空间中,slave设备的地址是固定的,它取决于片选的逻辑电路,而这个逻辑电路可能是在芯片做好就确定的.
更正以下前面的,说网络数据包不能直接写到这部分物理地址空间,可能不是对的,因为LZ的网卡占用的1M的地址空间,所以不否认这里面有可以直接承载网络数据的内存地址空间.

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

柠栀 2022-09-25 04:23:57

用的PowerPC的架构,操作系统是Lynx.

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

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

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

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

筱果果 2022-09-25 04:23:57

原帖由 prolj 于 2009-10-20 11:37 发表
反汇编出来的是物理地址吧?我想。

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

末骤雨初歇 2022-09-25 04:23:57

没见过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 编辑 ]

梦过后 2022-09-25 04:23:57

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

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

手心的海 2022-09-25 04:23:57

对上边的问题有重新思考了一遍. 得到如下的结论:
不管反汇编的地址是多少,(内核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 估计这些都是在驱动中完成的.

以上是个人分析,应为没有做过这方面的项目,但是对这些实现很感兴趣,所以个人学习了下,不对之处,忘指点.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文