Você está na página 1de 7

01/02/13

[how-to] Tu primer mdulo cargable para el Linux kernel | Linux, Java y programacin

gentoolinux,java,softwarelibreyotrashierbas $HOME casidiablo.tv Autor Contribuir Java C#y.NET

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

Você também pode gostar