要求 1) 编写一个简单的块设备驱动程序,该块设备包括打开、IO控制与释放三个基本操作。 2) 一个测试程序
要求:1)编写一个简单的块设备驱动程序,该块设备包括打开、IO控制与释放三个基本操作。2)编写一个测试程序,测试字符设备驱动程序的正确性。紧急!!!!要是符合,本人将会追...
要求:
1) 编写一个简单的块设备驱动程序,该块设备包括打开、IO控制与释放三个基本操作。
2) 编写一个测试程序,测试字符设备驱动程序的正确性。
紧急!!!!要是符合,本人将会追加100分!!
环境要求:Linux (ubuntu)10.04
谢谢大家。
谢谢了。 展开
1) 编写一个简单的块设备驱动程序,该块设备包括打开、IO控制与释放三个基本操作。
2) 编写一个测试程序,测试字符设备驱动程序的正确性。
紧急!!!!要是符合,本人将会追加100分!!
环境要求:Linux (ubuntu)10.04
谢谢大家。
谢谢了。 展开
展开全部
您好,这样的情况建议您可以升级到最新版本试一下,或是联系一下官网客服比较好。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一、散热不良:显示器、电源和CPU在工作中发热量非常大,因此保持良好的通风状况非常重要,如果显示器过热将会导致色彩、图象失真甚至缩短显示器寿命。工作时间太长也会导致电源或显示器散热不畅而造成电脑死机。CPU的散热是关系到电脑运行的稳定性的重要问题,也是散热故障发生的“重灾区”。
二、移动不当:在电脑移动过程中受到很大振动常常会使机器内部器件松动,从而导致接触不良,引起电脑死机,所以移动电脑时应当避免剧烈振动。
三、灰尘杀手:机器内灰尘过多也会引起死机故障。如软驱磁头或光驱激光头沾染过多灰尘后,会导致读写错误,严重的会引起电脑死机。
四、设备不匹配:如主板主频和CPU主频不匹配,老主板超频时将外频定得太高,可能就不能保证运行的稳定性,因而导致频繁死机。
五、软硬件不兼容:三维软件和一些特殊软件,可能在有的微机上就不能正常启动甚至安装,其中可能就有软硬件兼容方面的问题。
六、内存条故障:主要是内存条松动、虚焊或内存芯片本身质量所致。应根据具体情况排除内存条接触故障,如果是内存条质量存在问题,则需更换内存才能解决问题。开机只听见“嘀、嘀”的单声长声,估计是内存的问题,换个插槽试试,仍不行的话,可能是内存坏了。
七、硬盘故障:主要是硬盘老化或由于使用不当造成坏道、坏扇区。这样机器在运行时就很容易发生死机。可以用专用工具软件来进行排障处理,如损坏严重则只能更换硬盘了。另外对于在不支持UDMA 66/100的主板,应注意CMOS中硬盘运行方式的设定。
八、CPU超频:超频提高了CPU的工作频率,同时,也可能使其性能变得不稳定。究其原因,CPU在内存中存取数据的速度本来就快于内存与硬盘交换数据的速度,超频使这种矛盾更加突出,加剧了在内存或虚拟内存中找不到所需数据的情况,这样就会出现“异常错误”。解决办法当然也比较简单,就是让CPU回到正常的频率上。超频超过火了,有时显示器不亮,有时是进入系统后死机,严重者会导致CPU被烧坏。
九、硬件资源冲突:是由于声卡或显示卡的设置冲突,引起异常错误。此外,其它设备的中断、DMA或端口出现冲突的话,可能导致少数驱动程序产生异常,以致死机。解决的办法是以“安全模式”启动,在“控制面板”→“系统”→“设备管理”中进行适当调整。对于在驱动程序中产生异常错误的情况,可以修改注册表。选择“运行”,键入“Regedit”,进入注册表编辑器,通过选单下的“查找”功能,找到并删除与驱动程序前缀字符串相关的所有“主键”和“键值”,重新启动。
十、内存容量不够:内存容量越大越好,应不小于硬盘容量的0.5~1%,如出现这方面的问题,就应该换上容量尽可能大的内存条。
十一、劣质零部件:少数不法商人在给顾客组装兼容机时,使用质量低劣的板卡、内存,有的甚至出售冒牌主板和Remark过的CPU、内存,这样的机器在运行时很不稳定,发生死机在所难免。因此,用户购机时应该警惕,并可以用一些较新的工具软件测试电脑,长时间连续考机(如72小时),以及争取尽量长的保修时间等。
十二、板、卡接触不良、松动,或者板上的插槽坏了,或者干脆显示卡、内存等配件是坏的,导致显示器不亮。
十三、电压起伏太大,造成板、卡上电流或大或小,有时会损坏硬件。所以选择一款能够起到超电压保护的电源是至关重要,或者加稳压器。
十四、打印机、刻录机、扫描仪等外设已坏,但即插即用的技术使系统在启动时检测这些设备导致死机。
十五、如果主机运行正常,也有硬盘运行的声音,但显示器不亮,可能是显示器坏了,或者是显示器信号线接触不好或是坏的,也有可能是显示器电源未插。
十六、主板电容。有时我们其它硬件好好的,可什么问题都没有发现,可遍遍我们开机一会就死机,一动也不动,可这是不限时的。你可能猜是系统问题了吧,可这不是,这就是主板电容坏了。
由软件原因引起的死机
一、病毒感染:病毒可以使计算机工作效率急剧下降,造成频繁死机。这时,我们需用杀毒软件如KV300、金山毒霸、瑞星等来进行全面查毒、杀毒,并做到定时升级杀毒软件。
二、CMOS设置不当:该故障现象很普遍,如硬盘参数设置、模式设置、内存参数设置不当从而导致计算机无法启动。如将无ECC功能的内存设置为具有ECC功能,这样就会因内存错误而造成死机。
三、系统文件的误删除:由于Windows 9X启动需要有Command.com、Io.sys、Msdos.sys等文件,如果这些文件遭破坏或被误删除,即使在CMOS中各种硬件设置正确无误也无济于事。解决方法:使用同版本操作系统的启动盘启动计算机,然后键入“SYS C:”,重新传送系统文件即可。
四、初始化文件遭破坏:由于Windows 9X启动需要读取System.ini、Win.ini和注册表文件,如果存在Config.sys、Autoexec.bat文件,这两个文件也会被读取。只要这些文件中存在错误信息都可能出现死机,特别是System.ini、Win.ini、User.dat、System.dat这四个文件尤为重要。
五、动态链接库文件(DLL)丢失:在Windows操作系统中还有一类文件也相当重要,这就是扩展名为DLL的动态链接库文件,这些文件从性质上来讲是属于共享类文件,也就是说,一个DLL文件可能会有多个软件在运行时需要调用它。如果我们在删除一个应用软件的时候,该软件的反安装程序会记录它曾经安装过的文件并准备将其逐一删去,这时候就容易出现被删掉的动态链接库文件同时还会被其它软件用到的情形,如果丢失的链接库文件是比较重要的核心链接文件的话,那么系统就会死机,甚至崩溃。我们可用工具软件如“超级兔仔”对无用的DLL文件进行删除,这样会避免误删除。
六、硬盘剩余空间太少或碎片太多:如果硬盘的剩余空间太少,由于一些应用程序运行需要大量的内存、这样就需要虚拟内存,而虚拟内存则是由硬盘提供的,因此硬盘要有足够的剩余空间以满足虚拟内存的需求。同时用户还要养成定期整理硬盘、清除硬盘中垃圾文件的良好习惯。
七、BIOS升级失败:应备份BIOS以防不测,但如果你的系统需要对BIOS进行升级的话,那么在升级之前最好确定你所使用BIOS版本是否与你的PC相符合。如果BIOS升级不正确或者在升级的过程中出现意外断电,那么你的系统可能无法启动。所以在升级BIOS前千万要搞清楚BIOS的型号。如果你所使用的BIOS升级工具可以对当前BIOS进行备份,那么请把以前的BIOS在磁盘中拷贝一份。同时看系统是否支持BIOS恢复并且还要懂得如何恢复。
八、软件升级不当:大多数人可能认为软件升级是不会有问题的,事实上,在升级过程中都会对其中共享的一些组件也进行升级,但是其它程序可能不支持升级后的组件从而导致各种问题。
九、滥用测试版软件:最好少用软件的测试版,因为测试软件通常带有一些BUG或者在某方面不够稳定,使用后会出现数据丢失的程序错误、死机或者是系统无法启动。
十、非法卸载软件:不要把软件安装所在的目录直接删掉,如果直接删掉的话,注册表以及Windows目录中会有很多垃圾存在,久而久之,系统也会变不稳定而引起死机。
十一、使用盗版软件:因为这些软件可能隐藏着病毒,一旦执行,会自动修改你的系统,使系统在运行中出现死机。
十二、应用软件的缺陷:这种情况是常见的,如在Win 98中运行那些在DOS或Windows 3.1中运行良好的16位应用软件。Win 98是32位的,尽管它号称兼容,但是有许多地方是无法与16位应用程序协调的。还有一些情况,如在Win 95下正常使用的外设驱动程序,当操作系统升级后,可能会出现问题,使系统死机或不能正常启动。遇到这种情况应该找到外设的新版驱动。另外软件的Bug也会导致死机。
十三、启动的程序太多:这使系统资源消耗殆尽,使个别程序需要的数据在内存或虚拟内存中找不到,也会出现异常错误。
十四、非法操作:用非法格式或参数非法打开或释放有关程序,也会导致电脑死机。请注意要牢记正确格式和相关参数,不随意打开和释放不熟悉的程序。
十五、非正常关闭计算机:不要直接使用机箱中的电源按钮,否则会造成系统文件损坏或丢失,引起自动启动或者运行中死机。对于Windows 98/2000/NT等系统来说,这点非常重要,严重的话,会引起系统崩溃。
十六、内存中冲突:有时候运行各种软件都正常,但是却忽然间莫名其妙地死机,重新启动后运行这些应用程序又十分正常,这是一种假死机现象。出现的原因多是Win 98的内存资源冲突。大家知道,应用软件是在内存中运行的,而关闭应用软件后即可释放内存空间。但是有些应用软件由于设计的原因,即使在关闭后也无法彻底释放内存的,当下一软件需要使用这一块内存地址时,就会出现冲突。
十七、网上冲浪时,黑客侵入。
十八、错误修改了系统注册表信息,造成Windows系统不能启动。
十九、机器运行速度太慢,造成死机的假象。
在使用计算机的过程中,死机是一种常见的现象,同时也是难于找到原因的计算机故障之一。由于在“死机”状态下无法用软件或系统工具进行诊断,因而增加了排除故障的难度。对于一些菜鸟来讲,“死机”更是让他们头疼不已。下面,笔者将为大家分析一下常见的死机故障,以及检查处理方法。希望能对大家在以后排除死机问题时有所帮助。并让“死机”从此与我们后会无期!
1.排除系统“假”死机现象
①首先排除因电源问题带来的”假”死机现象。应检查微机电源是否插好,电源插座是否接触良好,主机、显示器以及打印机、扫描仪、外置式MODEM、音箱等要外接电源的设备的电源插头是否可靠地插入了电源插座,上述各部件的电源开关是否都置于了开(ON)的位置。
②检查微机各部件间数据、控制连线是否连接正确和可靠,插头间是否有松动现象。尤其是主机与显示器的数据线连接不良常常造成”黑屏”的假死机现象。
2.排除病毒和杀毒引起的死机现象
用无毒干净的系统盘引导系统,然后运行KV3000、KILL、AV953、SCAN等防病毒软件的最新版本对硬盘进行检查,确保微机安全,排除因病毒引起的死机现象。
另外,如果在杀毒后引起了死机现象,这多半是因为病毒破坏了系统文件、应用程序及关键的数据文件;或是杀毒软件在消除病毒的同时对正常的文件进行了误操作,破坏了正常文件的结构。碰到这类问题,只能将被损坏(即运行时引起死机)的系统或软件进行重装。
3.不同时候死机的处理方法
如果是在系统启动期间发生的死机,请参见第6步;如果是在系统启动后,软件运行期间发生的死机,请参见第5步;如果是”黑屏”类的死机请参见第11步;其它死机请继续下一步。
4.越来越频繁的死机现象的故障判断
如果死机现象是从无到有,并且越来越频繁,一般有以下两个原因:使用维护不当,请参见第7步;
微机部件品质不良或性能不稳定,请参见第10步。
5.排除软件安装、配置问题引起的死机现象
①如果是在软件安装过程中死机,则可能是系统某些配置与安装的软件冲突。这些配置包括系统BIOS设置、CONFIG.SYS和AUTOEXEC.BAT的设置、WINDOWS.INI、SYSTEM.INI的设置以及一些硬件驱动程序和内存驻留程序。
可以试着修改上述设置项。对BIOS可以读取其默认设置,如”LOAD SETUP DEFAULT”和”LOAD BIOS DEFAULT”;对CONFIG.SYS和AUTOEXEC.BAT则可以在启动时按F5跳过系统配置文件,或按F8逐步选择执行以及逐项修改CONFIG.SYS和AUTOEXEC.BAT中的配置,尤其是EMM386中关于EMS、XMS的配置情况来判断与安装程序什么地方发生了冲突;一些硬件驱动程序和内存驻留程序则可以通过不装载它们的方法来避免冲突。
②如果是在软件安装后发生了死机,则是安装好的程序与系统发生冲突。一般的做法是恢复系统在安装前的各项配置,然后分析安装程序新装入部分所使用的资源和可能发生的冲突,逐步找出故障原因;删除新安装程序也是解决冲突的方法之一。
③如果是因为病毒或杀毒引起的软件运行死机,请参见第2步。
6.系统启动过程中的死机现象
系统启动过程中的死机现象又有两种情况:
①致命性死机,即系统自检过程未完成就死机,一般系统不给出提示
②非致命性死机,在自检过程中或自检完成后死机,但系统给出声音、文字等提示信息。
对于第一种情况,可以根据开机自检时致命性错误列表中所列的情况,再结合其它方法对故障原因做进一步的分析,如:硬件安装情况(请参见第8步),系统配置(请参见第9步),硬件设备品质(请参见第10步)以及显示器黑屏(请参见第11步)等。
对于第二种情况,可以根据开机自检时非致命性错误代码表和开机自检时鸣笛音对应的错误代码表中所列的情况,对可能出现故障的部件做重点检查,但也不能忽略相关部件的检查,因为相当多的故障并不是由提示信息指出的部件直接引起,而常常由相关部件故障引发。一些关键系统部件(如:CPU、内存条、CACHE、电源、系统后备电池、主板、总线等)的故障也常常以各种相关或不相关部件故障的形式表现出来,因此这些部件的检查也应在考虑范围之内。
7.排除因使用、维护不当引起的死机现象
微机在使用一段时间后会因为使用、维护不当而引起死机,尤其是长时间不使用微机后常会出现此类故障。引起的原因有以下几种:
①积尘导致系统死机
灰尘是微机的大敌。过多的灰尘附着在CPU、芯片、风扇的表面会导致这些元件散热不良;电路印刷板上的灰尘在潮湿的环境中常常导致短路。上述两种情况均会导致死机。
可以用毛刷将灰尘扫去,或用棉签沾无水酒精清洗积尘元件。注意不要将毛刷和棉签的毛、棉留在电路板和元件上,从而成为新的死机故障源。
②部件受潮
长时间不使用微机,会导致部分元件受潮而使用不正常。可用电吹风的低热挡均匀对受潮元件”烘干”。注意不可对元件一部分加热太久或温度太高,避免烤坏元件。
③板卡、芯片引脚氧化导致接触不良,
将板卡、芯片拔出,用橡皮擦轻轻擦拭引脚表面去除氧化物,重新插入插座。
④板卡、外设接口松动导致死机
仔细检查各I/O插槽插接是否正确,各外设接口接触是否良好,线缆连接是否正常。
⑤意外损坏
如:雷击电流通过未经保护的电源及MODEM电话线进入主机,损坏电源、主机板、MODEM及各种内外设备。
意外损坏是否发生、对微机产生了什么破坏性的后果,都只能用交换法、拔插法测试主机各部件的好坏来判断。
8.排除因系统配置不当引起的死机现象
系统配置与微机硬件设备和系统BIOS、主板上跳线开关设置密切相关,常见的死机故障原因有:
①CPU主频设置不当这一类的故障主要有CPU主频跳线开关设置错误、重新打磨过的CPU引起的BIOS设置与实际情况不符、超频使用CPU:
”CPU超频运行引发的故障处理”
”CPU性能不良引起死机的处理”
”CPU芯片与主板及显示卡不兼容造成的故障”
②内存条参数设置不当
这一类的故障主要有内存条设置错误和Remark内存条引起的BIOS设置与实际情况不符,请参见以下的故障实例:
”内存条速度不匹配引起的死机”
”CMOS设置与内存条实际情况不符引起的死机”
”内存参数设置不当引起的GP错误的处理”
③CACHE参数设置不当
这一类的故障主要有CACHE设置错误、重新打磨过的CACHE引起的BIOS设置与实际情况不符。
④CMOS参数被破坏
由于频繁修改CMOS参数,或病毒对CMOS参数的破坏,常常导致CMOS参数混乱而很难恢复。可以采用对CMOS放电的方法并采用系统BIOS默认设置值重新设定CMOS参数。CMOS的放电方法可参照主板说明书进行。重设CMOS参数后,还必须对硬盘杀毒。
9.排除因硬件安装不当引起的死机现象
硬件外设安装过程中的疏忽常常导致莫名其妙的死机,而且这一现象往往在微机使用一段时间后才逐步显露出来,因而具有一定的迷惑性。
①部件安装不到位、插接松动、连线不正确引起的死机
显示卡与I/O插槽接触不良常常引起显示方面的死机故障,如”黑屏”;内存条、CACHE与插槽插接松动则常常引起程序运行中死机,甚至系统不能启动;其它板卡与插槽(插座)的接触问题也常常引起各种死机现象。
要排除这些故障,只需将相应板卡、芯片用手摁紧,或从插槽(插座)上拔下从新安装。如果有空闲插槽(插座),也可将该部件换一个插槽(插座)安装以解决接触问题。
线缆连接不正确有时也会引发死机故障。
②安装不当导致部件变形、损坏引起的死机
口径不正确、长度不恰当的螺钉常常导致部件安装孔损坏、螺钉接触到部件内部电路引起短路导致死机;不规格的主板、零部件或不规范的安装步骤常常引起机箱、主板、板卡外形上的变异因而挤压该部件内部元件导致局部短路、内部元件损坏导致莫名其妙的死机。
如果只是微机部件外观变形,可以通过正确的安装方法和更换符合规格的零部件来解决;如果已经导致内部元件损坏,则只能更换新的零部件了。
10.排除因硬件品质不良引起的死机现象
一般说来,微机产品都是国际大厂商按照国际标准流水线生产出来的,部件不良率是很低的。但是计算机产品高利润的诱惑使许多非法厂商对微机标准零部件改头换面、进行改频、重新标记(Remark)、以次充好甚至将废品、次品当作正品出售,导致这些”超水平”发挥的产品性能不稳定,环境略有不适或使用时间稍长就会频繁发生故障,尤其是CPU、内存条、CACHE、主板等核心部件及其相关产品的品质不良,是导致无原因死机的主要故障源。
检查时应着重检查以下部件:
①CPU
CPU是被假冒得最多也是极容易导致死机的部件。被重新打磨过的CPU在低温、短时间使用时一切正常,但只要在连续高温的环境中长时间使用其死机弊端就很容易暴露。使用Windows、3DS等对CPU特性要求较高的软件比DOS等简单软件更能发现CPU的问题。
参照说明书将CPU主频跳低1到2个档次使用,如:将166MHz降为150MHz、133MHz或120MHz使用。如果死机现象大幅度减少或消失,就可以判断是CPU有问题。也可以用交换法,更换同型号的正常CPU如果不再死机一般可以断定是CPU的问题。
有些用户喜欢把CPU超频使用以获得高速的性能,这也是常导致计算机死机的原因。将CPU跳回原频率就能解决死机问题。
②内存条
内存条常常被做的手脚有:速度标记被更改,如:70ns被重新打磨为60ns;非奇偶校验冒充奇偶校验内存;非EDO内存冒充EDO内存;劣质内存条冒充好内存条。
在BIOS中将内存条读写时间适当增加(如:从60ns升为70ns),如果死机消失可以断定是内存条速度问题。
如果是内存本身的质量问题,只有通过更换新的内存条才能解决。
③CACHE
CACHE也存在以次充好问题。另外,CACHE本身的损坏也导致严重的死机。
在系统BIOS设置中的关闭外部CACHE选项,如果死机消失,则必是CACHE问题。
④CMOS芯片损坏
CMOS芯片一般不容易损坏,但一旦有物理损坏则必然引起死机,其中以黑屏不能启动为主。由于CMOS芯片目前都已集成到超大规模集成电路的芯片组中,所以,更换CMOS芯片往往要连主板一起更换。
⑤主板
一般主板的故障常常是最先考虑然而却是要到最后才能确定的。除了印刷板上的飞线、断线和主板上元件被烧焦、主板受挤压变形、主板与机箱短路等明显的现象外,主板本身的故障只有在确认了主板上所有零部件正常(将你的板卡、CPU、内存条等配件拿到好的主板上使用正常,而别人使用正常的板卡、器件插到你的主板上就不能正常运行)时才能判断是否是主板故障。
如果更换了好的同型号主板死机依然存在,则可能是该主板与某个零部件不兼容。要么更换兼容的其它型号的主板,要么只能用拔插法依次测试各板卡、芯片,找出不兼容的零部件更换之。
⑥电源、风扇、机箱等
劣质电源、电源线缆故障、电源插接松动、电源电压不稳都是引起不明原因死机的罪魁祸首。CPU风扇、电源风扇转动不正常、风扇功率不足则会引起CPU和机箱内”产热大户”元件散热不良因而引起死机。
11. 系统黑屏故障的排除
系统死机故障的很大一部分现象表现为黑屏(即显示器屏幕上无任何显示),这类故障与显示器、显示卡关系很密切,同时系统主板、CPU、CACHE、内存条、电源等部件的故障也能导致黑屏。
系统黑屏的死机故障的一般检查方法如下:
①排除”假”黑屏
检查显示器电源插头是否插好,电源开关是否已打开,显示器与主机上显示卡的数据连线是否连接好、连接插头是否松动,看是否是因为这些因素引起的黑屏。
另外,应该动一下鼠标或按一下键盘看屏幕是否恢复正常。因为黑屏也可能是因为设置了节能模式(可在BIOS设置中查看和修改)而出现的假死机。
②在黑屏的同时系统其它部分是否工作正常,如:启动时软/硬盘驱动器自检是否通过,键盘按键是否有反应等。可以通过交换法用一台好的显示器接在主机上测试,如果只是显示器黑屏而其它部分正常,则只是显示器出了问题,这仍是一种假死机现象。
③黑屏发生在系统开机自检期间,请参见第6步。
④黑屏发生在显示驱动程序安装或显示模式设置期间,显然是选择了显示系统不能支持的模式,应选择一种较基本的显示方式。如:Windows下设置显示模式后黑屏或花屏,则应在DOS下运行Windows目录下的SETUP.EXE程序选择标准VGA显示方式。
⑤检查显示卡与主板I/O插槽接触是否正常、可靠,必要时可以换一个I/O槽插入显示卡试试。
⑥换一块已确认性能良好的同型号显示卡插入主机重新启动,若黑屏死机现象消除则是显示卡的问题。
⑦换一块已确认性能良好的其它型号显示卡插入主机重新启动,若黑屏死机现象消除则是显示卡与主板不兼容,可以考虑更换显示卡或主板。
⑧检查是否错误设置了系统的核心部件,如CPU的频率、内存条的读写时间、CACHE的刷新方式、主板的总线速率等,这些都可能导致黑屏的死机现象。
⑨检查主机内部各部件连线是否正确,有一些特殊的连线错误会导致黑屏死机。
引自 网馨源码
二、移动不当:在电脑移动过程中受到很大振动常常会使机器内部器件松动,从而导致接触不良,引起电脑死机,所以移动电脑时应当避免剧烈振动。
三、灰尘杀手:机器内灰尘过多也会引起死机故障。如软驱磁头或光驱激光头沾染过多灰尘后,会导致读写错误,严重的会引起电脑死机。
四、设备不匹配:如主板主频和CPU主频不匹配,老主板超频时将外频定得太高,可能就不能保证运行的稳定性,因而导致频繁死机。
五、软硬件不兼容:三维软件和一些特殊软件,可能在有的微机上就不能正常启动甚至安装,其中可能就有软硬件兼容方面的问题。
六、内存条故障:主要是内存条松动、虚焊或内存芯片本身质量所致。应根据具体情况排除内存条接触故障,如果是内存条质量存在问题,则需更换内存才能解决问题。开机只听见“嘀、嘀”的单声长声,估计是内存的问题,换个插槽试试,仍不行的话,可能是内存坏了。
七、硬盘故障:主要是硬盘老化或由于使用不当造成坏道、坏扇区。这样机器在运行时就很容易发生死机。可以用专用工具软件来进行排障处理,如损坏严重则只能更换硬盘了。另外对于在不支持UDMA 66/100的主板,应注意CMOS中硬盘运行方式的设定。
八、CPU超频:超频提高了CPU的工作频率,同时,也可能使其性能变得不稳定。究其原因,CPU在内存中存取数据的速度本来就快于内存与硬盘交换数据的速度,超频使这种矛盾更加突出,加剧了在内存或虚拟内存中找不到所需数据的情况,这样就会出现“异常错误”。解决办法当然也比较简单,就是让CPU回到正常的频率上。超频超过火了,有时显示器不亮,有时是进入系统后死机,严重者会导致CPU被烧坏。
九、硬件资源冲突:是由于声卡或显示卡的设置冲突,引起异常错误。此外,其它设备的中断、DMA或端口出现冲突的话,可能导致少数驱动程序产生异常,以致死机。解决的办法是以“安全模式”启动,在“控制面板”→“系统”→“设备管理”中进行适当调整。对于在驱动程序中产生异常错误的情况,可以修改注册表。选择“运行”,键入“Regedit”,进入注册表编辑器,通过选单下的“查找”功能,找到并删除与驱动程序前缀字符串相关的所有“主键”和“键值”,重新启动。
十、内存容量不够:内存容量越大越好,应不小于硬盘容量的0.5~1%,如出现这方面的问题,就应该换上容量尽可能大的内存条。
十一、劣质零部件:少数不法商人在给顾客组装兼容机时,使用质量低劣的板卡、内存,有的甚至出售冒牌主板和Remark过的CPU、内存,这样的机器在运行时很不稳定,发生死机在所难免。因此,用户购机时应该警惕,并可以用一些较新的工具软件测试电脑,长时间连续考机(如72小时),以及争取尽量长的保修时间等。
十二、板、卡接触不良、松动,或者板上的插槽坏了,或者干脆显示卡、内存等配件是坏的,导致显示器不亮。
十三、电压起伏太大,造成板、卡上电流或大或小,有时会损坏硬件。所以选择一款能够起到超电压保护的电源是至关重要,或者加稳压器。
十四、打印机、刻录机、扫描仪等外设已坏,但即插即用的技术使系统在启动时检测这些设备导致死机。
十五、如果主机运行正常,也有硬盘运行的声音,但显示器不亮,可能是显示器坏了,或者是显示器信号线接触不好或是坏的,也有可能是显示器电源未插。
十六、主板电容。有时我们其它硬件好好的,可什么问题都没有发现,可遍遍我们开机一会就死机,一动也不动,可这是不限时的。你可能猜是系统问题了吧,可这不是,这就是主板电容坏了。
由软件原因引起的死机
一、病毒感染:病毒可以使计算机工作效率急剧下降,造成频繁死机。这时,我们需用杀毒软件如KV300、金山毒霸、瑞星等来进行全面查毒、杀毒,并做到定时升级杀毒软件。
二、CMOS设置不当:该故障现象很普遍,如硬盘参数设置、模式设置、内存参数设置不当从而导致计算机无法启动。如将无ECC功能的内存设置为具有ECC功能,这样就会因内存错误而造成死机。
三、系统文件的误删除:由于Windows 9X启动需要有Command.com、Io.sys、Msdos.sys等文件,如果这些文件遭破坏或被误删除,即使在CMOS中各种硬件设置正确无误也无济于事。解决方法:使用同版本操作系统的启动盘启动计算机,然后键入“SYS C:”,重新传送系统文件即可。
四、初始化文件遭破坏:由于Windows 9X启动需要读取System.ini、Win.ini和注册表文件,如果存在Config.sys、Autoexec.bat文件,这两个文件也会被读取。只要这些文件中存在错误信息都可能出现死机,特别是System.ini、Win.ini、User.dat、System.dat这四个文件尤为重要。
五、动态链接库文件(DLL)丢失:在Windows操作系统中还有一类文件也相当重要,这就是扩展名为DLL的动态链接库文件,这些文件从性质上来讲是属于共享类文件,也就是说,一个DLL文件可能会有多个软件在运行时需要调用它。如果我们在删除一个应用软件的时候,该软件的反安装程序会记录它曾经安装过的文件并准备将其逐一删去,这时候就容易出现被删掉的动态链接库文件同时还会被其它软件用到的情形,如果丢失的链接库文件是比较重要的核心链接文件的话,那么系统就会死机,甚至崩溃。我们可用工具软件如“超级兔仔”对无用的DLL文件进行删除,这样会避免误删除。
六、硬盘剩余空间太少或碎片太多:如果硬盘的剩余空间太少,由于一些应用程序运行需要大量的内存、这样就需要虚拟内存,而虚拟内存则是由硬盘提供的,因此硬盘要有足够的剩余空间以满足虚拟内存的需求。同时用户还要养成定期整理硬盘、清除硬盘中垃圾文件的良好习惯。
七、BIOS升级失败:应备份BIOS以防不测,但如果你的系统需要对BIOS进行升级的话,那么在升级之前最好确定你所使用BIOS版本是否与你的PC相符合。如果BIOS升级不正确或者在升级的过程中出现意外断电,那么你的系统可能无法启动。所以在升级BIOS前千万要搞清楚BIOS的型号。如果你所使用的BIOS升级工具可以对当前BIOS进行备份,那么请把以前的BIOS在磁盘中拷贝一份。同时看系统是否支持BIOS恢复并且还要懂得如何恢复。
八、软件升级不当:大多数人可能认为软件升级是不会有问题的,事实上,在升级过程中都会对其中共享的一些组件也进行升级,但是其它程序可能不支持升级后的组件从而导致各种问题。
九、滥用测试版软件:最好少用软件的测试版,因为测试软件通常带有一些BUG或者在某方面不够稳定,使用后会出现数据丢失的程序错误、死机或者是系统无法启动。
十、非法卸载软件:不要把软件安装所在的目录直接删掉,如果直接删掉的话,注册表以及Windows目录中会有很多垃圾存在,久而久之,系统也会变不稳定而引起死机。
十一、使用盗版软件:因为这些软件可能隐藏着病毒,一旦执行,会自动修改你的系统,使系统在运行中出现死机。
十二、应用软件的缺陷:这种情况是常见的,如在Win 98中运行那些在DOS或Windows 3.1中运行良好的16位应用软件。Win 98是32位的,尽管它号称兼容,但是有许多地方是无法与16位应用程序协调的。还有一些情况,如在Win 95下正常使用的外设驱动程序,当操作系统升级后,可能会出现问题,使系统死机或不能正常启动。遇到这种情况应该找到外设的新版驱动。另外软件的Bug也会导致死机。
十三、启动的程序太多:这使系统资源消耗殆尽,使个别程序需要的数据在内存或虚拟内存中找不到,也会出现异常错误。
十四、非法操作:用非法格式或参数非法打开或释放有关程序,也会导致电脑死机。请注意要牢记正确格式和相关参数,不随意打开和释放不熟悉的程序。
十五、非正常关闭计算机:不要直接使用机箱中的电源按钮,否则会造成系统文件损坏或丢失,引起自动启动或者运行中死机。对于Windows 98/2000/NT等系统来说,这点非常重要,严重的话,会引起系统崩溃。
十六、内存中冲突:有时候运行各种软件都正常,但是却忽然间莫名其妙地死机,重新启动后运行这些应用程序又十分正常,这是一种假死机现象。出现的原因多是Win 98的内存资源冲突。大家知道,应用软件是在内存中运行的,而关闭应用软件后即可释放内存空间。但是有些应用软件由于设计的原因,即使在关闭后也无法彻底释放内存的,当下一软件需要使用这一块内存地址时,就会出现冲突。
十七、网上冲浪时,黑客侵入。
十八、错误修改了系统注册表信息,造成Windows系统不能启动。
十九、机器运行速度太慢,造成死机的假象。
在使用计算机的过程中,死机是一种常见的现象,同时也是难于找到原因的计算机故障之一。由于在“死机”状态下无法用软件或系统工具进行诊断,因而增加了排除故障的难度。对于一些菜鸟来讲,“死机”更是让他们头疼不已。下面,笔者将为大家分析一下常见的死机故障,以及检查处理方法。希望能对大家在以后排除死机问题时有所帮助。并让“死机”从此与我们后会无期!
1.排除系统“假”死机现象
①首先排除因电源问题带来的”假”死机现象。应检查微机电源是否插好,电源插座是否接触良好,主机、显示器以及打印机、扫描仪、外置式MODEM、音箱等要外接电源的设备的电源插头是否可靠地插入了电源插座,上述各部件的电源开关是否都置于了开(ON)的位置。
②检查微机各部件间数据、控制连线是否连接正确和可靠,插头间是否有松动现象。尤其是主机与显示器的数据线连接不良常常造成”黑屏”的假死机现象。
2.排除病毒和杀毒引起的死机现象
用无毒干净的系统盘引导系统,然后运行KV3000、KILL、AV953、SCAN等防病毒软件的最新版本对硬盘进行检查,确保微机安全,排除因病毒引起的死机现象。
另外,如果在杀毒后引起了死机现象,这多半是因为病毒破坏了系统文件、应用程序及关键的数据文件;或是杀毒软件在消除病毒的同时对正常的文件进行了误操作,破坏了正常文件的结构。碰到这类问题,只能将被损坏(即运行时引起死机)的系统或软件进行重装。
3.不同时候死机的处理方法
如果是在系统启动期间发生的死机,请参见第6步;如果是在系统启动后,软件运行期间发生的死机,请参见第5步;如果是”黑屏”类的死机请参见第11步;其它死机请继续下一步。
4.越来越频繁的死机现象的故障判断
如果死机现象是从无到有,并且越来越频繁,一般有以下两个原因:使用维护不当,请参见第7步;
微机部件品质不良或性能不稳定,请参见第10步。
5.排除软件安装、配置问题引起的死机现象
①如果是在软件安装过程中死机,则可能是系统某些配置与安装的软件冲突。这些配置包括系统BIOS设置、CONFIG.SYS和AUTOEXEC.BAT的设置、WINDOWS.INI、SYSTEM.INI的设置以及一些硬件驱动程序和内存驻留程序。
可以试着修改上述设置项。对BIOS可以读取其默认设置,如”LOAD SETUP DEFAULT”和”LOAD BIOS DEFAULT”;对CONFIG.SYS和AUTOEXEC.BAT则可以在启动时按F5跳过系统配置文件,或按F8逐步选择执行以及逐项修改CONFIG.SYS和AUTOEXEC.BAT中的配置,尤其是EMM386中关于EMS、XMS的配置情况来判断与安装程序什么地方发生了冲突;一些硬件驱动程序和内存驻留程序则可以通过不装载它们的方法来避免冲突。
②如果是在软件安装后发生了死机,则是安装好的程序与系统发生冲突。一般的做法是恢复系统在安装前的各项配置,然后分析安装程序新装入部分所使用的资源和可能发生的冲突,逐步找出故障原因;删除新安装程序也是解决冲突的方法之一。
③如果是因为病毒或杀毒引起的软件运行死机,请参见第2步。
6.系统启动过程中的死机现象
系统启动过程中的死机现象又有两种情况:
①致命性死机,即系统自检过程未完成就死机,一般系统不给出提示
②非致命性死机,在自检过程中或自检完成后死机,但系统给出声音、文字等提示信息。
对于第一种情况,可以根据开机自检时致命性错误列表中所列的情况,再结合其它方法对故障原因做进一步的分析,如:硬件安装情况(请参见第8步),系统配置(请参见第9步),硬件设备品质(请参见第10步)以及显示器黑屏(请参见第11步)等。
对于第二种情况,可以根据开机自检时非致命性错误代码表和开机自检时鸣笛音对应的错误代码表中所列的情况,对可能出现故障的部件做重点检查,但也不能忽略相关部件的检查,因为相当多的故障并不是由提示信息指出的部件直接引起,而常常由相关部件故障引发。一些关键系统部件(如:CPU、内存条、CACHE、电源、系统后备电池、主板、总线等)的故障也常常以各种相关或不相关部件故障的形式表现出来,因此这些部件的检查也应在考虑范围之内。
7.排除因使用、维护不当引起的死机现象
微机在使用一段时间后会因为使用、维护不当而引起死机,尤其是长时间不使用微机后常会出现此类故障。引起的原因有以下几种:
①积尘导致系统死机
灰尘是微机的大敌。过多的灰尘附着在CPU、芯片、风扇的表面会导致这些元件散热不良;电路印刷板上的灰尘在潮湿的环境中常常导致短路。上述两种情况均会导致死机。
可以用毛刷将灰尘扫去,或用棉签沾无水酒精清洗积尘元件。注意不要将毛刷和棉签的毛、棉留在电路板和元件上,从而成为新的死机故障源。
②部件受潮
长时间不使用微机,会导致部分元件受潮而使用不正常。可用电吹风的低热挡均匀对受潮元件”烘干”。注意不可对元件一部分加热太久或温度太高,避免烤坏元件。
③板卡、芯片引脚氧化导致接触不良,
将板卡、芯片拔出,用橡皮擦轻轻擦拭引脚表面去除氧化物,重新插入插座。
④板卡、外设接口松动导致死机
仔细检查各I/O插槽插接是否正确,各外设接口接触是否良好,线缆连接是否正常。
⑤意外损坏
如:雷击电流通过未经保护的电源及MODEM电话线进入主机,损坏电源、主机板、MODEM及各种内外设备。
意外损坏是否发生、对微机产生了什么破坏性的后果,都只能用交换法、拔插法测试主机各部件的好坏来判断。
8.排除因系统配置不当引起的死机现象
系统配置与微机硬件设备和系统BIOS、主板上跳线开关设置密切相关,常见的死机故障原因有:
①CPU主频设置不当这一类的故障主要有CPU主频跳线开关设置错误、重新打磨过的CPU引起的BIOS设置与实际情况不符、超频使用CPU:
”CPU超频运行引发的故障处理”
”CPU性能不良引起死机的处理”
”CPU芯片与主板及显示卡不兼容造成的故障”
②内存条参数设置不当
这一类的故障主要有内存条设置错误和Remark内存条引起的BIOS设置与实际情况不符,请参见以下的故障实例:
”内存条速度不匹配引起的死机”
”CMOS设置与内存条实际情况不符引起的死机”
”内存参数设置不当引起的GP错误的处理”
③CACHE参数设置不当
这一类的故障主要有CACHE设置错误、重新打磨过的CACHE引起的BIOS设置与实际情况不符。
④CMOS参数被破坏
由于频繁修改CMOS参数,或病毒对CMOS参数的破坏,常常导致CMOS参数混乱而很难恢复。可以采用对CMOS放电的方法并采用系统BIOS默认设置值重新设定CMOS参数。CMOS的放电方法可参照主板说明书进行。重设CMOS参数后,还必须对硬盘杀毒。
9.排除因硬件安装不当引起的死机现象
硬件外设安装过程中的疏忽常常导致莫名其妙的死机,而且这一现象往往在微机使用一段时间后才逐步显露出来,因而具有一定的迷惑性。
①部件安装不到位、插接松动、连线不正确引起的死机
显示卡与I/O插槽接触不良常常引起显示方面的死机故障,如”黑屏”;内存条、CACHE与插槽插接松动则常常引起程序运行中死机,甚至系统不能启动;其它板卡与插槽(插座)的接触问题也常常引起各种死机现象。
要排除这些故障,只需将相应板卡、芯片用手摁紧,或从插槽(插座)上拔下从新安装。如果有空闲插槽(插座),也可将该部件换一个插槽(插座)安装以解决接触问题。
线缆连接不正确有时也会引发死机故障。
②安装不当导致部件变形、损坏引起的死机
口径不正确、长度不恰当的螺钉常常导致部件安装孔损坏、螺钉接触到部件内部电路引起短路导致死机;不规格的主板、零部件或不规范的安装步骤常常引起机箱、主板、板卡外形上的变异因而挤压该部件内部元件导致局部短路、内部元件损坏导致莫名其妙的死机。
如果只是微机部件外观变形,可以通过正确的安装方法和更换符合规格的零部件来解决;如果已经导致内部元件损坏,则只能更换新的零部件了。
10.排除因硬件品质不良引起的死机现象
一般说来,微机产品都是国际大厂商按照国际标准流水线生产出来的,部件不良率是很低的。但是计算机产品高利润的诱惑使许多非法厂商对微机标准零部件改头换面、进行改频、重新标记(Remark)、以次充好甚至将废品、次品当作正品出售,导致这些”超水平”发挥的产品性能不稳定,环境略有不适或使用时间稍长就会频繁发生故障,尤其是CPU、内存条、CACHE、主板等核心部件及其相关产品的品质不良,是导致无原因死机的主要故障源。
检查时应着重检查以下部件:
①CPU
CPU是被假冒得最多也是极容易导致死机的部件。被重新打磨过的CPU在低温、短时间使用时一切正常,但只要在连续高温的环境中长时间使用其死机弊端就很容易暴露。使用Windows、3DS等对CPU特性要求较高的软件比DOS等简单软件更能发现CPU的问题。
参照说明书将CPU主频跳低1到2个档次使用,如:将166MHz降为150MHz、133MHz或120MHz使用。如果死机现象大幅度减少或消失,就可以判断是CPU有问题。也可以用交换法,更换同型号的正常CPU如果不再死机一般可以断定是CPU的问题。
有些用户喜欢把CPU超频使用以获得高速的性能,这也是常导致计算机死机的原因。将CPU跳回原频率就能解决死机问题。
②内存条
内存条常常被做的手脚有:速度标记被更改,如:70ns被重新打磨为60ns;非奇偶校验冒充奇偶校验内存;非EDO内存冒充EDO内存;劣质内存条冒充好内存条。
在BIOS中将内存条读写时间适当增加(如:从60ns升为70ns),如果死机消失可以断定是内存条速度问题。
如果是内存本身的质量问题,只有通过更换新的内存条才能解决。
③CACHE
CACHE也存在以次充好问题。另外,CACHE本身的损坏也导致严重的死机。
在系统BIOS设置中的关闭外部CACHE选项,如果死机消失,则必是CACHE问题。
④CMOS芯片损坏
CMOS芯片一般不容易损坏,但一旦有物理损坏则必然引起死机,其中以黑屏不能启动为主。由于CMOS芯片目前都已集成到超大规模集成电路的芯片组中,所以,更换CMOS芯片往往要连主板一起更换。
⑤主板
一般主板的故障常常是最先考虑然而却是要到最后才能确定的。除了印刷板上的飞线、断线和主板上元件被烧焦、主板受挤压变形、主板与机箱短路等明显的现象外,主板本身的故障只有在确认了主板上所有零部件正常(将你的板卡、CPU、内存条等配件拿到好的主板上使用正常,而别人使用正常的板卡、器件插到你的主板上就不能正常运行)时才能判断是否是主板故障。
如果更换了好的同型号主板死机依然存在,则可能是该主板与某个零部件不兼容。要么更换兼容的其它型号的主板,要么只能用拔插法依次测试各板卡、芯片,找出不兼容的零部件更换之。
⑥电源、风扇、机箱等
劣质电源、电源线缆故障、电源插接松动、电源电压不稳都是引起不明原因死机的罪魁祸首。CPU风扇、电源风扇转动不正常、风扇功率不足则会引起CPU和机箱内”产热大户”元件散热不良因而引起死机。
11. 系统黑屏故障的排除
系统死机故障的很大一部分现象表现为黑屏(即显示器屏幕上无任何显示),这类故障与显示器、显示卡关系很密切,同时系统主板、CPU、CACHE、内存条、电源等部件的故障也能导致黑屏。
系统黑屏的死机故障的一般检查方法如下:
①排除”假”黑屏
检查显示器电源插头是否插好,电源开关是否已打开,显示器与主机上显示卡的数据连线是否连接好、连接插头是否松动,看是否是因为这些因素引起的黑屏。
另外,应该动一下鼠标或按一下键盘看屏幕是否恢复正常。因为黑屏也可能是因为设置了节能模式(可在BIOS设置中查看和修改)而出现的假死机。
②在黑屏的同时系统其它部分是否工作正常,如:启动时软/硬盘驱动器自检是否通过,键盘按键是否有反应等。可以通过交换法用一台好的显示器接在主机上测试,如果只是显示器黑屏而其它部分正常,则只是显示器出了问题,这仍是一种假死机现象。
③黑屏发生在系统开机自检期间,请参见第6步。
④黑屏发生在显示驱动程序安装或显示模式设置期间,显然是选择了显示系统不能支持的模式,应选择一种较基本的显示方式。如:Windows下设置显示模式后黑屏或花屏,则应在DOS下运行Windows目录下的SETUP.EXE程序选择标准VGA显示方式。
⑤检查显示卡与主板I/O插槽接触是否正常、可靠,必要时可以换一个I/O槽插入显示卡试试。
⑥换一块已确认性能良好的同型号显示卡插入主机重新启动,若黑屏死机现象消除则是显示卡的问题。
⑦换一块已确认性能良好的其它型号显示卡插入主机重新启动,若黑屏死机现象消除则是显示卡与主板不兼容,可以考虑更换显示卡或主板。
⑧检查是否错误设置了系统的核心部件,如CPU的频率、内存条的读写时间、CACHE的刷新方式、主板的总线速率等,这些都可能导致黑屏的死机现象。
⑨检查主机内部各部件连线是否正确,有一些特殊的连线错误会导致黑屏死机。
引自 网馨源码
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我有一个。。。也是作业题...用来给应用程序读写IO端口的。。。
你自己拿去编译吧...(留下邮箱阿,给你发源文件,贴出来的可能会出问题)
应用程序和驱动模块都在...
空间里面有模块的代码和应用程序,满足你的要求。
http://hi.baidu.com/handsoul/blog/item/52321c569175f840564e00ea.html
加载驱动之后,执行应用程序,此时在串口的4、7引脚上接个LED(你找个有串口的机器测试,引脚搭上就能看到),可以看到LED的闪烁。。。
说明:
apps_serial.c是控制串口的应用程序,LDE接到4和7脚,就可以看到闪烁现象
cioport.c是驱动程序,编译和安装方法如下:
1.编译。
make
编译完成之后,会生成一个cioport.ko(不同的机器上,必须重新编译,内核模块对版本的依赖强)
2.安装内核模块,必须有root权限
su root
insmod cioport.ko
mknod /dev/test_device c 1000 0
3.测试
gcc apps_serial.c test1
执行必须有root权限
./test1
此时将LED的引脚接到9针串口的4和7针,可以观察到LDE的闪烁
下面是Makefile,你保存成文件名:Makefile
obj-m:=cioport.o
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
下面是应用程序:#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/ioctl.h>//使用下面的宏
#define DEVICE_NAME "/dev/test_device"
#define TEST_MAGIC_NUM 'k'
#define PORT_SET _IOW(TEST_MAGIC_NUM,1,int)
#define PORT_GET _IO(TEST_MAGIC_NUM,2)
#define PORT_LOCK _IO(TEST_MAGIC_NUM,3)
int main(void)
{
char buf[64];
int retcode=0;
int fd=open(DEVICE_NAME,O_RDWR);
if(fd < 0)
{
perror("open device");
exit(fd);
}
char sec=0,min=0,hou=0;
int i=0;
int port=0;
for(i=0;i<30;i++)
{
ioctl(fd, PORT_SET,0x3fc);
buf[0]=1;//DTR=0;RTS=1;
write(fd,(void *)buf,1);
sleep(1);
buf[0]=2;//DTR=1;RTS=0;
write(fd,(void *)buf,1);
sleep(1);
}
close(retcode);
return 0;
}
下面是驱动程序,保存成cioport.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <linux/moduleparam.h>
#include <linux/proc_fs.h>
#include <asm/io.h>
#include <linux/wait.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/ioctl.h>
//ioctl的命令字定义
#define TEST_MAGIC_NUM 'k'
#define PORT_SET _IOW(TEST_MAGIC_NUM,1,int)
#define PORT_GET _IO(TEST_MAGIC_NUM,2)
#define PORT_LOCK _IO(TEST_MAGIC_NUM,3)
#define PORT_UNLOCK _IO(TEST_MAGIC_NUM,4)
#define MAXBUF 512 //自定义数据区大小为512
#define DEVICE_NAME "/dev/test_device"
#define DEVICE_SCCUESS 0
#define PORT_LOCKED -2
//全局变量尽量采用static变量,避免“污染”内核的变量的命名空间
static int major_number = 1000;
static int minor_number = 0;
static int port_number = 0x70;
module_param(major_number , int , S_IRUGO);
module_param(minor_number , int , S_IRUGO);
//module_param(port_number , long , S_IRUGO);
static dev_t device_number; //设备号
static struct cdev *my_cdev=NULL;
static void *pdev=NULL; //自定义区域,open的时候分配一片区域
//内核信号量,等待队列,用于实现读写的同步
static struct semaphore g_sem;
//static unsigned buf_flag=0;
static unsigned int port_flag = 0;
static DECLARE_WAIT_QUEUE_HEAD(g_queue);
//打开和读写操作,读写操作将实现阻塞I/O,为防止读写冲突,设备只允许一个进程的一个操作
int test_open(struct inode * inode ,struct file *filp)
{
printk("device open OK,process name %s,process ID %i\n",current->comm,current->pid);
return DEVICE_SCCUESS;
}
int test_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
int i=0;
printk("operation: read device");
if(down_interruptible(&g_sem))//获得锁
{
printk(KERN_WARNING "Get semaphore error\n");
return -1;
}
while(port_flag)//端口被占用,等待
{
up(&g_sem);
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
if(wait_event_interruptible(g_queue,0 == port_flag))
return -ERESTARTSYS;//可能是信号使得进程被唤醒
if(down_interruptible(&g_sem))
return -ERESTARTSYS;
}
//此时已经获得锁,且操作可以执行
//做标记,不允许修改端口
port_flag=1;
for(i=0;i<count;i++)
((char*)pdev)[i]=inb(port_number);
port_flag=0;//不再占用端口
up(&g_sem);//释放信号量
wake_up_interruptible(&g_queue);//唤醒等待队列中的进程
i=copy_to_user((void*)buf,pdev,count);//读出的数据拷贝给应用程序
if(i<0)
{
printk( KERN_WARNING "copy to user error\n");
return -EFAULT;
}
return count-i;
}
long test_ioctl(struct file *filp,unsigned int cmd, unsigned long arg)
{
int retval=0;
printk("in test_ioctl\n");
switch(cmd)
{
case PORT_SET:
if(port_flag )
{
retval = PORT_LOCKED;
break;
}
else //没有其他进程在IO
{
port_number=arg;
retval = DEVICE_SCCUESS;
printk("port number changed\n");
break;
}
case PORT_GET:
retval = port_number;
printk("port number returned\n");
break;
default: break;
}
return retval;
}
int test_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
int i=0,j=0;
printk("operation: write device\n");
i=_copy_from_user(pdev,(void*)buf,count);//数据拷贝过来并,并将指定端口
if(i<0)
{
printk( KERN_WARNING "copy to user error\n");
return -EFAULT;
}
if(down_interruptible(&g_sem))//获得锁
{
printk(KERN_WARNING "Get semaphore error\n");
return -1;
}
while(port_flag)//操作无法执行,等待
{
up(&g_sem);
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
if(wait_event_interruptible(g_queue,0 == port_flag))
return -ERESTARTSYS;//可能是信号使得进程被唤醒
if(down_interruptible(&g_sem))
return -ERESTARTSYS;
}
//此时已经获得锁,且操作可以执行
port_flag=1;
for(j=0;j<count-i;j++)
outb(((char*)pdev)[j],port_number);
port_flag=0;
up(&g_sem);
wake_up_interruptible(&g_queue);
return (count-i);
}
//用户空间进程设备关闭时执行,也就是对应的close操作
int test_release(struct inode *inode, struct file* filp)
{
return 0;
}
static struct file_operations test_ops = {
.owner = THIS_MODULE,
.read = test_read,
.write = test_write,
.release = test_release,
.open = test_open,
.unlocked_ioctl=test_ioctl,
};
int test_init(void) //内核装载时执行,注册设备和分配自由存储区
{
int err=0;
//分配一块缓冲区
pdev = kmalloc(MAXBUF,GFP_KERNEL);
if(NULL == pdev)
{
printk(KERN_WARNING "kernel cannot mallocate memory\n");
return -1;
}
//注册设备
device_number = MKDEV(major_number,minor_number);
err = register_chrdev_region(device_number,1,DEVICE_NAME);
if( 0 > err)
{
printk( KERN_WARNING "cannot register device ,major %d,minor %d\n",major_number,minor_number);
kfree(pdev);//先撤销之前的动作
return err;
}
//分配一个cdev
my_cdev = cdev_alloc();
if(NULL == my_cdev)
{
printk(KERN_WARNING "cannot allocate cdev structure\n");
kfree(pdev);
unregister_chrdev_region(device_number,1);
return -1;
}
//添加设备
my_cdev->ops= &test_ops;
my_cdev->owner = THIS_MODULE;
err=cdev_add(my_cdev,device_number,1);//添加一个设备
if(0 > err)
{
printk(KERN_WARNING"cannot add the device\n");
kfree(pdev);
unregister_chrdev_region(device_number,1);
cdev_del(my_cdev);
return err;
}
//初始化信号量,等待队列已经初始化
sema_init(&g_sem,1);
//设置标志
//buf_flag=0;
port_flag=0;
printk("init io driver OK\n");
return DEVICE_SCCUESS;
}
void test_exit(void) //内核卸载时候执行,注销设备和释放自由存储区
{
printk("remove the test module\n");
unregister_chrdev_region(device_number,1);
cdev_del(my_cdev);
kfree(pdev);
printk(" common io driver unload\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
你自己拿去编译吧...(留下邮箱阿,给你发源文件,贴出来的可能会出问题)
应用程序和驱动模块都在...
空间里面有模块的代码和应用程序,满足你的要求。
http://hi.baidu.com/handsoul/blog/item/52321c569175f840564e00ea.html
加载驱动之后,执行应用程序,此时在串口的4、7引脚上接个LED(你找个有串口的机器测试,引脚搭上就能看到),可以看到LED的闪烁。。。
说明:
apps_serial.c是控制串口的应用程序,LDE接到4和7脚,就可以看到闪烁现象
cioport.c是驱动程序,编译和安装方法如下:
1.编译。
make
编译完成之后,会生成一个cioport.ko(不同的机器上,必须重新编译,内核模块对版本的依赖强)
2.安装内核模块,必须有root权限
su root
insmod cioport.ko
mknod /dev/test_device c 1000 0
3.测试
gcc apps_serial.c test1
执行必须有root权限
./test1
此时将LED的引脚接到9针串口的4和7针,可以观察到LDE的闪烁
下面是Makefile,你保存成文件名:Makefile
obj-m:=cioport.o
KERNELDIR ?=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
下面是应用程序:#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/ioctl.h>//使用下面的宏
#define DEVICE_NAME "/dev/test_device"
#define TEST_MAGIC_NUM 'k'
#define PORT_SET _IOW(TEST_MAGIC_NUM,1,int)
#define PORT_GET _IO(TEST_MAGIC_NUM,2)
#define PORT_LOCK _IO(TEST_MAGIC_NUM,3)
int main(void)
{
char buf[64];
int retcode=0;
int fd=open(DEVICE_NAME,O_RDWR);
if(fd < 0)
{
perror("open device");
exit(fd);
}
char sec=0,min=0,hou=0;
int i=0;
int port=0;
for(i=0;i<30;i++)
{
ioctl(fd, PORT_SET,0x3fc);
buf[0]=1;//DTR=0;RTS=1;
write(fd,(void *)buf,1);
sleep(1);
buf[0]=2;//DTR=1;RTS=0;
write(fd,(void *)buf,1);
sleep(1);
}
close(retcode);
return 0;
}
下面是驱动程序,保存成cioport.c:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <linux/moduleparam.h>
#include <linux/proc_fs.h>
#include <asm/io.h>
#include <linux/wait.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/ioctl.h>
//ioctl的命令字定义
#define TEST_MAGIC_NUM 'k'
#define PORT_SET _IOW(TEST_MAGIC_NUM,1,int)
#define PORT_GET _IO(TEST_MAGIC_NUM,2)
#define PORT_LOCK _IO(TEST_MAGIC_NUM,3)
#define PORT_UNLOCK _IO(TEST_MAGIC_NUM,4)
#define MAXBUF 512 //自定义数据区大小为512
#define DEVICE_NAME "/dev/test_device"
#define DEVICE_SCCUESS 0
#define PORT_LOCKED -2
//全局变量尽量采用static变量,避免“污染”内核的变量的命名空间
static int major_number = 1000;
static int minor_number = 0;
static int port_number = 0x70;
module_param(major_number , int , S_IRUGO);
module_param(minor_number , int , S_IRUGO);
//module_param(port_number , long , S_IRUGO);
static dev_t device_number; //设备号
static struct cdev *my_cdev=NULL;
static void *pdev=NULL; //自定义区域,open的时候分配一片区域
//内核信号量,等待队列,用于实现读写的同步
static struct semaphore g_sem;
//static unsigned buf_flag=0;
static unsigned int port_flag = 0;
static DECLARE_WAIT_QUEUE_HEAD(g_queue);
//打开和读写操作,读写操作将实现阻塞I/O,为防止读写冲突,设备只允许一个进程的一个操作
int test_open(struct inode * inode ,struct file *filp)
{
printk("device open OK,process name %s,process ID %i\n",current->comm,current->pid);
return DEVICE_SCCUESS;
}
int test_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
int i=0;
printk("operation: read device");
if(down_interruptible(&g_sem))//获得锁
{
printk(KERN_WARNING "Get semaphore error\n");
return -1;
}
while(port_flag)//端口被占用,等待
{
up(&g_sem);
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
if(wait_event_interruptible(g_queue,0 == port_flag))
return -ERESTARTSYS;//可能是信号使得进程被唤醒
if(down_interruptible(&g_sem))
return -ERESTARTSYS;
}
//此时已经获得锁,且操作可以执行
//做标记,不允许修改端口
port_flag=1;
for(i=0;i<count;i++)
((char*)pdev)[i]=inb(port_number);
port_flag=0;//不再占用端口
up(&g_sem);//释放信号量
wake_up_interruptible(&g_queue);//唤醒等待队列中的进程
i=copy_to_user((void*)buf,pdev,count);//读出的数据拷贝给应用程序
if(i<0)
{
printk( KERN_WARNING "copy to user error\n");
return -EFAULT;
}
return count-i;
}
long test_ioctl(struct file *filp,unsigned int cmd, unsigned long arg)
{
int retval=0;
printk("in test_ioctl\n");
switch(cmd)
{
case PORT_SET:
if(port_flag )
{
retval = PORT_LOCKED;
break;
}
else //没有其他进程在IO
{
port_number=arg;
retval = DEVICE_SCCUESS;
printk("port number changed\n");
break;
}
case PORT_GET:
retval = port_number;
printk("port number returned\n");
break;
default: break;
}
return retval;
}
int test_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
int i=0,j=0;
printk("operation: write device\n");
i=_copy_from_user(pdev,(void*)buf,count);//数据拷贝过来并,并将指定端口
if(i<0)
{
printk( KERN_WARNING "copy to user error\n");
return -EFAULT;
}
if(down_interruptible(&g_sem))//获得锁
{
printk(KERN_WARNING "Get semaphore error\n");
return -1;
}
while(port_flag)//操作无法执行,等待
{
up(&g_sem);
if(filp->f_flags & O_NONBLOCK)
return -EAGAIN;
if(wait_event_interruptible(g_queue,0 == port_flag))
return -ERESTARTSYS;//可能是信号使得进程被唤醒
if(down_interruptible(&g_sem))
return -ERESTARTSYS;
}
//此时已经获得锁,且操作可以执行
port_flag=1;
for(j=0;j<count-i;j++)
outb(((char*)pdev)[j],port_number);
port_flag=0;
up(&g_sem);
wake_up_interruptible(&g_queue);
return (count-i);
}
//用户空间进程设备关闭时执行,也就是对应的close操作
int test_release(struct inode *inode, struct file* filp)
{
return 0;
}
static struct file_operations test_ops = {
.owner = THIS_MODULE,
.read = test_read,
.write = test_write,
.release = test_release,
.open = test_open,
.unlocked_ioctl=test_ioctl,
};
int test_init(void) //内核装载时执行,注册设备和分配自由存储区
{
int err=0;
//分配一块缓冲区
pdev = kmalloc(MAXBUF,GFP_KERNEL);
if(NULL == pdev)
{
printk(KERN_WARNING "kernel cannot mallocate memory\n");
return -1;
}
//注册设备
device_number = MKDEV(major_number,minor_number);
err = register_chrdev_region(device_number,1,DEVICE_NAME);
if( 0 > err)
{
printk( KERN_WARNING "cannot register device ,major %d,minor %d\n",major_number,minor_number);
kfree(pdev);//先撤销之前的动作
return err;
}
//分配一个cdev
my_cdev = cdev_alloc();
if(NULL == my_cdev)
{
printk(KERN_WARNING "cannot allocate cdev structure\n");
kfree(pdev);
unregister_chrdev_region(device_number,1);
return -1;
}
//添加设备
my_cdev->ops= &test_ops;
my_cdev->owner = THIS_MODULE;
err=cdev_add(my_cdev,device_number,1);//添加一个设备
if(0 > err)
{
printk(KERN_WARNING"cannot add the device\n");
kfree(pdev);
unregister_chrdev_region(device_number,1);
cdev_del(my_cdev);
return err;
}
//初始化信号量,等待队列已经初始化
sema_init(&g_sem,1);
//设置标志
//buf_flag=0;
port_flag=0;
printk("init io driver OK\n");
return DEVICE_SCCUESS;
}
void test_exit(void) //内核卸载时候执行,注销设备和释放自由存储区
{
printk("remove the test module\n");
unregister_chrdev_region(device_number,1);
cdev_del(my_cdev);
kfree(pdev);
printk(" common io driver unload\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
更多追问追答
追问
谢谢啊,这个貌似是字符驱动啊??加QQ聊吧。172683721.
追答
额..没看清题..给整成介个了..
块设备驱动....块设备..设备....备.....
临时写来不及了,下面这个链接里面包含了不少你要的...代码应该是拿过来就可以直接编译的。。。。。博主还有不少相关的文章,代码看样子是08年的,内核版本跟现在不太一样了,内核代码不晓得能不能直接编译了。。。
http://hi.baidu.com/jjbear_ustc/blog/category/%D0%B4%D2%BB%B8%F6%BF%E9%C9%E8%B1%B8%C7%FD%B6%AF
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询