翻译文献-新的特殊文件能够用mknod系统调用创建_第1页
翻译文献-新的特殊文件能够用mknod系统调用创建_第2页
翻译文献-新的特殊文件能够用mknod系统调用创建_第3页
翻译文献-新的特殊文件能够用mknod系统调用创建_第4页
翻译文献-新的特殊文件能够用mknod系统调用创建_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

外文原文NEWSPECIALFILESARECREATEDWITHTHEMKNODSYSTEMCALL,WHICHCANBEINVOKEDBYTHEUTILITYOFTHESAMENAMETHESYNTAXFORMKNODISMKNODNAMETYPEMAJORMINORSOTOCREATETHEABOVELP0ENTRY,YOUWOULDHAVETOBEROOTANDTYPEMKNOD/DEV/LP0C60YOUCANCREATETHEMANYWHERE,ASLONGASTHEHOSTINGFILESYSTEMSSUPPORTITMOSTOFTHEARGUMENTSARESELFEXPLANATORY,SOWEWILLJUSTMENTIONTHATTYPECORRESPONDSTOTHECLASSOFTHEDEVICEBFORBLOCKDEVICESANDCFORCHARACTERDEVICESMOREINFORMATIONCANBEFOUNDINTHEMANPAGEFORMKNODUSERANDKERNELSPACETHEFIRSTTHINGTOCOMETOGRIPSWITHISTHEDIFFERENCEBETWEENPROGRAMMINGDEVICEDRIVERSANDWRITINGNORMALUSERSPACEAPPLICATIONSLINUXOPERATESINTWOMODES,USERMODEANDSUPERVISORMODEWEWILLCALLTHELATTERKERNELMODEFROMKNOWON,SINCETHISISTHEDESCRIPTIVEEXPLANATIONOFWHATISREALLYGOINGONTHISREFLECTSACHANGEINTHEWAYTHEPROCESSORACTUALLYHANDLESINSTRUCTIONSITSUPPORTSTHESETWOEXECUTIONMODESINTERNALLYINTELSX86X3NAMESITSEXECUTIONMODESRING0,1,2,AND3,WITHRING0BEINGTHEMOSTPRIVILEGEDMODEANDVICEVERSAINLINUX,RING0SIGNIFIESKERNELMODEEXECUTIONANDRING3USERMODETHEOTHERMODESAREUNUSEDOTHERARCHITECTURESHAVESIMILARFEATURES,BUTNAMETHEIREXECUTIONMODESDIFFERENTLYWEWONTBOREYOUWITHTHETEDIOUSHARDWAREDETAILS,BUTTHEGISTOFITISTHATTHEMODEAPROCESSOPERATESINPLACESCERTAINRESTRICTIONSONWHATITISALLOWEDTODOPROCESSESRUNNINGINUSERSPACEARE,AMONGOTHERTHINGS,NOTALLOWEDTODIRECTLYACCESSHARDWAREANDEXECUTECERTAININSTRUCTIONSWHENYOUAREWRITINGANORDINARYPROGRAMYOUUSECERTAINFUNCTIONSTHATYOUTAKEFORGRANTED,SUCHASPRINTFANDSTRCPYTHESEAREPARTOFTHESTANDARDCLIBRARY,LIBC,ANDHAVEDEFINEDPROTOTYPESINAPPROPRIATEHEADERFILESUSERSPACEAPPLICATIONSAREUSUALLYLINKEDAGAINSTLIBCANDTHESESYMBOLSARERESOLVEDATRUNTIMEKERNELMODULES,ONTHEOTHERHAND,ARELINKEDAGAINSTTHEKERNELANDARETHEREFORERESTRICTEDTOUSINGTHEFUNCTIONSTHATITEXPORTSADEVICEDRIVERBUILTASAKERNELMODULEISNOTRUNINTHEORDINARYSENSEANDSOMODULESYMBOLSARERESOLVEDWHENYOUATTEMPTTOLOADTHEMODULEINTOTHEKERNELTHEREARESEVERALISSUESCONCERNINGGOODPRACTICEWHENWRITINGKERNELLEVELCODETHATYOUSHOULDBEAWAREOFBELOWARESOMEOFTHERULESTOLIVEBYSOMEAREBLACKANDWHITEWHILEOTHERSLEAVEROOMFORINTERPRETATIONDONTUSEFLOATINGPOINTARITHMETICTHEKERNELDOESNOTSAVETHEPROCESSORSFPSTATESWHENSWITCHINGMODESSOIFYOUDOYOUHAVETOSAVETHESTATEYOURSELFTHEREISUSUALLYNOGOODREASONTODOSODONTBUSYWAITINYOURDRIVERAUSERSPACEAPPLICATIONCANNEVERCOMPLETELYMONOPOLIZETHECPU,BUTALOOPSPINNINGFORASECONDINSIDETHEKERNELWILLAPPEARTOHANGTHESYSTEMDURINGTHATTIMEANDPREVENTANYREALWORKFROMBEINGDONEDONTTRYTOBETOOCLEVERDEBUGGING,ASWEWILLSEELATER,ISMUCHHARDERINKERNELSPACEANDDRIVERSOFTENNEEDPRECISETIMINGWHENDEALINGWITHHARDWAREEVENADDINGAPRINTSTATEMENTMIGHTMESSUPTHETIMINGANDHIDEANOBSCUREBUGKEEPTHECODEASCLEANANDCOMPREHENSIBLEASPOSSIBLEWHATGOESWHEREYOUWILLALSONEEDTODECIDEWHATTOIMPLEMENTASAMODULEANDWHATTOKEEPINUSERSPACETHEGENERALCONSENSUSISTHATIFYOUCANCODEITINUSERSPACE,DONTDOITINKERNELSPACETHEREARESEVERALREASONSWHYTHISISEXCELLENTADVICEMISTAKESHAPPEN,BUTANERRORINUSERSPACEDUMPSCOREWHILETHEKERNELMIGHTHANGCOMPLETELYBLOATINGTHEKERNELSPACEWITHUNNECESSARYCODEISNOTGOODPRACTICE,EITHERPROVIDINGTHENECESSARYHOOKSINAKERNELMODULEFORANAPPLICATIONTOUSEWILLOFTENYIELDTHEBESTRESULTWHENSPEEDORTIMINGISNOTTOOESSENTIALANDCRITICALITWILLALSOGIVEYOUTHEADVANTAGEOFHAVINGTHESTANDARDUSERSPACELIBRARIESAVAILABLETOLINKWITHBUILDINGMODULESCOMPILINGAKERNELMODULEISNOMOREDIFFICULTTHANWHATYOUAREUSEDTOWITHORDINARYAPPLICATIONSTHEEXAMPLESTHATACCOMPANYTHISBOOKAREALLSUPPLIEDWITHMAKEFILESFORYOUTOINSPECTTHEBASICPROCEDUREFORCOMPILINGAKERNELMODULEISSOMETHINGINTHEORDEROFGCCD_KERNEL_D_SMP_DMODULEDMODVERSIONSI/USR/SRC/LINUX/INCLUDEWALLO2OMODULEOCMODULECIFYOUHAVENEVERPAIDMUCHATTENTIONTOAKERNELBUILDTHISMAYLOOKATBITOVERWHELMINGMOSTOFTHEABOVEDEFINESCANBEHANDLEDDIRECTLYFROMWITHINTHEMODULEBYREADINGTHESETTINGSFROMTHEKERNELLETSLOOKATWHATEACHOFTHEMDOES_KERNEL_NOTALLKERNELHEADERFILESAREONLYUSEDBYTHEKERNELITSELFSOMEUSERSPACEAPPLICATIONSINCLUDETHEM,BUTPARTSOFTHEMAREKERNELSPECIFICANDTHUSNEEDTOBEHIDDENFROMUSERSPACECODETHATWILLBEINSERTEDINTOTHEKERNELHASTODEFINE_KERNEL_TOSEETHEWHOLETHING_SMP_THEKERNELCANBECOMPILEDFOREITHERSMPSYMMETRICMULTIPROCESSOR,SYSTEMSHAVINGMORETHANONECPUORUPUNIPROCESSORMACHINESAMODULETHATWILLBEINSERTEDINANSMPKERNELMUSTDEFINE_SMP_MODULEMUSTBEDEFINEDFORCODETHATISCOMPILEDASAKERNELMODULEMODVERSIONSASAFEGUARDAGAINSTKERNELANDMODULEINCOMPATIBILITIESAMORECOMPREHENSIVEEXPLANATIONFOLLOWSBELOWTHERESTOFTHEGCCCOMMANDLINEOPTIONSARENOTKERNELSPECIFICANDYOUHAVEPROBABLYSEENTHEMUSEDBEFORETHEOSWITCHTELLSGCCHOWMUCHOPTIMIZATIONTOPERFORMATCOMPILETIMEKERNELMODULESMUSTBECOMPILEDWITHANOPTIMIZATIONLEVELOFO2ORHIGHERTOUSEFUNCTIONSTHATAREINLINEDBYTHEKERNEL,SUCHASOUTBLEVELSHIGHERTHANO2MAYWORK,BUTWEDONTRECOMMENDTHEMALLWARNINGSARETURNEDON,ASTHISISGOODPRACTICEFORANYKINDOFPROGRAM,NOTJUSTKERNELMODULES/USR/SRC/LINUXISTHEPREFERREDPLACETOKEEPYOURLINUXKERNELTREE,BUTITISNOTAREQUIREMENTANDYOUCANSTOREITANYWHEREYOUWANTTHEIINCLUDEPATHOPTIONGIVENTOGCCABOVETELLSITTOINCLUDETHISPATHWHENSEARCHINGFORINCLUDESHEADERFILESTHATARESPECIFICTOTHEKERNELARELOCATEDINTHEINCLUDE/DIRECTORYOFTHEKERNELTREE,SOWHENWEWRITEINCLUDEWEAREINCLUDINGTHEFILE/USR/SRC/LINUX/INCLUDE/LINUX/MODULEHTHEREARETWODIRECTORIESOFIMPORTANCEINSIDETHEINCLUDE/DIRECTORY,ONEOFTHEMBEINGLINUX/ANDTHEOTHERASM/THEFORMERCONTAINSPLATFORMINDEPENDENTFILES,WHILETHELATTERISASYMBOLICLINKTOASMARCH/WHEREARCHISI386ORALPHA,FOREXAMPLETHISLINKISCREATEDWHENCONFIGURINGANDBUILDINGTHEKERNELANDSYMBOLICLINKSTOBOTHINCLUDEDIRECTORIESAREMADETO/USR/INCLUDE/LINUXAND/USR/INCLUDE/ASM,CORRESPONDINGLYTHEMODVERSIONSDEFINEISUSEDONKERNELSRUNNINGWITHFUNCTIONVERSIONINGTHISISAMEASUREUSEDTOPREVENTMODULESFROMBEINGLOADEDINTOANINCOMPATIBLEKERNEL,WHICHCOULDEITHERCAUSEMALFUNCTIONINGORKERNELCRASHESINTHEWORSTCASESWHENMODULESARECOMPILED,THEYAREBUILTAGAINSTTHECURRENTKERNELVERSIONYOUARERUNNINGATTHETIMEANDCANUSUALLYONLYBELOADEDONEXACTLYTHATVERSIONAKERNELRUNNINGWITHVERSIONINGWILLSUFFIXEXPORTEDFUNCTIONSWITHCHECKSUMINFORMATIONBASEDONTHEINTERFACETHATITEXPORTSTHISPROVIDESASECUREWAYOFKNOWINGTHATTHEUNDERLYINGAPIHASNOTCHANGEDSINCETHEMODULEWASBUILDYOUCANCHECKWHETHERYOUARERUNNINGAVERSIONEDKERNELBYINSPECTING/PROC/KSYMS,WHICHCONTAINSTHESYMBOLSEXPORTEDONTHERUNNINGKERNELIFTHEEXPORTEDFUNCTIONSHAVEASUFFIXSIMILARTO_RXXXXXX,VERSIONINGISENABLEDTHISWILLLOOKSOMETHINGLIKECAT/PROC/KSYMSC0115728PRINTK_RSMP_1B7D4074C01D3ED0SPRINTF_RSMP_3C2C5AF5THEACTUALFUNCTIONNAMESOFTHEABOVEAREPRINTKANDSPRINTFTHELISTINGSHOWSTHATWERECURRENTLYRUNNINGANSMPKERNELWITHMODULEVERSIONINGENABLEDTOBEABLETORESOLVETHESENAMES,AMODULEMUSTINCLUDETHELINUX/MODVERSIONSHFILENAMESPACEISANOTHERISSUETHATYOUMAYNOTHAVEPAIDPARTICULARATTENTIONTOBEFORE,UNLESSYOUHAVEWORKEDWITHABIGPROJECTWHENYOUDOKERNELDEVELOPMENT,YOUSHOULDBECAREFULABOUTPOLLUTINGTHEGLOBALKERNELNAMESPACEANEXCELLENTWAYTOAVOIDCLASHES,WHICHISADOPTEDBYTHEVASTMAJORITYOFTHEKERNELDEVELOPERS,ISTOPREFIXEXPORTEDFUNCTIONSWITHTHENAMEOFYOURDRIVERSTILL,ONLYEXPORTINGFUNCTIONSANDVARIABLESTHATAREGOINGTOBEUSEDBYOTHERDRIVERSISTHEBESTPRACTICEANDSHOULDBEUSEDALONGWITHITDECLARINGGLOBALVARIABLESANDFUNCTIONSSTATICACHIEVESTHISBEAUTIFULLY,BUTHASOTHERSIDEEFFECTSOTHERVARIABLESANDFUNCTIONSAREEXPLICITLYEXPORTEDWITHTHEMACROEXPORT_SYMBOL,WHICHADDSTHEMTOTHEKERNELSGLOBALSYMBOLTABLEYOUGENERALLYONLYNEEDTOWORRYABOUTTHISIFYOUPLANONSPLITTINGYOURDRIVERACROSSSEVERALMODULESOROTHERWISEEXPOSEINTERNALSFOROTHERSTOUSEOFCOURSE,KEEPINGGLOBALNAMESPACEPOLLUTIONTOAMINIMUMISALWAYSAGOODIDEATHESYNTAXISSTRAIGHTFORWARDEXPORT_SYMBOLNAMEEXPORTTHEVARIABLEORFUNCTIONNAMEEXPORT_SYMBOL_NOVERSNAMEEXPORTTHEVARIABLEORFUNCTIONNAME,BUTDONTINCLUDEMODULEVERSIONINGEVENIFDEFINEDEXPORT_NO_SYMBOLSDONTEXPORTANYSYMBOLSTHEDECLARATIONSMUSTBEMADEOUTSIDEOFANYFUNCTIONSINANINCLUDEFILE,BOTTOMOFMODULE,ORSIMILARTHEMACROSAREDEFINEDINLINUX/MODULEHIFYOUARECURIOUSEXPORT_SYMTABMUSTBEDEFINEDPRIORTOUSINGANYOFTHESEMACROSDATATYPESLINUXRUNSONALOTOFDIFFERENTARCHITECTURES,SOME32BITANDSOME64BITSOMEEFFORTSHAVEBEENMADETOEVENALLOWLINUXTORUNON16BITHARDWAREANDWHOKNOWSWHATWILLHAPPENINTHEFUTURETHEREFOREITISIMPORTANTNOTTOMAKEASSUMPTIONSABOUTTHESIZEOFAGIVENTYPEOFVARIABLELINUXDEFINESSTANDARDTYPESTHATHAVEAGIVENSIZEONANYPLATFORM_U8,_U64_S8,_S64UNSIGNEDANDSIGNEDVARIABLESBETWEENCHARAND64BITLONGINSIZEIFYOUNEEDASPECIFICALLYSIZEDVARIABLE,USEONEOFTHEABOVETYPESTHEYALSOLOOKMUCHNICERINTHECODEANDMAKEITMOREREADABLEWHENYOUBROWSETHEDRIVERSOURCEACOUPLEOFMONTHSLATERTHEREAREALSOTHESPECIALTYPESTHATAREPASSEDTODRIVERENTRYPOINTS,FOREXAMPLESSIZE_TSCHAR_READ,SIZE_TCOUNT,LOFF_TOFFSETSSIZE_TANDSIZE_TAREEXAMPLESOFTYPESTHATSERVEASPECIFICPURPOSEWITHINTHEKERNELWELLLOOKATEXACTLYWHATPURPOSELATERUSUALLYTHESETYPESAREACTEDUPONDIRECTLYANDYOUTHEREFORENEEDNOTWORRYTOOMUCHABOUTTHEPARTICULARSIZETHEVARIOUSTYPESAREDESCRIBEDINLINUX/TYPESHANDASM/POSIX_TYPESHSOLOOKTHEMUPIFYOUNEEDAHINTASTOWHATSIZETHEYARETYPEDEFEDTOWHENYOUDONEEDTOASSIGNTHEMTOTHECOMPILERSINTEGRALTYPES,REMEMBERTOUSEANAPPROPRIATECASTGCCISQUITEPICKYABOUTSIZEMISMATCHESANDWILLWARNYOUABOUTPOSSIBLEPROBLEMSTRYITOUTAKERNELMODULENOWISANEXCELLENTTIMETODIVEINANDCREATEOURVERYFIRSTMODULEINKEEPINGWITHPASTTRADITION,“HELLO,KERNEL“SEEMSLIKETHETHINGTODODONTWORRY,ITSTHELASTTIMEWELLREVISITTHISBITOFPROGRAMMINGHISTORYINTHISBOOKLETSSTARTOFFWITHTHEFOLLOWINGFILE,HELLOCINCLUDEIFDEFINEDCONFIG_SMPDEFINE_SMP_ENDIFIFDEFINEDCONFIG_MODVERSIONSDEFINEMODVERSIONSINCLUDEENDIFINCLUDEINTINIT_MODULEVOIDPRINTKKERN_DEBUG“HELLO,KERNELN“RETURN0VOIDCLEANUP_MODULEVOIDPRINTKKERN_DEBUG“GOODBYE,KERNELN“THEKERNELEQUIVALENTOFPRINTFISPRINTKTHEYARESIMILARINUSAGE,BUTTHELATTERDOESNOTSUPPORTPRINTINGOFFLOATINGPOINTTHEKERN_DEBUGDEFINEGIVENTOPRINTKSETSTHEPRIORITYOFTHEPRINTEDMESSAGETHEPOSSIBLEVALUESAREDEFINEDBYLINUX/KERNELHASFOLLOWSDEFINEKERN_EMERG“/SYSTEMISUNUSABLE/DEFINEKERN_ALERT“/ACTIONMUSTBETAKENIMMEDIATELY/DEFINEKERN_CRIT“/CRITICALCONDITIONS/DEFINEKERN_ERR“/ERRORCONDITIONS/DEFINEKERN_WARNING“/WARNINGCONDITIONS/DEFINEKERN_NOTICE“/NORMALBUTSIGNIFICANTCONDITION/DEFINEKERN_INFO“/INFORMATIONAL/DEFINEKERN_DEBUG“/DEBUGLEVELMESSAGES/SOWECOULDHAVEWRITTENPRINTK“HELLO,KERNELN“INSTEAD,BUTWETHINKYOUWILLAGREETHATUSINGTHEPREDEFINEDLEVELSMAKESTHECODEEASIERTOREADTHELOGLEVELSETTINGCONTROLSWHATMESSAGESWILLACTUALLYGETPRINTEDONTHECONSOLEAND/ORAPPENDEDTOTHESYSLOGTHISISCONTROLLEDBYSYSLOGDANDCANUSUALLYBESETUPIN/ETC/SYSLOGCONFASITISWRITTENYOUWILLPROBABLYNOTBEABLETOSEETHEMESSAGESDIRECTLYINSTEADTHEYARESTOREDINTHEKERNELBUFFERALLOCATEDFORTHESEKINDSOFMESSAGESTHEPROGRAMDMESGWILLSHOWYOUWHATISCURRENTLYSTOREDINTHERELOTSOFMESSAGESFROMYOURLASTBOOT,MOSTLIKELYAPARTFROMPRINTK,THOUGH,THERESHOULDNTBEANYTHINGTOOUNFAMILIARHEREWELLLOOKATWHATSNEWINAMOMENTFORNOW,LETSCOMPILETHEMODULE,WITHTHISCOMMANDINTHEDIRECTORYWHEREYOUCREATEDTHEHELLOCFILEGCCD_KERNEL_I/USR/SRC/LINUX/INCLUDEDMODULEWALLO2CHELLOCOHELLOO2NOWLETSTRYANDINSERTTHEMODULEINTOTHEKERNELMODULESARELOADEDWITHTHEINSMODINSERTMODULECOMMAND,USUALLYFOUNDIN/SBIN/YOUMUSTBEROOTTOINSERTANDREMOVEAMODULE,ASTHISWOULDOTHERWISEBEASERIOUSSECURITYBREACHIFANYBODYWEREALLOWEDTOMEDDLEWITHTHEKERNELMAKESURETHATYOUAREROOTANDTRYTHEMODULEOUTINSMODHELLOO3NOERRORMESSAGESSOFAR,SOHOWDOWEVERIFYTHATTHEMODULEHASBEENINSERTEDSUCCESSFULLYWECANCHECKTHEVERYENDOFTHEDMESGREADOUTOFTHEKERNELBUFFERWITHTHISCOMMANDDMESG|TAILN1HELLO,KERNELWECANSEETHEMESSAGEFROMOURMODULETHEREINTHEKERNELBUFFERTOPROVETHATTHEMODULEISLOADED,LSMODLISTMODULESCANBERUNITLISTSTHEMODULESTHATARECURRENTLYINSERTEDLSMODMODULESIZEUSEDBYHELLO1760UNUSED4NOTSURPRISINGLY,HELLOISLISTEDWITHTHEOTHERMODULESLSMODALSOLISTSTHESIZEANDUSAGECOUNTOFEACHLOADEDMODULEWEWILLGETINTOUSAGECOUNTSALITTLELATERFORNOW,LETSGETRIDOFTHEHELLOMODULEAGAINTHERMMODREMOVEMODULECOMMANDWILLDETACHAMODULEFROMTHEKERNELRMMODHELLODMESG|TAILN1GOODBYE,KERNELHOWITWORKSACOUPLEOFNEWTHINGSWEREINTRODUCEDHERELINUX/MODULEHINCLUDESANOTHERHEADERFILEAMONGOTHERSCALLEDLINUX/CONFIGHWHICHCONTAINSTHEOPTIONSSELECTEDATTHEKERNELCOMPILETIME,ASDEFINESTHISISESPECIALLYCONVENIENTFORUS,SINCEWECANBESURETHATIFTHEKERNELISCOMPILEDFORSMP,CONFIG_SMPWILLBEDEFINEDANDWECANDEFINE_SMP_APPROPRIATELYTHESAMETHINGGOESFORCONFIG_MODVERSIONSIFTHATISCONFIGUREDWEDEFINEMODVERSIONSANDINCLUDELINUX/MODVERSIONSHTOGAINACCESSTOTHEVERSIONINGINFORMATIONASWESAW,ALITTLEMESSAGEISPRINTEDTOTHEKERNELBUFFERWHENTHEMODULEISLOADEDANDUNLOADEDTHETWOFUNCTIONSWEDEFINEDTOPERFORMTHISARETHEONLYONESTHATAREACTUALLYNEEDEDTOCOMPLETEAMODULEINIT_MODULEISCALLEDATLOADTIMEANDISRESPONSIBLEFORSETTINGUPINTERNALDATASTRUCTURES,INITIALIZETHEHARDWARE,ANDPERFORMANYOTHERTASKSTHATNEEDTOBEDONEBEFORETHEDEVICEISINVOKEDFORTHEFIRSTTIMESINCETHEABOVEISONLYASIMPLEFRAMEWORK,NOREALWORKISDONEMOSTTHINGSWORKBOTHWAYS,ANDSOCLEANUP_MODULETAKESCAREOFSHUTTINGDOWNTHEDEVICEANDRELEASINGANYRESOURCESTHATTHEDEVICEMAYHAVEOCCUPIEDANDTHATSITWEVEBUILTAMODULE,ANDSUCCESSFULLYINSERTEDITINTOTHEKERNELNOWWEVEOVERCOMEOURFEAROFTHELINUXKERNEL,WECANGETONTOSOMETHINGALITTLEMORESUBSTANTIAL中文翻译新的特殊文件能够用MKNOD系统调用创建,同时可以用同样的名字工具被引用。MKNOD使用的语法是MKNODNAMETYPEMAJORMINOR因此要创建LP0条目,你应该具有ROOT身份并输入MKNOD/DEV/LP0C60只要主文件系统支持,你可以在任何地方创建它们。大多数的参数是自我解释的,因此我们需要对相应设备的类型说明一下,例如B代表块设备,C代表字符设备。更多的关于MKNOD的相关信息,我们能在MAN帮助的页面中找到。用户空间和内核空间我们遇到第一个问题是编写设备驱动程序和编写用户空间应用程序的区别。在LINUX下有两种操作模式,用户模式和特权模式。我们从现在起把后一种模式称为内核模式,因为它能够更真实的体现出这种模式中的状态的变化。反应了处理器实际处理操作的变化它对两种模式的支持是在内部完成并转换的。英特尔X86(X3)把它的执行模式命名为RING(环)0、1、2、3,第0环得优先级最高。在LINUX里,第0环代表内核执行模式,第3环代表用户执行模式其余的两环没有使用。其他的体系结构里也有相关类似的的规定,但是在执行模式的命名方式上采用了不同的方法。我们不打算在硬件的细节方面浪费读者太多的精力,只是想告诉读者一个进程所在的操作模式将对允许它所处理的事情加上特定的限制。有一些事是运行在用户空间的进程不允许做的,其中包括直接访问硬件和执行某些指令。当你编写一个普通程序的时候,你会不经意的用到一些函数,例如PRINTF和STRCPY等等。这些函数都是C语言LIBC标准库中的组成部分,在相应的头文件里都有预先好的架构。用户空间应用程序一般都要与LIBC库进行连接,这些符号将在程序运行的时候被解析。但是内核模块就不一样了,它们将与内核进行链接,在使用他们自己向外提供的函数方面是有限制的。一个用内核模块编写出来的设备驱动程序的运行并不是一般意义上的运行,模块中的符号是他在是在它被加载到内核里的时候解析的。在编写内核及代码的时候大家需要遵循一些与此相关的程序设计准则,培养良好的程序设计习惯。下面就是一些这样的准则了有的很简单明了,有的就需要认真的去体会理解。不要使用浮点运算。内核在切换处理器的模式的时候不保存它的FP状态,如果你不得不使用浮点运算,就得自己设置保存它的状态。但是一般的情况下没有什么好的理由需要在内核的代码中使用浮点数。在你编写的驱动程序中不要进行忙等待。用户空间里的一个应用程序永远不可能完全的独占CPU,但是内核里的用时1秒的循环看上去好像是整个系统挂起了很长的时间,并且在这段时间里,它什么其他的工作也不能做。不要自以为是。我们在后面的内容中将要看到,内核空间里的调试工作会遇到很多的困难,而驱动程序在与硬件接触的时候往往需要精确的定时甚至增加一条打印的语句都有可能让定时混乱,从而把一个明显的漏洞掩盖起来。尽可能地保持代码的简洁性和理解性。如何取舍你必须决定哪些功能被实现成模块,哪些功能留在用户控件。一般的原则是只要能在用户空间里编程实现的东西,就绝不放到内核里面去。这是一个理由充分的建议在代码有错误的情况下,用户空间里的错误会输出内存映像,而内核空间里的错误可能会完全挂起。让内核空间里有很多没有用的代码是一个不好的习惯。如果执行速度和操作定时方面没有那么严格要求和关键,在内核模块里准备一些供应用程序使用的调用入口会达到很好的效果;并且这样做还可以让你继续享受有用户空间标准库函数可以链接的好处。建立模块对内核模块进行编译并不比你习惯的普通的应用程序进行编译困难。本书中的例子里都附带有MAKEFILE供读者阅读。对内核模块进行编译的基本过程如下所示GCCD_KERNEL_D_SMP_DMODULEDMODVERSIONSI/USR/SRC/LINUX/INCLUDEWALLO2OMODULEOCMODULEC如果你从没有注意过内核的建立过程,可能会觉得这个命令看起来很难理解和记忆。上面大部分的定义都可以在模块里通过读取内核中相应的设置之而得到直接的处理。我们来看一下它们每一个的作用_KERNEL_并不是所有的内核头文件都是只能由内核本身使用。有些用户空间程序也会使用到它们,只是其中有些内容是内核专用的,必须把它们对用户空间隐藏起来。将要插入到内核里去的代码必须定义编译标志_KERNEL_来看到头文件的所有内容_SMP_内核可以被编译为被SMPSYMMETRICMULTIPROCESSOR,对称多处理器系统,即有一个以上处理器的系统或UPUNIPROCESSOR单处理器系统机器使用。如果一个模块将被插入到一个SMP内核中就必须定义_SMP_编译标志。MODULE如果代码将被编译为一个内核模块,就必须定义这个编译标志。MODVERSIONS这个标志作用是检查内核与模块之间不兼容性。详细说明见下面的内容。剩下的GCC命令行选项都不是内核专用的,大家在前面已经见过它们的用法了。“O”开关告诉GCC编译期间需要进行几遍优化。为了使用内核级的函数比如OUTB等,内核模块在编译的时候至少要达到“O2”或更高的优化级别才行。高于“O2”的级别也是可以用的,但是并不推荐这么做。把所用警告的机制都打开。这对编写包括内核模块在内的程序来说是一个好习惯。/USR/SRC/LINUX是安排LINUX内核树的好地方,但并不是一个硬性的要求,你可以把它存放在任何地点。GCC命令俄“I”选项(头文件路径)告诉它把这个路径也添加到头文件的搜索路径上去。内核专用的头文件一般都保存在内核树的INCLUDE/子目录里,所以,当我们写出如下所示代码是INCLUDE我们实际指的是/USR/SRC/LINUX/INCLUDE/LINUX/MODULEH文件。在INCLUDE/子目录里有两个子目录比较重要,它们一个是LINUX/,另一个是ASM/。前一个子目录包含着与计算机平台无关的文件后一个子目录实际上是一个指向ASMARCH/子目录的符号链接,ARCH可以是“I386”或“ALPHA”等。这个链接是在配置和创建内核的时候设置的,而且指向头文件子目录的两个符号链接分别指向/USR/INCLUDE/LINUX和/USR/INCLUDE/ASM。MODVERSIONS定义用在带函数版本检查功能的内核上。它可以防止模块被加载到一个与它不兼容的内核里去,否知轻则引起功能的紊乱,重则引起内核的崩溃。在对模块进行编译的时候,模块们都将针对当前运行中的内核版本建立起来,以后一般也只能加载到于此精确对应的内核版本上。带版本检查功能的内核会给向外界提供的导出函数加上校验和信息做为后缀,这些校验和信息与它导出的程序接口有密切的关系。这是我们能够安全的了解到底层API是否在模块建立以后又出现变化。可以利用查看/PROC/KSYMS文件的方法来检查自己是否运行在一个带版本检查功能的内核上,这个文件包含着运行中的内核导出的各种符号。如果导出函数的名字后有一个“_RXXXXXX”形式的后缀,说明他激活了版本的检查功能。如下所示CAT/PROC/KSYMSC0115728PRINTK_RSMP_1B7D4074C01D3ED0SPRINTF_RSMP_3C2C5AF5上面的例子中,函数真正的名字是PIRNTK和SPRINTF。从上面的输出结果可以看出我们正运行着一个激活了版本检查功能SMP内核。如果想对这些名字进行解析的话,在编写模块时就必须包括上头文件LINUX/MODVERSIONSH文件。另一个问题是与名字空间有关的,除非你之前参加过大型项目的开发,大多数人是很少会特别注意到这一方面的。在做内核的开发的时候,一定要特别注意不要把全局性的内核名字空间弄混乱了。在导出函数的名字之前加上驱动程序的名字是一个避免出现名字冲突的好的方法,大多数内核的开发人员也正是这样做的。另一个很好的习惯是只导出被其他驱动程序用到的函数和变量,要是两种方法同时使用效果就更好了。把全局变量和函数声明为静态变量和静态函数也是可以同样达到目的的,但是有一些其他的副作用。其他变量和函数的导出要明确的使用EXPORT_SYMBOL宏命令来进行,它会把它们添加到内核的全局符号表里去。一般来说,只有在准备把驱动程序分为几个模块或者准备暴露驱动程序的内部细节来做他用的情况下才需要考虑。不管怎么说,把全局名字空间的污染降低到最小的程度永远是一个好主意。有关命令的语法定义都是很容易理解的。EXPORT_SYMBOLNAME导出代表变量或函数符号的名字EXPORT_SYMBOL_NOVERSNAME导出代表变量或函数符号的名字,但不加上模块版本检查后缀即使定义了也不加EXPORT_NO_SYMBOLS不到出任何符号数据类型LINUX可以运行在许多不同类型的体系结构上,有些的是32位,有些的是64位的。甚至曾经有人尝试让LINUX运行在16位的硬件上,今后的发展会是什么样没有人能够预料到。因此,一定不要认为一个指定类型的变量的长度就是固定不变的,这一点很重要。LINUX定义了一些标准类型,它们在各种平台上的尺寸长度都是一致的。_U8,_U64_S8,_S64字符到64位长度之间带正负号和不带正负号的变量如果你需要一个特殊长度的变量,就一定要使用上表里定义的类型。当你几个月后回头来查看驱动程序的源代码时,这些定义让人看着既舒服,又使代码更容易理解。还有一些特殊类型是在驱动程序的入口点上的,例如SSIZE_TSCHAR_READ,SIZE_TCOUNT,LOFF_TOFFSETSSIZE_T和SIZE_T就是在内核里有特殊作用的类型定义我们会在后面的内容里对他们做进一步的介绍。这些定义的作用都很直接,因此程序员就不需要为数据的长度操太多心。对类型的定义都在LINUX/TYPESH和ASM/POSIX_TYPESH头文件里面,如果你想知道他们具体的TYPEDEF定义长度是多少,可以自行查阅这两个文件。当你需要把它们赋值给编译器的整数类型时,记住一定要使用一个正确的映射关系。GCC对数据尺寸的不匹配问题很敏感,会把它认为有问题的报告给你。试一试一个内核模块我们现在开始编写我们的第一个内核模块。以往传统的说法,我们决定编写一个“HELLOKERNEL”模块,别厌倦,这是我们这本书里最后一次编写这样的程序了。我们从下面的HELLOC文件开始动手。INCLUDEIFDEFINEDCONFIG_SMPDEFINE_SMP_ENDIFIFDEFINEDCONFIG_MODVERSIONSDEFINEMODVERSIONSINCLUDEENDIFINCLUDEINTINIT_MODULEVOIDPRINTKKERN_D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论