当前位置: 技术问答>linux和unix
高分问小白问题(关于处理器寻址)
来源: 互联网 发布时间:2016-10-30
本文导语: 本帖最后由 laojing123 于 2010-12-10 10:26:20 编辑 哎 ,都怪不好好学习! 对系统中寻址不太理解,举个例子:处理器通过北桥连到PCI总线,假设连上的PCI控制器基地址为PCI_BASE,然后通过该PCI总线上有一个USB控制器,我现...
对系统中寻址不太理解,举个例子:处理器通过北桥连到PCI总线,假设连上的PCI控制器基地址为PCI_BASE,然后通过该PCI总线上有一个USB控制器,我现在要访问USB控制器上的某个寄存器,比如寄存器为USB_BASE + OFF_SET,那么处理器是如何定位到该地址的呢?这个地址是不是最终要经过译码反映到处理器的地址线上?
还有,这些控制器的基地址在系统发生变化(比如我把它插到另一个PCI HUB上了)后,基地址也应该随之变化吧,那么怎么去得到他们的地址呢?(在UBOOT下,不是系统启动后)。
跪求大侠们能看懂我的意思。。。高分呢
|
先说简单的,假设处理器的总线地址配置成与物理地址重合,就是说PCI总线的地址与处理器地址一一对应并且没有任何偏移,这种情况下,处理器直接访问物理地址就可以访问总线地址,uboot先对各种桥进行初始化,然后进入PCI枚举阶段,经过扫描,发现设备,然后给那个设备配置了如下地址0xFC000000(其实是应该在数据结构里面),此时因为总线地址与物理地址相同,所以CPU可以int * usb_ctl_pci_base_addr = 0xFC000000;(同样,起始应该是一个数据结构给这个变量赋值,你懂的),当执行如下指令的时候,*usb_ctl_pci_base_addr = 0x11;的时候,处理器将访问发送到前端总线,桥芯片检测到相关地址,发现并非内存地址而是局部总线地址,则转发到下级PCI总线上,你的usb控制器设备发现总线上的地址就是自己的地址的时候,对该请求进行应答,响应相应的写操作。所以整个操作分为3部分:
1,处理器发起
2,桥片会对地址空间进行分类转发到不同控制器并进而在不同总线上发布事务消息
3,你的设备一直处于监听状态,当发现总线上的访问是针对自己的操作,就应答求并完成操作
事实上很多处理器总线地址和处理器地址(这里不再强调物理地址还是逻辑地址)并没直接的对应关系,处理器会配置桥芯片,完成地址的转换,完成映射,处理器直接操作映射出来的地址,完成对总线地址上数据的访问。
1,处理器发起
2,桥片会对地址空间进行分类转发到不同控制器并进而在不同总线上发布事务消息
3,你的设备一直处于监听状态,当发现总线上的访问是针对自己的操作,就应答求并完成操作
事实上很多处理器总线地址和处理器地址(这里不再强调物理地址还是逻辑地址)并没直接的对应关系,处理器会配置桥芯片,完成地址的转换,完成映射,处理器直接操作映射出来的地址,完成对总线地址上数据的访问。
|
在U-boot中访问IO寄存器,有相应的函数,例如:
read8(ptrReg, value); 读8位,
write8(ptrReg, value); 写8位,
等等。
|
一时半会儿说不清,如想去了解,可以去看PCI初始枚举的过程,看他是怎么进行映射的。
访问PCI设备的用配置地址的,配置地址由 总线号 + 设备号 + 功能号 + 寄存器号 决定的,当然HOSTPCI桥的总线号是0。
在设备都接好后,其实每个PCI的上的配置寄存器的地址都确定,就等你去获取。
访问PCI设备的用配置地址的,配置地址由 总线号 + 设备号 + 功能号 + 寄存器号 决定的,当然HOSTPCI桥的总线号是0。
在设备都接好后,其实每个PCI的上的配置寄存器的地址都确定,就等你去获取。
|
内核中的PCI初始化时候,会操作PCI配置空间,映射地址信息
|
其实就是确定设备基址
这在硬件设计时就确定了,要看data sheet, or reference manual
这在硬件设计时就确定了,要看data sheet, or reference manual
|
IC人员在做芯片设计的时候,这些地址就已经定好了。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。