网站地图    收藏   

主页 > 后端 > 网站安全 >

网络嵌入式同步技术的探讨与实现 - Windows操作系

来源:自学PHP网    时间:2015-04-17 18:33 作者: 阅读:

[导读] 邪恶八进制信息安全团队承蒙大家对本人关于网络化嵌入式系统文章的兴趣,本人决定再补加一篇较为技术性的文章。关于本章所涉及的硬件结构设计思路与所采用的硬件描述语言或许...

邪恶八进制信息安全团队
承蒙大家对本人关于网络化嵌入式系统文章的兴趣,本人决定再补加一篇较为技术性的文章。关于本章所涉及的硬件结构设计思路与所采用的硬件描述语言或许会对惯于软件编程的朋友们产生不同程度的困扰,因此别太执着于硬件的编程码,就当着是pseudo-code来看就好了。还有一点需要注意的是,硬件编程和软件编程的主要差别有两点:一,硬件编程的过程需要脑袋里构思着整个硬件结构而不是编程语句的精简;二,硬件编程是支援多路同步执行结构的,相对于软件编程里的单指针执行结构。好了,就从ethernet网包的时钟同步技术开始吧。
    为什么我们要研究时钟同步技术?答案很简单,是为了在非同步的通讯系统里恢复同步时钟域来捕捉数据流。同步技术的扩展可以作为很好的sniffer,band-detector,channel masking,spectrum blocking,和channel poisoning。关于以上的名词,对于熟悉通讯系统的人来说是最熟悉不过的了,对于不熟悉的人来说,可以试着google看看,网上的说明应该是很明确的了。
    在ethernet里,在10-Base-T的基础上,维持联线状态监控的是FLP。FLP就是简称的Link Pulse,每个Pulse宽度为100ns,而Pulse与Pulse之间的距离是62.5us。FLP的作用是ethernet的auto-negotiation,作为判断10-Base-T或100-Base-T的一种技术。这FLP与我们要谈的同步技术无关,就此略过。对于网包,我们一般称为packet或frame,但packet与frame何分别之有?答案是有,packet包括了7 bytes的preamble与1 byte的SFD;frame则是从MAC Address到CRC-32,preamble被省略了。8个bytes的preamble与SFD何用之有?就是我们要谈的同步技术!一般上,一组的非同步讯号接收需要先让本机时钟域先达成同步才能将数据完整的接收下来。一般的ethernet controller都内置了PLL或ADPLL通过之前提及的preamble,利用交替的0与1讯号来达成同步。然而利用这种方法的主要缺点是一部分的preamble将被利用为training bit,它是完全被丢失来达成时钟同步的!不同的PLL需要不同最低长度的training bit来达成同步状态,而7 bytes的preamble就是最大所容许的training bit。这种同步方式对于我们要完全控制ethernet数据流与将自定的处理方式实现于FPGA系统里是不太适合的,除了以上所提及的因素,其中主要原因是FPGA是完全的数字系统,而PLL则是模拟系统,而如果利用PLL的方式来实现全数字PLL的话,preamble的丢失量与synchronization time都是不容许的。因此,采用oversampling的方式相对来说是较为合适的。如果采用4倍频的oversampling,我们能在每个变化沿后0.25的UI下达成时钟同步,而同步之后的数据将是完整的,毫无丢失的。而这四倍频的技术,也可以用相位差来实现,因此,如果采用0,90,180,270度的同频时钟来形成相位差,很明显,一个同频时钟就可以达成时钟同步的效果,在这种情况下,主时钟的频率将被降为最低,而性能与效果将可以完全得以提升。
    在10-Base-T ethernet里,我们如何在FPGA里应用7 bytes preamble与1 byte SFD的条件下让时钟达成同步?就让我们看看以下部分的verilog源码,我们将采用5倍频的采样时钟:

input clk48, manchester_in;
//define 48MHz sampling clock and Manchester data as input
output TxD;
//define the data output (not being used here)

reg [2:0] in_data;
//define for 3-bit register
always @(posedge clk48) in_data <= {in_data[1:0], manchester_in};
//3-bit incoming data buffering
reg [1:0] cnt;
//define a 2-bit counter
always @(posedge clk48) if(|cnt || (in_data[2] ^ in_data[1])) cnt<=cnt+1;
//edge detection
reg [7:0] data;
reg new_bit_avail;
always @(posedge clk48) new_bit_avail <= (cnt==3);
//when the counter reach 3, then the sampling clock is within data eye
always @(posedge clk48) if(cnt==3) data<={in_data[1],data[7:1]};
//latch the data and put it into the buffer
reg end_of_Ethernet_frame;
reg [4:0] sync1;
always @(posedge clk48)
if(end_of_Ethernet_frame)
sync1<=0;
else
if(new_bit_avail)
begin
if(!(data==8h55 || data==8hAA))
  sync1 <= 0;
else
if(~&sync1)
//trigger a non-stop counter if preamble is detected
  sync1 <= sync1 + 1;
end

reg [9:0] sync2;
always @(posedge clk48)
if(end_of_Ethernet_frame)
sync2 <= 0;
else
if(new_bit_avail)
begin
if(|sync2)
  sync2 <= sync2 + 1;
else
if(&sync1 && data==8hD5)
//trigger a non-stop counter if SFD is detected
  sync2 <= sync2 + 1;
end

wire new_byte_available = new_bit_avail && (sync2[2:0]==3h0) && (sync2[9:3]!=0);
//data byte counting

很明显,同步过后每8个bit的数据将触发new_byte_available以让它存于buffer里来做自定意的相关处理。如果有关数据的处理模式为sniffer,一个硬件式的网络嗅听器就完成了,就随你怎样玩,不用担心切换不成promicious mode,捕捉不了包。如果加个filter module与一个IDE controller进去,再联上一个hard disk,就可以玩网络监视了。如果写个exploit进去,这就是硬件式的黑客机,听也没有听过吧,往后就凭你的想象力去加入无数的“如果” 进去。
    好了,就写到这里为止,希望这篇文章能正确地引导黑客们进入嵌入式系统安全这个全新的领域,好好思考这方面的问题。

cawan

 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论