怎么测试鼠标丢不丢帧帧一类的情况怎么处理

发表了一篇文章
CAN协议和标准规范
发表了一篇文章
4.CAN协议的基本概念
CAN协议包括OSI参考模型的传输层、数据链路层、物理层。图5显示了CAN协议每个层的定义。
数据链路层划分为MAC(Medium Access Control媒体存取控制)和LLC(Logical Link Control罗辑链路控制)。MAC子层组成CAN协议的核心。数据链路层的功能是将从物理层接收到的信号组织成有意义的信息,提供如传输错误控制等数据传输控制流程。更具体来说,包括:信息如何封装成一帧,数据冲突仲裁、应答、错误的检测或通知。数据链路层的这些功能通常由CAN控制器硬件来实现。
物理层定义信号的实际传输方式、位的时序、位的编码、同步的过程步骤,然而,CAN协议并没有定义了信号电平、通讯速度、采样点值、驱动器和总线电气特征、连接器形式。对每个系统,这些特征由用户自行确定。
在BOSCH公司的CAN协议中,并没有关于收发器和总线的电气特征的定义,而在ISO CAN协议中,如ISO11898和ISO11519-2却对此有明确的定义。
1.CAN总线是什么?
发表了一篇文章
2.2 数据帧
数据帧由发送单元使用,用来发送信息给接收单元,这是用户操作的基本帧。
数据帧有7个域组成。图15显示了数据帧的结构。
(1)帧开始(SOF):这个域表示数据帧的开始。
(2)仲裁域:这个域表示一个帧的优先级
(3)控制域:这个域表示保留位和数据字节数
(4)数据域:这是数据内容,0-8个字节的数据能被发送
(5)CRC域:这个域用于检查帧的传输错误。
(6)ACK域:是对帧已经被正常接收的一个证实。
(7)帧结束:指示数据帧结束
(1)帧开始(SOF),对标准的或扩展的格式都是一样的。它指示一帧的开始,由1bit的显性位组成。
显性电平和隐性电平:
总线上的电平有显性电平和隐性电平两种。
总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。
“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平,并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)
(2)仲裁域,这个域表示数据的优先级别。这个域的结构,对标准和扩展的格式是有差别的。
注1:关于ID:
标准格式的ID有11bit,从ID28到ID18被依次发送,禁止高7位全为隐性。(禁止设定:ID=1111111xxxx)。这样总共有(2048-16)个ID能被使用。
扩展格式的ID有29个bit。基本ID从ID28到ID18,扩展ID由ID17到ID0表示,基本ID和标准格式ID相同,禁止高7bit全都为隐性,(禁止设定:基本ID=1111111xxxx)。这样总共有(2048-16)个ID能被使用。
在任何情况下,总线上不可能有多个设备在同一时刻使用同一个ID传输数据帧。
(3)控制域,占6个bit,指示要传输信息的数据字节数,这个域的结构,对标准和扩展的格式是有差别的。如图18所示
注1:保留位(r0,r1),保留位必须以显性电平传送,然而,在接收侧可以接收显性、隐性集任意组合的电平。
注2:数据长度码(DLC),数据长度码与数据的字节对应关系见表7所示。数据的字节数必须是0-8个字节,但接收方对DLC=9-15的情况并不视为错误。
(4)数据域,对标准的或扩展的格式都是一样的。这个域是传输的数据,可以是0到8个字节,字节数载控制域中指明。数据输出开始于MSB。如图19所示:
(5)CRC域,对标准的或扩展的格式都是一样的。这个域用来检查帧是否有传输错误,它由15bit CRC码和一个bitCRC定界符(delimiter)(separating bit分隔bit)
CRC的产生方法是采用下面的多项式:,CRC的计算范围是SOF、仲裁域、控制域、数据域。在接收侧,会对接收到的数据帧的这些域进行CRC计算,如果计算结果与收到的CRC不一致,则表明存在传输错误。
(6)ACK域,是对一帧已被正常接收的一个确认信号,由2个bit组成,一个是ACK的slot,一个是ACK的定界符(delimiter),如图21所示:
注1:发送单元的ACK域,发送单元以隐性bit发送ACK slot和ACK 的delimiter。
注2:接收单元的ACK域,正确接收到信息的接收单元在接收帧的ACK slot里发送一个显性bit,以通知发送单元其已经正确接收完毕,这又称“sending ACK”或“returning ACK”。
“Returning an ACK”:
所有接收单元只要不是处于bus-off或休眠状态,只有正确接收信息的单元才能发送ACK。发送单元并不发送ACK。如果总线上除了发送单元,没有其它单元能接收信息,则No ACK被返回。为了通讯的建立,除了发送单元外,至少需要有一个单元能够接收信息。如果总线上有2个或更多个单元能接收到信息,如果它们中任意一个正常接收到信息,则会有ACK被返回。
(7)帧结束,指示一帧结束,由7个隐性位组成。如图22
1.3 遥控帧
遥控帧是接收单元请求发送单元发送一个信息,遥控帧有6个域组成。如图23显示的那样,除了没有数据域外其它与数据帧的结构是一样的。
(1) 帧开始(SOF):这个域表示数据帧的开始。
(2) 竞争域:这个域表示数据的优先级,具有同样ID的数据帧被请求。
(3) 控制域:这个域表示保留位和数据字节数
(4) CRC域:这个域用于检查帧的传输错误。
(5) ACK域:是对帧已经被正常接收的一个证实。
(6) 帧结束:指示遥控帧的结束
遥控帧和数据帧:
数据帧和遥控帧之间的不同
遥控帧没有数据域,在仲裁域里的RTR位是隐性电平,而数据帧RTR则为显性的。
没有数据的数据帧与遥控帧可以通过RTR为来区分
遥控帧没有数据域,其数据长度码用来干什么?
遥控帧的数据长度码的值表示对应请求的数据帧的数据长度码。
没有数据域的数据帧用来干什么?
例如,数据帧可以被各单元用来作为周期连接确认/应答,或者仲裁域本身带有实质性信息。
1.4 错误帧
这个帧用来通知在传输期间发生了一个错误,错误帧由一个错误标志和一个错误定界符组成,错误帧由CAN的硬件来发送。图24显示了错误帧的结构。
(1) 错误标志:有2种错误标志类型:主动错误和被动错误标志
a)主动错误标志:6个显性位
b) 被动错误标志:6个隐性位
(2) 错误定界符:由8个隐性位组成。
注1:错误标志重叠:取决于连接到总线上的各单元检测出错误的时间,错误标志可能一个重叠在另一个上,总共可达12bit长度。
注2:主动错误标志:处于主动错误状态的单元检测出错误时输出的错误标志。
注3:被动错误标志:处于被动错误状态的单元检测出错误时输出的错误标志。
1.5 过载帧
这个帧被接收单元用来通知还没有准备好接收帧。它由一个过载标志和一个过载定界符组成。图25显示了错误帧的结构。
(1) 过载标志:由6个显性位组成,过载标志与错误帧的主动错误标志具有相同的结构。
(2) 过载定界符:由8个隐性位组成,过载定界符与错误帧的错误定界符具有相同的结构。
注1:错误标志重叠:向错误标志一样,取决于时间,过载标志可能一个重叠在另一个上,总共可达12bit长度。
1.6 帧间间隔
这个帧用来隔开数据帧和遥控帧。数据和遥控帧可通过插入帧间间隔与前面传输的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间间隔。如图26所示。
(1)间隔:由3个隐性位组成。在间隔期间如果检测到显性电平,则必须发送过载帧,然而,如果间隔的第3bit是显性电平,间隔被认为是SOF
(2)总线空闲:是隐性电平,长度没有限制(它可以是0bit长)。当总线处于这种状态的时候,总线被认为是自由空闲的,任何单元都可以启动发送信息。
(3)暂停传输(传输暂停期):有8个隐性位组成。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
1.7 优先级的决定
在总线空闲状态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁域的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。丢失竞争的单元在下一bit进入接收操作。
仲裁的过程如图27所示。
(1)数据帧和遥控帧的优先级
具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
数据帧和遥控帧的仲裁过程如图28所示。
(2)标准格式和扩展格式的优先级
标准格式 ID 与具有相同ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位的具有优先权,可继续发送。
标准格式和扩展格式的仲裁过程如图29所示。
1.8 位填充
位填充是一种周期性重同步收/发操作的功能,为了防止接收节点间时序由于累积而导致的错误,如果5个bit持续了同样的电平,则添加1个bit的反向数据位。
如图30显示的位填充机制:
(1)发送单元的操作
在发送数据帧和遥控帧的时候,SOF-CRC段间的数据,相同电平如果持续5bit,在下一bit(第6bit)则要插入1bit与前5bit反向的电平。
(2)接收单元的操作
在接收数据帧和遥控帧的时候,SOF-CRC段间的数据,相同电平如果持续5bit,需要删除下一bit(第6bit)再接收。如果这第6bit的电平与前5bit相同,则被视为错误,且发送错误帧。
1.9 错误的种类
有5种类型的错误,可能有2个或更多的错误同时发生:
表8列出了这些错误的种类、内容、错误检测帧和检测单元。
位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出ACK的单元、输出错误的单元来检测。
在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
发送单元在ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的ACK 应答,而非位错误。
输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同6 个位的值(显性或隐性),并不视为位错误。
(2) 格式错误
即使接收单元检测出EOF(7 个位的隐性位)的最后一位(第8 个位)为显性电平,也不视为格式错误。
即使接收单元检测出数据长度码(DLC)中9~15 的值时,也不视为格式错误。
1.10 错误帧的输出时序
检测到发生错误的单元输出一个错误标志,以通知其它单元。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧之后,将再次发送数据帧或遥控帧。
错误标志输出时序如表9:
1.11 位时序
在没有重新同步情况下,发送单元每秒传输的位数称之为位速率。1位由下面4个段组成。
同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
这些段又由称之为Time Quantum(以下称为Tq)的最小时间单位构成。
1位分为4个段,每个段由若干个Tq构成,这称为位时序。
1位由多少个Tq构成、每个段由多少个Tq构成等是可以设定的。通过设置bit时序。使得可以设定一个采样点以使总线上多个单元可同时采样,所谓采样点就是在这一时刻总线上的电平被锁存,这个锁存的电平作为位的值。采样点的位置在PBS1的结束处。
表10描述了各段的作用和Tq 数。1个位的构成如图31所示。
同步段(SS)
多个连接在总线上的单元通过此段实现时序的定时调整,以便同步进行接收和发送的工作。
隐性电平到显性电平或显性电平到隐性电平变化的边沿被期望出现在本段。
传播时间段(PTS)
用于吸收网络上的物理延迟的段。包括发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。
这个段的时间是以上延迟时间累加和的两倍。
相位缓冲段1(PBS1)
当信号边沿不能出现在SS 段时,此段用来矫正误差。
由于各单元以各自独立的时钟来工作,细微的时钟误差都会累积起来,PBS 段可用于吸收此误差。
为了吸收一个时钟误差,在SJW设置的范围内增减PBS1和PBS2,PBS1和PBS2越大,允许误差越大,但是通讯速度会降低。
相位缓冲段2(PBS2)
PBS1或IPT中较大者(见注1和2)
重新同步跳转宽度(SJW)
因时钟频率偏差、传送延迟等原因,某些单元可能会失去同步。SJW是所能校正的最大失去同步的宽度。
注1:IPT代表信息处理时间,是以采样点作为起始的时间段,用于计算后续位的位电平。这是硬件在一个采样点后立刻改变位的电平所必须要的。这个时间等于或小于2Tq,。
注2:因为采样点是处于PBS1结束处,所以IPT和PBS2重叠。当IPT = 2Tq时,PBS2不可能选为1,因此,PBS2必须是2到8Tq。
注3:重新同步的结果使相位缓冲段1增长,或使相位缓冲段2 缩短。相位缓冲段加长或缩短的数量有一个上限,此上限由SJW(重新同步跳转宽度)给定。重新同步跳转宽度应设置于1和最小值之间(此最小值为4*PBS1)。
可以从一位值转换到另一位值的过渡过程得到时钟信息。这里有一个属性,即:只有后续位的一固定最大数值才具有相同的数值。这个属性使总线单元在帧期间重新同步于位流成为可能。可用于重新同步的两个过渡过程之间的最大的长度为29个位时间。
1.12 同步是如何获得的?
CAN总线的通讯是采用NRZ(Non-Return to Zero,非归0)码,数据本身并不携带时钟信息,也即在每一位的开始或结束没有同步信号,发送单元以位时序同步的方式开始发送帧数据,接收单元根据总线电平的变化进行同步并进行接收工作。
然而,发送器和接收器之间由于彼此的时钟误差或传输路径的相位误差可能会失去同步关系,因此接收单元在接收帧的时候,必须通过硬件同步或重新同步调整它的操作时序。
1.13 硬件同步
在总线空闲状态时,接收单元检测到SOF,就会执行这个同步调整过程。“隐式”电平跳变到“显式”电平的边缘的时间点被认为是SS,而不管SJW的值
图32显示了硬件同步机制。
如果沿出现在SS里,沿的相位误差e=0;
如果沿位于采集点(PBS1结束之前)之前,e&0;
如果沿位于采集点之后,e&0;
1.14 重新同步机制
在接收过程中检测到总线电平发生了改变时执行重新同步操作。
每当检测到一个边沿(总线电平的改变),收发单元根据SJW值通过增加PBS1段或减少PBS2段,来调整同步。但,如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。
图33显示了重新同步机制。
1.15 调整同步的规则
硬件同步和再同步的执行遵从如下规则:
1) 在1个位时间里(或者说在2个采样点之间),只允许一个同步(或者说只进行一次同步调整)。
2) 只有当采样点之前的总线电平和边沿后的总线电平不同时,该边沿才能用于调整同步。
3) 如果出现隐性电平到显性电平变化的边沿,且条件(1)和(2)满足,将进行同步。
4) 如果在帧间间隙期间发生隐性电平到显性电平的信号边沿(除了间隙里的第一位),则总会执行硬件同步。
5) 如果发生从所有其它隐性电平到显性电平的信号边沿,则执行再同步。
6) 如果发送单元自身输出的显性电平被检测到有延迟,则不执行再同步。
1.CAN协议
发表了一篇文章
CAN总线简介
发表了一篇文章
并非原创,纯属转载!!O(∩_∩)O~天缘的作品,很是佩服这个哥们啊.....
一、WINPE制作准备1、操作系统必须是Windows 08 R2/Vista/Windows 7中的一种,其中Windows 2003和Windows 2008必须至少打上SP1,另外如果要跨体系部署,则仅支持32位WINPE对x64(AMD64)的Windows版本进行跨体系部署,不支持从64位WINPE部署32位映像,也不支持跨平台部署基于Itanium的Windows映像。2、下载并安装AIK(Windows Automated Installation Kit,Windows自动安装工具包),AIK简体中文版下载:,(大小1.72G)AIK安装界面如下图:
图中安装的是AIK工具包目录结构,此外还有Windows OEM预安装工具包(OPK) ,上图目录2中amd64、ia64、x86下包含的是ImageX源文件,PETools目录下包含Window PE源文件。Servicing目录包含支持源文件及可选组件。3、准备需要集成的驱动包(比如最新的ICH、RAID等等)、软件包(比如刻录工具、分区工具等)。4、当然如果你还需要刻录成WINPE光盘的话,还需要CD或DVD刻录机。5、接下来我们就可以开始制作自己的WINPE 3.0了,敬请关注天缘稍后的WINPE专题文章,一步一图,老少皆宜。
一、启动部署工具命令提示在AIK安装完成后,我们可以在屏幕右下角的开始菜单中找到部署工具命令提示,至于这些工具的更多用途及下文的个别命令用法,大家可以参考AIK的Windows PE用户手册,限于篇幅,天缘只捡最必要的说一下。启动部署工具命令提示,只需要在下图位置鼠标右键,选择以管理员身份运行即可,弹出安全警告并确认即可。
部署工具命令启动界面如下图:
二、自己制作纯净版WINPE 3.0制作说明:天缘系统Windows 7简体中文旗舰版,Winpe制作环境目标放在D:\mywinpe下面,请注意该目录mywinpe不需要自己创建,下面命令执行会自动创建,制作WINPE版本x86,制作结果ISO格式(可以刻录到光盘也可以写到U盘上)。1、构建PE环境命令:copype.cmd x86 D:\mywinpe命令只需要在上面的执行界面中输入即可,特别注意符号一定要正确,比如反斜杠、分隔符等等,如果您的设置路径跟天缘相同可以直接拷贝本文设置命令,下同不再赘述。执行结果,如下图:
这时候检查D盘会有个mywinpe目录,目录结构如下图:
ISO目录主要包含使用Oscdimg工具构建.iso文件所必须文件,但未包含boot.wim文件。mount目录是用来装载WINPE映像,从前面的文章构建结构图可以看出,装载的用途主要是为了添加、修改或定制WINPE映像。如果新手对这两句话不明白可以先向后进行,回头再看。2、将基本映像Winpe.wim复制到ISO的sources目录下命令:copy D:\mywinpe\winpe.wim D:\mywinpe\ISO\sources\boot.wim执行效果图:
执行完该命令后D盘的mywinpe\ISO\sources下会个boot.wim映像文件,这个文件就是我们加载修改的主要对象。当然了如果你什么都不需要,也可以直接跳过下面的加载修改步骤,直接进行ISO制作,不过为了先做个铺垫,天缘还是先修改两三个简单的地方,然后再制作WINPE ISO。3、加载映像命令:Dism /Mount-Wim /Wimfile:\mywinpe\ISO\sources\boot.wim /index:1 /MountDir:\mywinpe\mount该命令里有个注意的地方就是/index:1,该参数意思是加载winpe映像中的第几个索引,对于多版本映像请注意选择正确,可以通过下面的命令获取VIM文件的相关信息:命令(参考用,可跳过):dism /get-wiminfo /wimfile:\mywinpe\iso\sources\boot.wim执行后如下图:
从上图可以看出天缘的映像只有一个索引,再看一下详细情况:命令(参考用,可跳过):dism /get-wiminfo /wimfile:\mywinpe\iso\sources\boot.wim /index:1执行后如下图,可以看出该映像的具体信息,比如内部版本号、语言版本等。
好了再回到刚才的加载命令,执行后如下图:
加载完成后,可以看到mount目录下已经有了这些“解压”文件,如下图:
4、修改映像这里先为了简单,先只修改简单的桌面图片和为WINPE指派可写内存。A、要修改WINPE背景图片不需要执行命令,只需要创建一个BMP格式的文件,并命名为winpe.bmp,然后拷贝到上文的mount目录下Windows\System32目录下,并覆盖原winpe.bmp文件,原文件是大小,灰度图片,当然如果图片太高清,会映像加载和兼容效果。天缘就把WIN7自带的桌面图片拷一个过来覆盖原文件就当是测试了。B、修改暂存空间命令:dism /image:\mywinpe\mount /Set-ScratchSpace:128该命令最后的128是代表128M的意思,默认WINPE只会分配32M暂存内存,当然有点小,如果你制作好的WINPE太“花哨”,或必须加载的驱动过多,32M内存几乎可以肯定不够使用,那么就用上述语句进行修改(修改128为32、64、128、256、512其中的某个值),太大也会带来制作WINPE的兼容问题。执行结果如下图:
[ 此帖被wxdp在 08:39重新编辑 ]
5、提交保存映像修改命令:Dism /unmount-Wim /MountDir:\mywinpe\mount /Commit这条命令执行,要等一会儿,执行结果如下图:执行完后,mount目录会被自动清空,相当于又“压缩”回去。三、生成ISO映像根据windows PE用户指南介绍,如果是制作U盘版的WINPE,也提供的专门的制作方法,不过天缘本文不再介绍,后续再看情况补充该制作方法,本文先从制作ISO然后刻录入手,因为大家对ISO最为熟悉,制作完ISO文件后,我们可以把ISO刻录到光盘,也可以刻录到U盘上去,一样可以使用。生成ISO映像命令:Oscdimg -n -m -o -bd:\ -t2/22/:33 d:\mywinpe\iso d:\mywinpe\mywinpe.iso上面的生成语句是从iso目录创建的,当然也可以从mount目录创建iso,不过如果从mount目录创建,还需要再拷贝一些必须的启动文件放到mount目录才可以,并且创建在dism提交修改之前完成,否则一旦提交映像修改mount目录又会被清空。另外也要注意输入命令的写法,不要出错,天缘在上面这条命令上折腾了好久,就因为中间少了个分隔号,总是提示下面的错误:------------------------------------------------------------------------------C:\SoftWindows AIK\Tools\PETools&Oscdimg -n bd:\ -t2/22/:33 d:\mywinpe\iso d:\mywinpe\mywinpe.isoOSCDIMG 2.55 CD-ROM and DVD-ROM Premastering UtilityCopyright (C) Microsoft, . All rights reserved.Licensed only for producing Microsoft authorized content.ERROR: Could not delete existing file "d:\mywinpe\iso"Error 5: Access is denied.-------------------------要修改成-n -b----------------------------正确执行结果,如下图:上述命令执行完毕,我们就可以在mywinpe目录下发现mywinpe.iso这个文件,这个文件大小大概180M,当然是未经过优化的,后续我们会讨论优化及深入定制问题。四、测试验证WINPE特别说一下,如果需要刻录光盘,最好在做好光盘映像后采用虚拟机验证确认一下,U盘到没关系,可以直接使用UltraISO进行硬盘写入即可,天缘实际在微软虚拟机Virtual PC(微软虚拟机下载请参考:虚拟机软件Virtual PC(Windows 7专版/))和金士顿U盘上全部测试OK(如何刻录到U盘请参考:如何使用UltraISO和Nero刻录可引导光盘镜像,金士顿U盘天缘测试选的是HDD+写入方式,一次测试通过),虚拟机抓图如下:从上图可以看出,这个WINPE 3.0有点太干净清爽了,呵呵,但的确是我们自己制作的WINPE映像,默认的WINPE映像也的确是命令行模式的,而且原生的WINPE还有很多使用或功能上不足,距离大部分人的日常维护使用习惯还有一定的距离。一、为WINPE 3.0增加桌面环境和常用软件1、通过copype和dism命令来制作的WINPE,默认是只有命令行模式的,所以要增加桌面环境还真的不是件简单的事情,这里有两个思路:A、把WINDOWS 7的默认explorer移到WINPE环境中,由于时间关系,天缘只是粗略测试了一下,大概要增加26M左右的系统文件,包括动态链接库配置文件等等,目前还有问题暂不介绍。B、使用第三方的兼容explorer,比如老外开发的BsExplorer (实际是1.7版本也有说是2.0版本,反正在WINPE 3.0上可用),点击本站下载,本文先以这个软件为例讲解,稍后关于Windows 7自带explorer及WINRE环境制作WINPE等问题,我会再发文章。2、将BsExplorer下载后,解压到D:\mywinpe\mount目录下(前接上篇文章的第三步),解压完成后如下图:其中Tools目录结构如下图,天缘只是示例放加入Diskgenius、Ghost和WinRar软件包,资源管理器可以使用A43,只需要解压到这里即可,要保证双击可运行。DiskGenius下载及使用注意事项备份和恢复分区必备工具Ghost v11.0WinRAR V3.9官方简、繁体中文(x86/x64)下载二、配置BsExplorer启动环境上面已经把桌面环境和软件包拷贝到Tools目录,采用本文的集成方式,这些软件都要使用绿色版本的(这些小软件基本都有绿色版本)。配置BsExplorer环境也很简单,只需要配置BsExplorer目录下几个ini格式文件即可,该目录结构如下图:下面说一下上图中几个需要配置的文件:bs_desktop.ini、bs_qlaunch.ini、bs_shell.ini和bs_start.ini文件,如果你的目录结构跟天缘相同,bs_shell也不用管,只需要配其它三个即可(桌面、快速启动栏和开始菜单)。1、bs_desktop.ini文件bs_desktop.ini是用来配置桌面图标显示,下面示例增加ghost图标到桌面左上角,其它图标只需要按照顺序向下增加即可。&-ItemBegin-&
Caption=Ghost
ExeName=%SystemDrive%Tools\Ghost\ghost32.exe
IconName=%SystemDrive%Tools\Ghost\ghost32.exe
IconNumber=0
ExeDir=%SystemDrive%Tools\Ghost
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
Caption=WinRaR
ExeName=%SystemDrive%Tools\WinRaR\WinRaR.exe
IconName=%SystemDrive%Tools\WinRaR\WinRaR.exe
IconNumber=0
ExeDir=%SystemDrive%Tools\WinRaR
ShowState=NORMAL&-ItemEnd-&这些格式都是原作者的一个约定(下同),大家只需知道如何使用即可,其中ItemX和ItemY是图标排列坐标,以80为单位,比如第一个是ItemX=20,ItemY=20,下一个就是ItemX=20,ItemY=100,再下一个就是ItemX=20,ItemY=180,这样就是垂直排列,大家测试一下即可看到效果。另外我们只需要设置Caption(提示信息,相当于快捷方式名)、ExeName(对应的可执行文件名)、IconName(图标名)、ExeDir(该程序的默认目录),其中IconNumber是如果使用系统图标时的编号(从0开始计数,只有未设置IconName时,IconNumber才有效,如果要使用系统图标,请打开上图中的bs_menuimg.bmp文件,然后查看你要的图标在第多少位置,然后填写该值到IcunNumber即可)。2、bs_qlaunch.ini文件bs_qlaunch.ini文件是用来配置快速启动栏图标,示例配置如下:&-ItemBegin-&
Caption=Show desktop
ExeName=@ShowDesktop
IconNumber=20&-ItemEnd-&&-ItemBegin-&
Caption=GHOST
ExeName=%SystemDrive%Tools\Ghost\ghost32.exe
IconName=%SystemDrive%Tools\Ghost\ghost32.exe
IconNumber=0
ExeDir=%SystemDrive%Tools\Ghost
ShowState=NORMAL&-ItemEnd-&3、bs_shell.ini文件bs_shell.ini文件好像也只explorer的执行脚本。从里头的字面意思主要涉及登录设置和桌面设置等,比如颜色,显示提示文件等,一般不用改写。(如果你的目录配置跟天缘不同,这里也需要替换Tools字符串成自己的目录名)4、bs_start.ini文件bs_start.ini文件是用来配置开始菜单显示,顺序是从上到下,显示也是从上到下,天缘把最常用的几个设置都给列出来。&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=程序
MenuId=Programs&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Programs
Caption=Diskgenius
ExeName=%SystemDrive%Tools\DiskGenius\DiskGenius.exe
IconName=%SystemDrive%Tools\DiskGenius\DiskGenius.exe
ExeDir=%SystemDrive%Tools\DiskGenius
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Programs
Caption=注册表编辑器
ExeName=%windir%regedit.exe
IconNumber=116
ExeDir=%windir%
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Programs
Caption=记事本
ExeName=%windir%system32\notepad.exe
IconName=%windir%system32\notepad.exe
ExeDir=%windir%system32
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Programs
Caption=计算器
ExeName=%windir%system32\calc.exe
IconName=%windir%system32\calc.exe
ExeDir=%windir%system32
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Programs
Caption=画图
ExeName=%windir%system32\mspaint.exe
IconName=%windir%system32\mspaint.exe
ExeDir=%windir%system32
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=设置
MenuId=Setting&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Setting
Caption=屏幕显示与分辨率
MenuId=Resolution&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=Resolution
Caption=Color 8bit
MenuId=Res8&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=-&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=任务管理器
ExeName=%SystemDrive%windows\system32\taskmgr.exe
IconName=%SystemDrive%windows\system32\taskmgr.exe
ExeDir=%SystemDrive%windows\system32
ShowState=NORMAL&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=命令行
MenuId=CMD line
ExeName=@CMDline
IconNumber=136&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=运行...
MenuId=Run...
ExeName=@Run
IconNumber=137&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=-&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=YES
EnableInAutorun=YES
ParentItem=root
Caption=注销
MenuId=Exit
ExeName=@Exit
IconNumber=139&-ItemEnd-&&-ItemBegin-&
ShowInAutorun=NO
EnableInAutorun=NO
ParentItem=root
Caption=关闭计算机...
MenuId=Shitdown
ExeName=@Shutdown
IconNumber=138&-ItemEnd-&特别说明:上述配置文件里有Tools目录标示,所以如果你的工具目录(mount下刚刚拷贝过去的那个)跟天缘设置的不同,那么需要把这五个文件里头的Tools替换成你自己的目录,目的就是让explorer等找到你的工具。三、启动挂接及其它设置1、winpeshl.ini手动创建一个winpeshl.ini文件,内容为:[LaunchApp]AppPath=%systemdrive%\Tools\BsExplorer\Explorer.exe然后拷贝到mount\windows\system32下面即可,制作好的WINPE会自动到这个目录下找winpeshl.ini文件,并运行Explorer.exe。2、修改WINPE桌面如需修改桌面图片,只需要创建一个的bmp文件并命名为winpe.bmp然后也拷贝到mount\windows\system32下面并覆盖原图片即可。设置语句如下:Dism /image:\mywinpe\mount /Set-ScratchSpace:5123、设置WINPE可写内存然后我们还有一个设置那就是修改winpe的可写内存,如果只是自己用,最好把内存加大一点,比如128、256或512M,可写内存太小启动时会非常慢,甚至还有可能出现runtime error 203、内存不可写甚至是自动重启等现象。四、完成设置提交修改这样我们就可以使用Dism命令提交修改(转到上篇文章的第五步),制作好自己的ISO文件(未经过精简的原生WINPE 3.0大概200M),即可开始测试,如果你的机子内存太小,比如天缘的台式机才1G内存,在运行WIN7时又使用虚拟机测试,只要加载软件几乎都很难测试通过,虽然Windows 7默认的Winpe 3.0是32M,而如果要软件运行的流畅至少要增加到128M或以上,如果你也遇到虚拟机测试不过时,可以考虑使用UltraISO刻录到U盘上进行测试。WINPE 3.0的启动跟早前WINPE 2.0相比还是有点慢,后续还需进行一些模块删减或优化。下图是个虚拟机上抓图(前天的老图),下次再换个新的带桌面图标的上来。五、制作出错无法再次加载的解决方法如果你在加载或制作过程中发生错误,可能再次无法再次加载可以通过如下方式解决:1、重启机子,删除原目标目录,比如 D:\mywinpe,整个删除,前提你的制作文件都应该放在另外的地方,比如天缘都是放到D:\WINPE_MAKETools下。2、 然后再次运行cmd时,先使用dism /cleanup-wim命令清理一次过时文件日志即可,如下图:
发表了一篇文章
高速数据采集系统可对相机采集得到的实时图像进行传输、实时处理,同
发表了一篇文章
发表了一篇文章
//获取分辨率
int m_nWindwMetricsX
::GetSystemMetrics(SM_CXSCREEN);
int m_nWindwMetricsY
::GetSystemMetrics(SM_CYSCREEN);
//修改分辨率
DEVMODE lpDevMlpDevMode.dmBitsPerPel=32;lpDevMode.dmPelsWidth=1024;lpDevMode.dmPelsHeight=768;lpDevMode.dmSize=sizeof(lpDevMode);lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;LONGresult=ChangeDisplaySettings(&lpDevMode,0);if (result==DISP_CHANGE_SUCCESSFUL){
AfxMessageBox(L"修改成功!");
ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);//
  //使用CDS_UPDATEREGISTRY表示次修改是持久的,//
  //并在注册表中写入了相关的数据}else{
