Escolar Documentos
Profissional Documentos
Cultura Documentos
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
Sgueme...
casidiablo.netenFacebook
Contacto
Loqueleo
casidiablo.net/desarrollar-compilar-modulo-linux/
1/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
BeLinuxMyFriend Bloguearporbloguear CasidiabloMedia DescargaJuegos ElBlogdeGuapacho LinuxHispano LuAuF Nierox PllateunLinux ProgramacinPHP,JavayC++ ProgramandoIdeas RincnInformtico rmrf Queesunensayo?
jun,2620094:31pm
[howto]TuprimermdulocargableparaelLinuxkernel
Este howto est basado en el artculo The Kernel Newbie Corner: Your First Loadable Kernel Module escrito por Rob Day en Linux.com. En l se ensean las bases de la programacin de mdulos para el kernel de Linux. Este primer artculo pretende ilustrardemaneraclaralosconceptosbsicosyesperoque,amedida queRobvayaescribiendomsartculos,puedairtraducindolospara ofrecer este excelente contenido en espaol. Adems, funciona para cualquier distro, aunque en este caso lo hice todo sobre Gentoo. Sin ms,vamosalgrano!
tweets
10
retweet
Esnecesariotenerprivilegiosderoot?
Mientrasdesarrollamoselmdulo,no.Peroalmomentodecargarelmdulonecesitaremosprivilegios administrativos.Porsupuesto,esrecomendablequeeldesarrollolohagamosconunusuarionormal,y soloalfinalusemosunusuariorootparacargaroremoverlosmdulos.
Prerrequisitos
Antesdecomenzaresnecesariosaber/teneralgunascosas: Laversindelkernelconlaquevamosatrabajar(usualmentelaqueestamoscorriendo).Estolo
casidiablo.net/desarrollar-compilar-modulo-linux/
2/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
hacemosconelcomandou n a m e r : $unamer 2.6.29gentoor5 Elusodeherramientasdedesarrollo,comog c c ,b i n u t i l s ,etc. Tener instalados las utilidades para trabajar con mdulos (i n s m o d , r m m o d , etc.), el cual se encuentraenelpaquetem o d u l e i n i t t o o l s . ElcdigodelkerneldeLinux,detalmaneraquepuedascompilartumdulocontraeste.
Paraquelcdigodelkernel?
Esto es realmente importante, as que echaremos un vistazo un poco ms profundo. Cuando compilamos un mdulo para Linux es necesario tener el cdigo fuente de algunas partes del kernel, puesto que muchas instrucciones de preprocesador usadas no se encuentran en los headers estndardedesarrollo.Envezdeello,seencuentranenlosheadersdekernel. Podras simplemente descargar el cdigo del kernel directamente de la pgina oficial, aunque lo ms sencilloesinstalarelpaquetequecorrespondaalaversindelkernelqueestemosejecutando.Por logeneral,estetipodepaquetesinstalaelcdigoen / u s r / s r c o / u s r / s r c / k e r n e l s .Porejemplo,en Fedora el paquete que debes instalar se llama k e r n e l d e v , mientras que en Gentoo es g e n t o o s o u r c e s . Una vez tengas el cdigo instalado, es necesario saber exactamente en donde se encuentra, de tal maneraquepodamosreferenciarloalmomentodecompilarelmdulo.Podrasrevisaresomanualmente o, mejor an, buscar el enlace simblico hacia el kernel, que por lo general se encuentra en / l i b / m o d u l e s : $lsl/lib/modules/`unamer` total104 lrwxrwxrwx1rootroot31jun1110:24build>/usr/src/linux2.6.29gentoor5 El enlace simblico que buscamos es b u i l d , y como puedes ver en el ejemplo, apunta a la raz del cdigodelkernel.Estosignificaque,cadavezquequierashacerreferenciaalkernelenelmomentode compilarelmdulo,bastaconusardichoenlace.
Hola,kernel!
Bien,eshoradecrearnuestroprimermdulo.Sinmsrodeos,elcdigoseraelsiguiente: 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0
? / * E l n o m b r e d e l a r c h i v o e s ' h o l a . c ' . * / # i n c l u d e < l i n u x / m o d u l e . h > / / p a r a t o d o s l o s m o d u l o s # i n c l u d e < l i n u x / i n i t . h > / / p a r a l a s m a c r o s e n t r y / e x i t # i n c l u d e < l i n u x / k e r n e l . h > / / p a r a u s a r l a m a c r o p r i n t k # i n c l u d e < a s m / c u r r e n t . h > / / i n f o r m a c i o n d e l p r o c e s o ( s o l o # i n c l u d e < l i n u x / s c h e d . h > / / p a r a u s a r l a e s t r u c t u r a " t a s k _ s t a t i c i n t h o l a ( v o i d ) { p r i n t k ( K E R N _ I N F O " H o l a , e l m o d u l o e s t a s i e n d o c a r g a d o . \ n " p r i n t k ( K E R N _ I N F O " E l u s e r s p a c e d e l p r o c e s o e s ' % s ' \ n " , c u r
casidiablo.net/desarrollar-compilar-modulo-linux/
3/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4
p r i n t k ( K E R N _ I N F O " E l P I D e s % i \ n " , c u r r e n t > p i d ) r e t u r n 0 / / p a r a i n d i c a r q u e t o d o h a s a l i d o b i e n } s t a t i c v o i d a d i o s ( v o i d ) { p r i n t k ( K E R N _ I N F O " C h a o , e l m o d u l o e s t a s i e n d o r e m o v i d o . \ n " } m o d u l e _ i n i t ( h o l a ) / / l o q u e s e d e b e l l a m a r a l c a r g a r u n m o d m o d u l e _ e x i t ( a d i o s ) / / l o q u e s e d e b e l l a m a r a l r e m o v e r u n m o M O D U L E _ A U T H O R ( " R o b e r t P . J . D a y " ) M O D U L E _ A U T H O R ( " C r i s t i a n C a s t i b l a n c o [ s o l o l o p u s e e n c a s t e l l a n o ] M O D U L E _ L I C E N S E ( " D u a l B S D / G P L " ) M O D U L E _ D E S C R I P T I O N ( " A q u i p u e d e s p o n e r u n a d e s c r i p c i o n d e t u m o d u
Algunasobservacionesacercadelcdigodearriba: Tcnicamente, noesnecesarioimprimircosascadavezquesecargaoremueveunmdulo (con p r i n t k ). Pero puesto que es nuestro primermdulo,yanno hace nadaespecial,esms divertidosilodejamosas. Es necesario hacer que la funcin de inicio retorne 0, si queremos indicar que la carga fue satisfactoria. No,noesnecesarioponerunacomadespusdeindicarelniveldelogs(K E R N _ I N F O ).Esunerror comnhacerlo. Esoestodovamosacompilarlo!
ElarchivoMakefile
EsteeselarchivoMakefilequenecesitaremos: 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 i f e q ( $ ( K E R N E L R E L E A S E ) , ) K E R N E L D I R ? = / l i b / m o d u l e s / $ ( s h e l l u n a m e r ) / b u i l d P W D : = $ ( s h e l l p w d ) . P H O N Y : b u i l d c l e a n b u i l d : $ ( M A K E ) C $ ( K E R N E L D I R ) M = $ ( P W D ) m o d u l e s c l e a n : r m r f * . o * ~ c o r e . d e p e n d . * . c m d * . k o * . m o d . c e l s e $ ( i n f o B u i l d i n g w i t h K E R N E L R E L E A S E = $ { K E R N E L R E L E A S E } ) o b j m : = h o l a . o e n d i f
?
Comohasdesaber, losarchivosMakefileindicanlasreglasnecesariasparacompilarcdigo. En
casidiablo.net/desarrollar-compilar-modulo-linux/
4/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
estecaso,explicndoloagrosomodo,loquehaceelMakefileesdetectarqueannosencontramosen eldirectoriodedesarrollodenuestromdulo,yporlotantosedirigealdirectoriodelkernel,compilael mdulodesdeahysedevuelve.Paraprobarlobastaconejecutarelcomandom a k e : $make makeC/lib/modules/2.6.29gentoor5/buildM=/tmp/holamodules make[1]:seingresaaldirectorio`/usr/src/linux2.6.29gentoor5 BuildingwithKERNELRELEASE=2.6.29gentoor5 CC[M]/tmp/hola/hola.o Buildingmodules,stage2. BuildingwithKERNELRELEASE=2.6.29gentoor5 MODPOST1modules CC/tmp/hola/hola.mod.o LD[M]/tmp/hola/hola.ko make[1]:sesaledeldirectorio`/usr/src/linux2.6.29gentoor5
Examinarelmdulo
Una vez compiles el mdulo obtendrs un archivo con extensin . k o . Si quieres echarle un ojo a dichoarchivo,puedesusarelcomandom o d i n f o as: $sudomodinfohola.ko filename:hola.ko description:Aquipuedesponerunadescripciondetumodulo license:DualBSD/GPL author:CristianCastiblanco[sololopuseencastellano ] author:RobertP.J.Day depends: vermagic:2.6.29gentoor5SMPmod_unloadCORE2 EnGentooesnecesarioejecutarloconprivilegiosenotrasdistrospuedesejecutarlonormalmente.
Cargaroremoverelmdulo
Llego la hora de cargar nuestro mdulo. Para ello, como coment anteriormente, es necesario poseer privilegiosadministrativos.Algrano: #insmodhola.ko #lsmod ModuleSizeUsedby hola11480<GENIAL!Esnuestromdulo! vboxnetflt699760 vboxdrv943681vboxnetflt nvidia953178840 $sudormmodhola Ydondeestloqueimprimimoscon p r i n t k ?Bien,noescomnimprimirenconsolacosasmientras
casidiablo.net/desarrollar-compilar-modulo-linux/ 5/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
unmduloescargadooremovidoenestecaso, lasalidava adar al archivodelogs principalde Linux (/ v a r / l o g / m e s s a g e s ) puedes ver la salida con el comando d m e s g o directamente en dicho archivo: #dmesg|tail [20651.176989]Hola,elmoduloestasiendocargado. [20651.176993]Eluserspacedelprocesoesinsmod [20651.176997]ElPIDes13786 [20678.497134]Chao,elmoduloestasiendoremovido. #tail/var/log/messages
Conclusin
Estassonapenaslasbasesquedeberamostenerparacomenzarconlaconstruccindeunmdulopara el kernel de Linux. Es de valiosa ayuda jugar un poco con este ejemplo, de tal manera que podamos estarsegurosquetodoirbiencuandohagamosalgounpocomscomplejo. Descargarcdigofuentedelejemplo 23Comentarios|dejaeltuyo
6enlacesentrantes
Bitacoras.com tuxtor'sstatusonFriday,26Jun0921:49:56UTCIdenti.ca VotaestanoticiaenLinuxRank Afondo:TuprimermdulocargableparaelLinuxkernel MdulocargableenLinuxelBlogDeG10 Enlacesdeinters.4ta.Bsqueda
17Comentariosen[howto]Tuprimermdulocargablepara elLinuxkernel
Comentariosanteriores 1. Mikedice: enero2,2011alas9:10pm Buendia: Primeroquenadatedoygraciasporelaporte,muyamable conrespectoalMakefilemediounproblemitaperoalingresarelsiguientecontenidoenel
casidiablo.net/desarrollar-compilar-modulo-linux/
6/7
01/02/13
[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin
Makefiletodocaminodemaravilla: objm+=hola.o all: makeC/lib/modules/`unamer`/buildM=$(PWD)modules clean: makeC/lib/modules/`unamer`/buildM=$(PWD)clean Lopongoporsiaalguienledioalgunproblemaconesoestaeslasoluciongenerica. saludosatodos. Responder Cristiandice: enero2,2011alas9:41pm Graciasatiporelaporte,Mike. Unsaludo! Responder Comentariosanteriores
Djanostucomentario!
Tunombre
Gravatar)
Homepage Tucomentario
Email(para
Enviarcomentario 20062010casidiablo.net.Pocosderechosreservados.
casidiablo.net/desarrollar-compilar-modulo-linux/
7/7