2016年12月问题记录与总结--PCIE调试心得

1.TMS320C6678 PCIE模块调试总结

1.所谓outbound一般来说是RC发起的向EP的写操作。InboundEP接收来自RC的写操作。

 

2.PCIERCEP的初始化在PCIEdatasheet中有详细的步骤,但是实际使用的时候,需要按照如下的过程去配置:

第一步:配置RC端和EP端的时钟,电源使能,serdespll,以及模式(RC或者EP)等,这些配置好了,才能linkup上,在调试通信的时候,使得你的两个端点能够Linkup是第一步。

第二步:EP设置自己的ob_size,然后对自己的BAR_MASK寄存器的初始化,这里BAR_MASK寄存器最大的作用是告诉RC我需要申请多大的窗口,RC根据这个申请从本端0x60000000开始的256M大小的地址窗口中分配一段给EP。这里需要用几个BAR,每个BAR的属性需要具体设置。

第三步:EP设置自己的msi_cap寄存器,表明需要申请的中断向量个数。

第四步:这时候EP开始link training,并开始poll自己的bar寄存器,等待RC对其设置了有效的BAR的值的时候,才开始进行下一步。

第五步:RC端在linkup后,首先需要配置自己的baselimit寄存器,这个作用主要是type类型的RC用来判断地址类型,从而决定是否对进来的TLP进行过滤。

第六步:RC开始Link training,并且等待link up

第七步:如果是多个设备的话,有pcie交换机,RC需要枚举,判断系统中有多少个EP,这里以两端直连为例,RC先往EPBAR寄存器写,然后再读出来,进行对比,就可以知道EP申请的窗口有多大。

第八步:RC根据EP申请的窗口大小,来配置本端的outbound相关的寄存器,这里需要制定一个pcie空间的地址,这个地址一般卸载ob_offset_index中,这个地址需要跟接着写到EP端的BAR寄存器里面的base addr一致。

第九步:前面第四步EP link up之后,一直在poll自己的bar寄存器,等待RC来配置自己,一旦读到有效的BAR之后,EP开始根据RC设置的BAR来设置自己的inbound相关的寄存器。

第十步:RC读取EPmsi_cap寄存器,分配中断向量,并且把写事物的地址和dataEP

至此,完成。

 

3.为什么EP端的BAR寄存器是由RC来配置的?这是因为,RC下面有多个EP,如果每一个都自己配置地址空间,在RC端就会形成地址冲突。

 

4.有几个地址概念:内部总线地址,inbound地址,outbound地址,pcie地址

内部总线地址:即DSP内部访问寄存器和内存的地址,这个地址是来自内部CPU32位总线地址。

Inbound地址:这个地址是经过PCIESSoutbound转换过的地址,该地址需要和BAR寄存器的一个地址匹配才会被接收。

Outbound地址:这个地址是送往PCIE空间的地址,需要和对端的BAR寄存器中的一个匹配。

PCIE地址:可以理解为两端地址转换的中间桥梁地址,PCIE有自己的地址空间约束。

 

5.关于cfg_setup寄存器的作用

当你需要访问远端的设备,这个寄存器是必须要设置的,假设你的枚举结束,你在交换机的下面有一个EP,假设在RC段需要bus=2,dev=0,fun=0才能访问到它,那在你RC读写该EP设备的时候,需要把这三个号设置到cfg_setup寄存器。当直连的时候,这个寄存器不用管,默认0,0,0就是可以访问的,这是因为RC相当于一个主桥,cpu出来以后,会虚拟一个bus号为0。当接交换机的时候,最为重要的就是type类型,手册上说访问type1类型的,需要设置为1,访问type0类型的需要设置为0.根据实际测试结果,从第二个bus开始,访问远端设备需要使用type1,当使用第一个bus号的时候,type0.比如,bus0开始,则访问bus>=1的时候,就需要用type1了。

 

6.PCIE交换机的枚举过程

这是一个深度递归的过程,从bus:device:func0:0:0开始,每过一个桥都要更新一下已经有的设备的这三个号,一般的交换机的端口视为一个虚拟桥。要区别每一个桥下面是否挂有EP设备,有些交换机的端口是作特殊用途的。 在枚举过程中,需要分配设置交换的memory accesssmem base limit寄存器,以分配PCIE空间的地址。将枚举结果存放到一个结构体链表中,方便查询使用。

### 处理基本 ACL 高级 ACL 的冲突配置 当在网络设备上同时配置了基本访问控制列表(Standard Access Control List, Standard ACL)和高级访问控制列表(Extended Access Control List, Extended ACL),可能会遇到两者之间存在冲突的情况。为了有效管理和解决这些潜在的冲突,理解两者的特性和工作原理至关重要。 #### 基本 ACL 和高级 ACL 特性对比 - **基本 ACL** 主要用于基于源 IP 地址过滤流量[^1]。 - **高级 ACL** 不仅可以依据源地址还可以根据目的地址、协议类型以及端口号等多种条件来精确控制数据流[^2]。 由于这两种类型的 ACL 可能会应用于同一接口的不同方向或者相同方向上的不同位置,因此有可能造成策略重叠或相互抵消的效果。 #### 解决冲突的原则 为了避免不必要的冲突并确保预期的安全策略得以实施: - 应该遵循从具体到一般的顺序部署规则,在更具体的条件下优先应用高级 ACL 来实现细粒度的访问控制;对于只需要简单区分内外网流量的情形,则可采用效率更高的基本 ACL 进行处理[^4]。 - 当在同一物理接口上同时设置了入站 (inbound) 和出站 (outbound) 方向的 ACL 时,需注意它们各自独立运作并不互相影响。但是考虑到性能因素,通常建议尽量减少双向都设置复杂 ACL 的情况。 - 如果确实发生了因先后次序引起的误判现象,可以通过调整各条目间的相对位置或是重新规划整个网络中的安全域划分方式加以修正。 ```python # 示例 Python 伪代码展示如何通过编程逻辑模拟上述原则的应用场景 def apply_acl_rules(acl_list): specific_rules = [] # 存储特定条件下的ACL规则 general_rules = [] # 存储一般性的ACL规则 for rule in acl_list: if is_specific(rule): # 判断是否为特定条件的规则 specific_rules.append(rule) else: # 默认视为通用型规则 general_rules.append(rule) execute(specific_rules + general_rules) # 按照先特殊后普遍的方式执行所有规则 ``` #### 实际操作指南 针对 Cisco 设备的具体命令如下所示: - 创建标准 ACL 并指定其编号范围为 `1` 至 `99` 或者 `1300` 至 `1999`[^3]: ```shell Router(config)#access-list <number> {permit|deny} source [source-wildcard-mask] ``` - 定义扩展 ACL 使用更高编号区间如 `100`~`199` 或者 `2000`~`2699`: ```shell Router(config)#access-list <extended_number> {permit|deny} protocol source [source-wildcard-mask] destination [destination-wildcard-mask] [operator port] ``` 最后记得将创建好的 ACL 关联至相应接口的方向上去生效它: ```shell Router(config-if)#ip access-group <acl_name_or_number> {in | out} ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值