AfxMessageBox(L"修改失败,恢复原有设置!");
ChangeDisplaySettings(NULL,0);}
发表了一篇文章
发表了一篇文章
发表了一篇文章
发表了一篇文章
每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是可以通过 随机带的检测程序解决方法:在命令行窗口中输入 /F X: (X:是每次开机都自动检查的) /F 可以恢复文件系统错误, 并可以试图恢复坏扇区,如果无法修复就标记坏扇区,以避免文件被误写入导致丢失如 /F提示已修复或无问题,开机仍然自动检查磁盘的情况:输入
/X E: (每次启动时不自动检查E: )如有多个卷的话这样输入
/X D: E: F: (对FAT32格式分区同样有效)最近有好多同事问开机取消磁盘检查方法,而且都强调是正常关机,但是每次开机时会自动询问是否扫描磁盘。遇到这种问题,可以按照以下步骤进行处理:(1) 运行Fsutil dirty query DriveLetter命令,检查该磁盘是否设置了Dirty 。如果是的话,可能是本身的问题,请联系厂商或者计算机经销商进行检测。如果需要防止系统自动检测标记Dirty 的卷,可以运行以下命令进行排除: /x DriveLetter(2) 检查任务计划、启动项里有没有相应的加载项,有的话删除即可。(3) 打开注册表编辑器,进入以下注册表项:HKEY_LOCAL_MACHINE\\CURRENTSET\\Session Manager检查其下的多字符串键值BootExecute,是否为类似以下的数值数据:autocheck autochk /r \??\D:如果是的话,删除其中/r \??\D:即可。如何取消开机磁盘检测
如试一下:    1.选择“开始→运行”,在运行对话框中键入“chkntfs /t:0”,即可将磁盘扫描等待时间设置为0;如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs /x c:”命令;如果要恢复对C盘的扫描,可使用“chkntfs /d c:”命令,即可还原所有chkntfs默认设置,除了自动文件检查的倒计时之外。   2、单击“开始→运行”,在“运行”对话框中输入“regedit”打开注册表编辑器,依次选择“HKEY_LOCAL_MACHINE\\CurrentSet\Control\Session Manager”子键,然后在右侧窗口中找到“BootExecute”键值项并将其数值清空,最后按“F5”键刷新注册表即可。(此法可取消开机时系统对所有磁盘的扫描) 注:C:\\&chkntfs/? 在启动时显示或修改磁盘检查。 CHKNTFS volume [...] CHKNTFS /D CHKNTFS /T[:time]\\r\\nCHKNTFS /X volume [...] CHKNTFS /C volume [...] volume: 指定驱动器(后面跟一个冒号)、装入点或卷名。 /D 将计算机恢复成默认状态, 启动时检查所有驱动器,并对有问题的驱动器执行 chkdsk 命令。 /T:time 将 AUTOCHK 初始递减计数时间改成指定的时间量,单位为秒数。如果没有指定时间,则显示当前设置。 /X 排除启动时不作检查的驱动器。上次执行此命令排除的驱动器此时无效。 /C 安排启动时检查驱动器,如果驱动器有问题,运行 chkdsk。 如果没有指定命令选项,CHKNTFS 会显示每一驱动器有问题的位的状态。 从上面可以看出,输入:chkntfs /x c: 可以实现非法关机不扫描C盘。
每次开机都自动检查磁盘,检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况,即使重装系统,仍可能出现同样情况,但是
发表了一篇文章
setsockopt()用法
一下来源于互联网:
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:int nNetTimeout=1000;//1秒//发送时限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));//接收时限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:// 接收缓冲区int nRecvBuf=32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));//发送缓冲区int nSendBuf=32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));
8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));
9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?struct linger {u_short l_u_short l_};linger m_sLm_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;m_sLinger.l_linger=5;//(容许逗留的时间为5秒)setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
发表了一篇文章
运行结果:
首先简单介绍一下CAN总线,关于CAN总线是谁发
发表了一篇文章
nt send( SOCKET s, const char FAR *buf, int len, int flags );
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数…
发表了一篇文章
void can_init(void){
CAN_InitTypeDef
CAN_FilterInitTypeDef
CAN_FilterInitS
/* CAN register init */
CAN_DeInit();
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_N
//CAN_Mode_LoopBack
//CAN_Mode_Normal
CAN_InitStructure.CAN_SJW=CAN_SJW_1
CAN_InitStructure.CAN_BS1=CAN_BS1_5//1--16
CAN_InitStructure.CAN_BS2=CAN_BS2_2//1--8
CAN_InitStructure.CAN_Prescaler=2;
CAN_Init(&CAN_InitStructure);#ifdef can_id_filter
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdM//指定过滤器被设置为标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32//给出过滤器位宽为32位
CAN_FilterInitStructure.CAN_FilterIdHigh=slave_id&&5;//过滤器标识符
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0//过滤器屏蔽标识符
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//选择FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器
CAN_FilterInit(&CAN_FilterInitStructure);//进入初始化函数#else
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdM//指定过滤器被设置为标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32//给出过滤器位宽为32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//过滤器标识符
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//过滤器屏蔽标识符
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_ITConfig(CAN_IT_FMP0, ENABLE);//使能指定的can中断}
void CAN_DeInit(void){
/* Enable CAN reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, ENABLE);
/* Release CAN from reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN, DISABLE);}
2、发送程序
unsigned char CAN_PushMessage(CAN_MSG
*pTransmitBuf ){
u8 TransmitMailbox=0;
CanTxMsg TxM
if(pTransmitBuf -& LEN & 8)
/* transmit */
TxMessage.StdId=pTransmitBuf -&StdId;//用来设定标准标识符(0-0x7ff,11位)
TxMessage.ExtId=pTransmitBuf -&ExtId;
TxMessage.RTR=
pTransmitBuf -&RTR;//设置RTR位为数据帧
TxMessage.IDE=
pTransmitBuf -&IDE;//标识符扩展位,为标准帧
TxMessage.DLC=
pTransmitBuf -&LEN;//设置数据长度
//根据DLC字段的值,将有效数据拷贝到发送数据寄存器
memcpy(TxMessage.Data, pTransmitBuf -&BUF,pTransmitBuf -&LEN);
TransmitMailbox = CAN_Transmit(&TxMessage); // TxMessage.Data[1]=(data & 0xff00)&&8;
return 1;}
3、中断接收程序
void USB_LP_CAN_RX0_IRQHandler(void){
//清空can接收缓存
CanRxMsg RxM
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;//CAN过滤主控制寄存器
memset( &RxMessage.Data[0],0,8);
//can总线接收数据函数
CAN_Receive(CAN_FIFO0, &RxMessage);
//将接收到的数据写于modbus的寄存器1
//modbus_regester[1]=(RxMessage.Data[0]&&8)|(RxMessage.Data[1]); // if((RxMessage.StdId==slave_id) && (RxMessage.ExtId==0x00) && (RxMessage.IDE==CAN_ID_STD))
//将can接收标志位置1,表示从卡应经接收到一个can报文
flag_can_recv=0;
memcpy(can_rx_data,&RxMessage.Data,RxMessage.DLC);
flag_can_recv=1;
4、can总线的id过滤
对扩展数据帧过滤:
对标准数据帧过滤:
假如要对标准远程帧进行过滤,那么:
6、can总线的逻辑电平
can总线的物理连接有两根线:CANH和CANL,以差分的形式输出。
(有的时候有地线,作为屏蔽线使用)
can总线的高电平 3.5v,表示逻辑0
can总线的低电平 1.5v,表示逻辑1
7、CAN总线的波特率计算
can时钟是RCC_APB1PeriphClock,要注意CAN时钟频率 CAN波特率 = RCC_APB1PeriphClock/CAN_SJW CAN_BS1 CAN_BS2/CAN_P 如果CAN时钟为8M, CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 2 那么波特率就是=8M/(1 8 7)/2=250K
8、can总线的仲裁机制
根据仲裁来判断优先级:
(1) 若在同一时刻,标准格式的报文与扩展格式的报文同时抢占总线,且它们的基础ID相同,则发标准格式的报文节点就会PK成功。这是因为扩展格式在基本ID后,紧接着是SRR位,与IDE位,且这两位都是隐性位。而在标准格式中,这两位分别对应的位为RTR与r1,其中RTR既可以为隐性位,也可以为显性位,,但是r1必须为显性位。由仲裁规则可以此时标准帧必定胜出。
同理,如果在同一时刻,具有相同格式,且具有相同ID的数据帧与远程帧争夺总线控制权,那么数据帧必定胜出。因为RTR显性表示数据帧,隐性表示远程帧。
stm32的can总线的配置如下:
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;//CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_N
//CAN_Mode_LoopBack
//CAN_Mode_Normal
CAN_InitStructure.CAN_SJW=CAN_SJW_1
CAN_InitStructure.CAN_BS1=CAN_BS1_5//1--16
CAN_InitStructure.CAN_BS2=CAN_BS2_2//1--8
CAN_InitStructure.CAN_Prescaler=2;
CAN_Init(&CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=0;//选择过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdM//指定过滤器被设置为标识符屏蔽模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32//给出过滤器位宽为32位
下面根据设置的参数不同来决定can总线can总线的配置情况:
1、对扩展数据帧进行过滤:(只接收扩展数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&3)&0xFFFF0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
= 0xFFFF;(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)2、对扩展远程帧过滤:(只接收扩展远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&3)&0xFFFF0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
3、对标准远程帧过滤:(只接收标准远程帧)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&21)&0xffff0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&21)|CAN_ID_STD|CAN_RTR_REMOTE)&0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
= 0xFFFF;4、对标准数据帧过滤:(只接收标准数据帧)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&21)&0xffff0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&21)|CAN_ID_STD|CAN_RTR_DATA)&0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
5、对扩展帧进行过滤:(扩展帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&3)&0xFFFF0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&3)|CAN_ID_EXT)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
= 0xFFFC;6、对标准帧进行过滤:(标准帧不会被过滤掉)
CAN_FilterInitStructure.CAN_FilterIdHigh
= (((u32)slave_id&&21)&0xffff0000)&&16;
CAN_FilterInitStructure.CAN_FilterIdLow
= (((u32)slave_id&&21)|CAN_ID_STD)&0
CAN_FilterInitStructure.CAN_FilterMaskIdHigh
CAN_FilterInitStructure.CAN_FilterMaskIdLow
= 0xFFFC;注:slave_id为要过滤的id号。
1、CAN总线的初始化
发表了一篇文章
在Linux操作系统中,有一项特殊的功能——初始化内存盘INITRD
发表了一篇文章
Make Menuconfig简介
make menuconfig 图形化的内核配置make mrproper -----删除不必要的文件和目录. #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用) #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用) #make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦) 目的都是生成一个.config文件,这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 选择相应的配置时,有三种选择,它们分别代表的含义如下: Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
make modules_install INSTALL_MOD_PATH=/home/luther/gliethttp_dir应用安装指定
make install DESTDIR=/home/luther/gliethttp_dir
最近对linux内核进行了编译,并安装在了vmware上。linux内核:linu-2.6.29
操作系统:redhat 5
1.linux内核源码(如果没有,可以从www.kernel.ogr上下载)
2.将内核源码解压到工作目录(这个目录可以是任意的,但是路径不能带有空格)
tar jxf linux-2.6.29.tar.bz2
3.进入内核源码,使用命令(make distclean、make clean、make mrproper三个命令中的一个即可)
4.拷贝参考配置文件为内核目录下.config
cp /boot/config-2.6.18.53.e15 .config
5.配置内核
配置内核的方式有4种:
make config
make menuconfig
make xconfig
make oldconfig这四条命令的区别如下:make config是基于文本的最为传统的配置界面,即字符界面。比较适合在dos下使用。make menuconfig:基于文本选单的配置界面,比较适合在终端字符下使用。Make xconfig:基于图形窗口模式的配置界面,可以直接通过鼠标来选择。Make oldconfig:只是对一些新功能进行配置。
6.编译内核镜像:make bzImage(bzImage位于arch/x86/boot/目录下)
问题:make bzImage提示如下错误(这个错误不是每个人都会遇到的,可以用gcc--help查看你的gcc版本,如果你的版本是4.6或者4.6之后的应该会有下面的问题,如果比4.6的早就不会出现这个问题):gcc: 错误: elf_i386:没有那个文件或目录make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1make[1]: *** [arch/x86/vdso] 错误 2make: *** [arch/x86] 错误 2
解决方法:这个问题是由于 gcc 4.6 不再支持 linker-style 架构。将 arch/x86/vdso/Makefile 中,以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。
7.编译内核模块:make modules(源于启动的菜单型配置界面中选择&m&的项)
8.安装内核模块:make modules_install(代码会拷在/lib/modules/2.6.29目录下)
9制作initrd:mkinitrd initrd-2.6.29 2.6.29(如果是ubuntu,则使用mkinitramfs命令)
10.拷贝initrd和内核镜像到/boot
cp linu-2.6.29/arch/x86/boot/bzImage /boot/vmlinuz-2.6.29
cp initrd-2.6.29 /boot
11.修改grub的配置文件/etc/grub.conf
后面的四行是参照上面的修改的。
12.测试新安装的内核是否能用,使用命令reboot重启系统,按住空格键不放,直到进入grub界面
花了一天的时间,终于把ubuntu12.04 的linux内核版本从3.13.0升级到3.4.0 升级后,系统更加稳定.
发表了一篇文章
bootloader支持启动多个Linux
内核安装(X86平台)
发表了一篇文章
LInux LOader(LILO) 已经成为所有 Linux 发行版的标准组成部分。作为一个 较老的/最老的 Linux 引导加载程序,它那不断壮大的 Linux 社区支持使它能够随时间的推移而发展,并始终能够充当一个可用的现代引导加载程序。有一些新的功能,比如增强的用户界面,以及对能够突破原来 1024-柱面限制的新 BIOS 功能的利用。
虽然 LILO 仍在不断地发展,但 LILO 工作原理的基本概念保持不变。
使用 LILO 作为引导加载程序
要使用 LILO 作为引导加载程序,需要做的事情取决于是要进行全新安装还是要让已经安装的 Linux 改为使用 LILO。如果是要进行全新安装,那么直接跳转到
那一节。如果已经安装了某个 Linux 发行版,那么通常可以选择安装并配置 LILO(并可以将机器引导到新的 Linux 安装)。
要将现有的 Linux 迁移到 LILO,首先必须获得最新版本的 LILO(见 )。在做任何其他事情之前,建议您确保在手边拥有一张 Linux 引导盘 —— 如果偶而弄错了某些地方,它可以提供很大的帮助,能够恢复到初始的 Linux 配置!将 LILO 安装到系统中之后,让它接管 MBR 非常简单。以 root 用户身份输入:
# /sbin/lilo -v -v
这将使用当前的 LILO 默认值,抹去 MBR 中当前所有内容。不过,请阅读 ,以确保能够按预期引导起来。也要注意,如果想要在同一机器上运行 Windows 和 Linux,那么应该先安装 Windows OS,然后再安装 Linux OS,这样,在 Linux 安装中所选择的引导加载程序就不会被 Windows 引导加载程序所覆盖。与 Linux 引导加载程序不同,多数 Window 引导加载程序不支持引导 Linux。如果已经先安装了 Linux,那么只需要自己创建一张 Linux 引导盘,这样就可以在安装完 Windows 之后,回到 Linux 安装中并重写 MBR。
LILO 的配置都是通过位于 /etc/lilo.conf 的一个配置文件来完成的。清单 1 给出了一个示例配置,使用的是我的家用机器,支持 Linux 和 Windows 机器的双重引导。了解我的工作站的基本配置,就可以想像出这些配置是如何与实际机器相关联的:
主 HDD(物理磁盘 1)上安装了 Windows XP(最初机器上只有它)。在 Linux 术语中,这个 HDD 是 /dev/hda(在 GRUB 术语中是 hd0,0)。
从 HDD(物理磁盘 2)上安装了 Red Hat Linux;root 分区位于这个硬盘驱动器的第三个分区,即 /dev/hdb3(在 GRUB 术语中是 hd1,3)。
清单 1. lilo.conf 示例文件
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
timeout=100
default=Linux
image=/boot/vmlinuz-2.4.18-14
label=Linux
root=/dev/hdb3
password=linux
other=/dev/hda
label=WindowsXP
清单 1 中的选项:
boot= 行告诉 LILO 在哪里安装引导加载程序。在上面的示例中,将把它安装到第一块硬盘的 MBR。也可以选择将 LILO 安装到 /dev/hdb3(示例中的 Linux 分区),这样需要向 /dev/hda 安装另一个引导加载程序,并令其指向 LILO 引导加载程序;然后只需要让 LILO 作为二级引导加载程序。通常,引导加载程序应该位于 /dev/hda。还可以将这个参数指向软盘驱动器(最常见的是 /dev/fd0),来制做 LILO 软盘引导磁盘。
map= 指向引导期间 LILO 内部使用的映射文件。当使用 /sbin/lilo 命令安装 LILO 时, 它会自动生成这个文件,其中包含有描述符表(还有其他内容)。建议不要改动这个文件!
install= 是 LILO 在引导过程中内部使用的文件之一。它同时包含有引导加载程序的主要部分和二级部分。boot.b 文件的 一个片段被写入到 MBR(引导加载程序的主要部分),它会指向那个映射,接下来指向二级引导加载程序。同样,不要改动它!
prompt= 告诉 LILO 使用用户界面(本例中给出了两个选择 —— Linux 和 WindowsXP)。除了使用 prompt/user 界面以外,在适当情况下还可以为 Linux 内核等指定具体的参数。如果不在配置文件中指定此选项,那么 LILO 将引导到 默认的 OS,不发生任何用户交互,也不会等待。(但是请注意,如果在引导时按下了 SHIFT,那么还是可以得到提示,当不想把 引导加载程序暴露给普通用户时,这非常有用)。
timeout= 是引导提示在自动引导默认 OS(本例中是 Linux)之前的等待时间(以十分之一秒为单位)。 如果在 lilo.conf 没有指定 prompt,那么这个参数就会被忽略。
compact 选项可以大大加速引导过程,它会将连续的读磁盘的请求合并为一个单独的请求。不过,这可能是 一件祸福参半的事情,因为我在论坛上看到过很多贴子提到了关于此选项的问题。当希望从软盘引导时,这个选项尤其有用。
default= 选项告诉 LILO 默认使用哪个映像进行引导,比如在等待超时之后。这与 lilo.conf 文件中的某个映像的 标签相关联。如果没有在配置文件中指定此选项,那么它将引导文件中指定的第一个映像。
对于允许用户引导到的每一个 Linux 版本,都应该指定 image= 及以下三个选项。image 选项指定希望 引导到的内核版本。
label= 标明了在运行期间希望能够从用户界面引导的不同 OS。另外,这个标签用于指定引导的默认 OS。 (注意:标签名称中避免出现空格;否则,引导那个文件时会出现无法预期的错误。)
root= 告诉 LILO OS 文件系统实际所在的位置。在我们的示例中为 /dev/hdb3,即第二块硬盘上的第三个分区。
read-only 告诉 LILO 以只读的方式初始引导到文件系统。OS 一旦完全引导起来,就会以读写方式挂载。
password= 允许您为将要引导到的特定 OS 设置口令。不幸的是,这个口令是以可读文本的方式保存在 lilo.conf 文件中,所以,所有人都能够读取它。如果需要,还可以对想要引导自的每个操作系统设置口令(在我们的示例中,只为 Linux 的引导 设置了一个口令)。
other= 的动作类似于 image 和 root 选项的组合,但是用于除了 Linux 以外的其他操作系统。 在我们的示例中,它告诉 LILO 到哪里去找到 Windows OS(位于第一块硬盘的第一个分区)。如果先安装 Windows,后安装 Linux,通常会是这样。
label= 与所有其他 label 选项相同。
在 lilo.conf 文件中可以使用很多其他参数,不过清单 1 中的参数就足以让机器可用了。要获得关于 lilo.conf 的这些以及其他参数的 进一步资料,请参考手册页(man lilo.conf)。由于在引导时不会读取 lilo.conf,所以,当这个文件有改动时,需要“更新”MBR。 如果不完成此步骤就重新引导,那么对 lilo.conf 的修改不会在启动中反映出来。与先前将 LILO 写入 MBR 类似,需要运行:
$ /sbin/lilo -v -v
-v -v 标记会为您给出非常详细的输出。当像我们那样运行 LILO 时,有很多参数可以指定。 参阅手册页以获得更进一步的信息(man lilo)。
初始引导过程
当 LILO 初始引导时,它会按次序打印出每个字母 —— L-I-L-O。如果所有字母都显示出来,那么第一阶段引导就成功了。缺少任何内容 都表示出现了问题:
L:第一阶段引导加载程序已经被加载。如果 LILO 停止在这里,那么是在引导第二阶段引导加载程序时出现了问题。这通常会伴随有一个错误代码。 在这个阶段的常见问题是介质问题,或者在 lilo.conf 文件中指定了不正确的磁盘参数。
LI:第二阶段引导加载程序已经被加载。LILO 在此处停止表示第二阶段引导加载程序不能被执行。同样,这可能是因为出现了与只显示 L 类似的问题: 正在加载,或者因 boot.b 文件被破坏、移动或删除而不能加载。
LIL:第二阶段引导加载程序正在被执行。此时,可能会再次出现介质问题,或者映射文件(如 lilo.conf 文件中所指定的)在寻找描述符表时 可能会出现问题。
LIL?:加载到与上面相同的阶段。这通常意味着加载第二阶段引导加载程序使用了错误的地址,最常见的原因是 boot.b 所在的位置与 lilo.conf 文件所指定的不同。
LIL-:加载到与上面相同的阶段。加载描述符表时出现问题,最常见的原因是描述符表错误。
LILO:LILO 成功被加载,没有出现任何错误。
引导时的附加配置
LILO 被成功加载后,将看到 LILO 提示符。还是使用前面的示例 lilo.conf 文件,此时将有两个选择,可能对 LILO 新手来说并不直观。首先,可以 让 LILO 超时(10 秒后),这将引导 /dev/hdb3,即 Linux 分区。另外,可以按下 TAB 键,这将列出将要引导的操作系统选项。在我们的示例 lilo.conf 中, 将得到的选项是 “Linux” 和 “Windows”。输入哪一个,就会引导到哪个 OS。指定加载 Linux 选项,会提示输入一个口令,在本例中是 linux。如果输入的口令有误,则会返回 LILO 提示符。
不幸的是,LILO 不支持引导期间的交互式配置,所以,只能在 lilo.conf 中或者运行 /sbin/lilo 时指定选项。
关于第一次尝试 LILO 的最后一点建议是:我发现使用软盘引导磁盘比使用硬盘实现 LILO 配置更为安全。为此,必须在 lilo.conf 文件中使用boot=/dev/fd0 替换 boot=/dev/hda。那样,如果弄乱了 lilo.conf 文件 中的任何配置,都可以取出引导磁盘并像先前一样引导到 Linux。当使用软盘进行引导一切正常以后,可以将 lilo.conf 修改回 boot=/dev/hda,然后最后一次运行 /sbin/lilo 来上传修改。
近来,GRand Unified Boot loader(通常称为 GRUB)似乎要取代 LILO 在引导加载程序方面的统治地位。GNU GRUB 基于原来的 GRUB 程序(最初由 Erich Stefan Boleyn 所创建),正在由自由软件基金会(Free Software Foundation)进行积极开发。
使用 GRUB 作为引导加载程序
与使用 LILO 相同,使用 GRUB 作为活动的引导加载程序所需要的步骤,取决于是安装全新的 OS 还是已经安装了 Linux 并计划转移到 GRUB。 如果是进行全新安装,那么可以直接跳转到
那一节。如果已经安装了某个 Linux 发行版,那么通常可以选择 安装并配置 GRUB(并可以将机器引导到新的 Linux 安装)。
计划迁移到 GRUB 的当前 Linux 用户需要去获得最新版本的 GRUB(见 )。同样, 与 LILO 相同,在做任何其他事情之前,需要在手边准备一张 Linux 引导盘。使用交互模式(后面将描述)则不需要这张磁盘, 不过最好拥有一张以备急需时使用。将 LILO 安装到系统中之后,让它接管 MBR 非常简单。以 root 用户身份输入:
# /boot/grub/grub
这样将加载一个类似于 BASH 的命令提示符,可以在这里使用 GRUB 命令:
grub& install (hd1,3)/boot/grub/stage1 (hd0) (hd1,3)/boot/grub/stage2 p (hd1,3)/boot/grub/menu.conf
这个命令使用了 GRUB 安装命令,需要为它给出第一阶段映像的位置以及 MBR 的位置(install (hd1,3)/boot/grub/stage1 (hd1))。 也要给出第二阶段映像的位置((hd1,3)/boot/grub/stage2)。最后,可选项 p (hd1,3)/boot/grub/menu.conf 告诉 GRUB GUI 菜单配置文件的位置。
在前面的示例中,hd1 是我的 Linux Disk,hd0 是我的 Windows 磁盘。这样将使用当前 GRUB 默认值,并抹去 MBR 中当前所有内容(请阅读,以确保能够按预期引导起来)。
GRUB 的配置都是通过位于 /boot/grub/grub.conf 的一个配置文件来完成的。清单 2 给出了一个示例配置,使用的是我的家用机器,支持 Linux 和 Windows 机器的双重引导:
清单 2. grub.conf 示例文件
timeout=10
splashimage=(hd1,3)/grub/splash.xpm.gz
password --md5 $1$opeVt0$Y.br.18LyAasRsGdSKLYlp1
title Red Hat Linux
password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
root (hd1,3)
kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
initrd /initrd-2.4.18-14.img
title Windows XP
password --md5 $1$0peVt0$Y.br.18LyAasRsGdSKLYlp1
rootnoverify (hd0,0)
chainloader +1
清单 2 中的选项:
default= 选项通知 GRUB 在超时之后默认使用哪个映像进行引导。这一选项与 grub.conf 文件中的某个映像相关联。 0 表示指定了第一个,1 表示指定了第二个,依次类推。如果没有在配置文件指定此选项,那么它将引导文件中指定的第一个映像。
timeout= 是在自动引导默认 OS(在本例中是 Red Hat Linux)之前引导提示会等待多少秒。
splashimage= 是用作 GRUB GUI 背景的图片所在的位置。
password 选项指定了使用 MD5 加密的口令,用于访问 GRUB 的交互式引导选项。注意,这不会阻止用户选择 引导已经定义的 OS;需要为 每一个 -title 设置它。为了生成一个 md5 口令, 请运行 GRUB 所附带的 grub-md5-crypt 工具(以 root 身份)。它将提示输入一个希望加密的口令。然后输出使用 MD5 加密的口令。将这个口令拷贝到 grub.conf 中 password -md5 之后,但是要在同一行上。通常这个口令可以设置为 root 口令,因为无论如何也只有 root 才可以读取 grub.conf 文件。
title 标明了在运行期间能够从用户界面引导的具体 OS。 与 LILO 不同,在这个名称中可以有空格。
password 的设置方式与前面的 password 相同。如果计划与其他用户共享此机器,那么不要将这个口令设置为 root 口令。
root 告诉 GRUB OS 文件系统的实际位置。可见,GRUB 引用介质的方式与 LILO 不同。在 LILO 示例中, /dev/hdb3 是第二块硬盘中的第三个分区。Grub 将此硬盘引用为(hd1,3),即第二块硬盘的第三个分区(disk 0 是第一块硬盘)。
kernel:vmlinuz-X.X.XX-XX 是 root 目录中默认引导映像的名称。
initrd:initrd-X.X.XX-XX.img 是 root 目录中默认 initrd 映像的名称。
title 与所有其他 title 选项相同。
password:见其他口令选项。
rootnoverify 告诉 GRUB 不要尝试去改变 OS 的 root。这样,当文件系统不被 GRUB 所支持时,不会出现引导错误。
chainloader +1 告诉 GRUB 使用一个链式加载程序来加载这个 OS,加载 Windows 时需要这个选项。
在 grub.conf 文件中可以使用很多其他参数,不过清单 2 中的参数就足以让机器可用了。 要获得关于 grub.conf 的这些以及其他参数的进一步资料,请参考手册页(man grub.conf)。
与 LILO 的配置文件不同,grub.conf 会在引导时被读取,当被修改时不必去更新 MBR。
初始引导过程
与 LILO 类似,当 GRUB 初始加载时,从 MBR 加载第一阶段程序。加载后,它进入第一阶段和第二阶段引导加载程序之间的中间阶段(为了方便讨论,可称为第 1.5 阶段)。 之所以存在第 1.5 阶段,是为了能够对 /boot/grub 中的 GRUB 配置文件进行常规的文件系统访问,而不是去访问磁盘块。然后进入引导加载程序的第二阶段,GRUB 加载 grub.conf 文件。
现在应该能够看到 GRUB GUI 了。对于熟悉 Windows 的用户来说,这看起来感觉比 LILO 更友好。不过,不要因为 GRUB 拥有 GUI 就认为它是一个不能 处理数据的引导加载程序。可选项多得惊人。(见
中的提示。)
如果像我那样配置,那么现在应该能看到屏幕中有两个选项:引导到 Red Hat Linux 或者引导到 Windows XP。默认情况下,它将加载 Linux。选择任意一个的结果不言而喻。
现在来看一些好东西。
引导时的附加配置
在 GRUB GUI 中,按下任何键都会停止超时的计时。然后按下 P 键,可以输入 GRUB 口令,并获得对 GRUB 交互式引导选项的完全访问权限。 按下以下其中一个键,应该能够使用三个选项之中的一个:
要在引导之前编辑命令,请按下 E。这将让您能够为当前选中的 OS 编辑具体的选项。GRUB 只会显示出与那个 OS 的引导相关的选项, 然后您可以恰当地进行编辑。当为 root 文件系统指定了错误的 HDD 时,这尤其有用。如果需要以单用户模式访问机器(不需要指定口令 就能够让您获得 root 访问权限!),那么在 GRUB 主屏幕上选择 Linux OS。然后与前面一样,按下 E,并移到内核那一行( 在我的示例中是kernel /vmlinuz-2.4.18-14 ro root=LABEL=/)。然后在那一行最后添加 single,并按下 B 来使用修改过的 grub.conf 进行引导。在编辑模式下所做的任何修改都不会 保存到 grub.conf 文件中。
要修改内核参数,请按下 A。如果您是一位经验丰富的 Linux 用户,可以根据需要调整内核参数。
要获得类似于 BASH 的命令行界面,请按下 C。这个小型的命令行界面允许您在系统中查找 GRUB 配置文件,加载另外的配置文件, 编辑配置文件中的行,以及直接输入 GRUB 命令。如果配置的变化(比如删除了某个分区)让系统无法引导,那么可能会用到这个界面。 如果需要将系统引导为单用户模式,或者要让运行级别为 3 而不是普通的运行级别,也可能会使用到它。
这些选项有很多用途,但超出了本文的范围。
可见,GRUB 真正开放了引导期间的可能性。不过,这可能是一件好坏参半的事情,因为 GRUB 也潜在地允许攻击者在 OS 加载之前访问系统。 会被误用的主要开放领域是:
访问单用户模式。所有加载到单用户模式的人都会得到 root 访问权限,使得 Linux 可被随意滥用。
访问其他操作系统。任何配置为不需要口令的可引导操作系统,比如 DOS,都将是开放的。
访问 GRUB 编辑器。这允许用户获得修改 GRUB 配置的完全访问权限。
在 GRUB 配置中,设置安全性非常重要;设置口令,并使用 MD5 加密,可以保证整个系统的安全。
GRUB 的未来
GRUB 将要被 GRUB2 所取代。原来的 GRUB 将要被重新命名为 GRUB Legacy;除了修复 bug 以外,不会再对它进行积极开发。GRUB2 将是对原来 GRUB 的完全重写。到目前为止,以下特性是变化的核心部分:
通过创建压缩的核心映像取代了第 1.5 阶段
支持核心映像的动态加载
争取让整个 GRUB 框架成为面向对象的
支持国际化,比如 非-ASCII 字符集
支持不同硬件体系结构和不同平台(不同于 Linux 的平台)
请参考 GRUB Web 站点(见下面的
部分)以了解最新的进展。
GRUB 与 LILO 的比较
如本文开始处所述,所有引导加载程序都以类似的方式工作,满足共同的目的。不过,LILO 和 GRUB 之间有很多不同之处:
LILO 没有交互式命令界面,而 GRUB 拥有。
LILO 不支持网络引导,而 GRUB 支持。
LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件,必须将 LILO 第一阶段引导加载 程序重写到 MBR。相对于 GRUB,这是一个更为危险的选择,因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB,如果配置文件配置 错误,则只是默认转到 GRUB 命令行界面。
与所有软件相同,对某个用户来说是最好的选择,并不是对所有人来说都是最好的。至于这里所涉及的两个引导加载程序,我个人喜欢的是 GNU GRUB。它是一个非常好的全面的加载程序,组合了灵活的用户界面和大量的功能。但是,还有很多使用过并忠爱 LILO 的人仍然选择 LILO 作为引导加载程序。幸运的是,如果您刚刚开始接触 Linux 引导加载,使用哪个都不会有太大问题。
关于安全性,任何可以接触到引导磁盘/CD 的人,只需要使用没有设置安全性的 grub.conf 或 lilo.conf,就可以绕过本文中提及的所有安全措施。 特别是使用 GRUB 时,因为能够引导到单用户模式,所以是一个严重的安全漏洞。解决此问题的一个简单方法是在机器的 BIOS 中禁止通过 CD 和软盘进行 引导,并确保为 BIOS 设置了一个口令,使得其他人不能修改这些设置。
323957人浏览
223652人浏览
178187人浏览
124178人浏览
99096人浏览
手机扫描访问社区

我要回帖

更多关于 无线鼠标丢帧 的文章

 

随机推荐