{"id":48,"date":"2006-06-12T19:03:21","date_gmt":"2006-06-13T00:03:21","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=48"},"modified":"2006-08-22T20:48:16","modified_gmt":"2006-08-23T01:48:16","slug":"crea-tus-propios-drivers-o-modulos-linux","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=48","title":{"rendered":"Crea tus propios Drivers o Modulos Linux"},"content":{"rendered":"<p>En este art\u00edculo voy a describir el principio de un driver para Linux, a los cuales se les conoce como m\u00f3dulos.<\/p>\n<p>Al momento de escribir esto, contaba con un kernel de la serie 2.6.9 pero igual deber\u00eda funcionar en otras versiones del kernel.<\/p>\n<p>1)\tRequieres contar con el fuente de tu kernel, al momento de compilar<br \/>\n2)\tTener make y GNU C instalado<\/p>\n<p>* Yo me encuentro usando los que vienen por default en RedHat AS 4.0<\/p>\n<p>Mi intenci\u00f3n original era crear un driver del tipo C \u201cCar\u00e1cter??, el cual seria una simple variable para almacenar en RAM, pero por el momento solo ser\u00e1 un modulo flotante en la memoria del sistema<\/p>\n<p>El c\u00f3digo de memoria.c<\/p>\n<p><code>#include <linux \/module.h>\n<p>MODULE_AUTHOR (\"Last Dragon 2006\");<br \/>\nMODULE_LICENSE (\"GPL\");<\/p>\n<p>int cuenta (int n)<br \/>\n{<br \/>\n\twhile (n++ < 5) printk (\"he contado %d veces\\n\",n);\n\treturn n;\n}\n\nint init_module(void) \n{\n\tprintk(\"&lt;1> Instalando Driver en el Kernel\\n\");<br \/>\n\tcuenta(0);<\/p>\n<p>\treturn 0;<br \/>\n}<br \/>\nvoid cleanup_module(void)<br \/>\n{<br \/>\n\tprintk(\"&lt;1> Retirando el Driver del Kernel\\n\");<\/p>\n<p>}<\/linux><\/code><\/p>\n<p>Explicaci\u00f3n, Cada que un driver en Linux arranca se llama a una funci\u00f3n especifica que deber\u00eda existir en todo modulo, la entera init_module y cuando un modulo es retirado igual mente se busca cleanup_module<\/p>\n<p>B\u00e1sicamente usamos la init_module para inicializar y preparar el modulo y cleanup_module nos da la oportunidad de retirar todo lo hecho en el modulo, por ejemplo si alguna funci\u00f3n se le asigno memoria con kmalloc, debemos liberarla y quitar las instancias a cualquier hardware o dispositivo abierto, por ahora el c\u00f3digo es muy simple..<\/p>\n<p>Inicia y manda un aviso a la consola que ha cargado y para que haga \u201calgo?? le he mandado a ejecutar una funci\u00f3n que contara 5 veces y cada que cuenta mostrara en pantalla la cuenta, y para retirarlo. Igualmente manda un mensaje<\/p>\n<p>Ahora vamos a compilarlo, Nota que no existe la funci\u00f3n main, es como crear una librer\u00eda din\u00e1mica, pero esta ser\u00e1 una librer\u00eda din\u00e1mica para el kernel, no para una aplicaci\u00f3n .<\/p>\n<p>Pasos para compilar<\/p>\n<p>1)\tCrea un archivo Makefile<br \/>\n2)\tEscr\u00edbele en su interior<br \/>\n3)\tobj-m:= memoria.o<br \/>\n4)\tEjecuta make, asi:<br \/>\n       make -C \/usr\/src\/kernels\/2.6.9-5.EL-i686 SUBDIRS=\/root\/holamod modules<\/p>\n<p>El segundo par\u00e1metro de Make es una ruta al directorio del kernel, tu debes poner la ubicaci\u00f3n de tu kernel, el valor de subdirs es donde esta almacenado el c\u00f3digo fuente de tu modulo. Yo estoy trabajando en \/root\/holamod, tu puedes escribir tu modulo en cualquier otra carpeta.<\/p>\n<p>Si todo ha salido bien, ahora tienes en tu carpeta de desarrollo el archivo memoria.ko, que es el modulo. Ahora solo hay que probarlo<\/p>\n<p>Revisemos la informaci\u00f3n del modulo, con modinfo<\/p>\n<p>filename:       memoria.ko<br \/>\nauthor:         Last Dragon 2006<br \/>\nlicense:        GPL<br \/>\nvermagic:       2.6.9-5.EL 686 REGPARM 4KSTACKS gcc-3.4<br \/>\ndepends:        <\/p>\n<p>Parte de la informaci\u00f3n la esta tomando de:<br \/>\nMODULE_AUTHOR (&#8220;Last Dragon 2006&#8221;);<br \/>\nMODULE_LICENSE (&#8220;GPL&#8221;);<\/p>\n<p>Citado en el c\u00f3digo fuente de nuestro modulo<\/p>\n<p>Montemos el modulo con el programa insmod, debes ser root<\/p>\n<p>[root@linux holamod]# insmod memoria.ko > ins.txt<br \/>\n Instalando Driver en el Kernel<br \/>\nhe contado 1 veces<br \/>\nhe contado 2 veces<br \/>\nhe contado 3 veces<br \/>\nhe contado 4 veces<br \/>\nhe contado 5 veces<\/p>\n<p>El modulo se ejecuta, como se indica en el  c\u00f3digo.<\/p>\n<p>Comprobemos que es parte del kernel<\/p>\n<p>Con lsmod<\/p>\n<p>Module                  Size  Used by<br \/>\nmemoria                 1664  0<br \/>\nsmbfs                  66233  2<br \/>\nmd5                     4033  1<br \/>\nfloppy                 58481  0<br \/>\next3                  116809  1 <\/p>\n<p>Ahora desmontemos nuestro modulo, con rmmod<\/p>\n<p>[root@linux holamod]# rmmod memoria<br \/>\n Retirando el Driver del Kernel<\/p>\n<p>Si has llegado hasta este punto, todo ha ido bien.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo voy a describir el principio de un driver para Linux, a los cuales se les conoce como m\u00f3dulos. Al momento de escribir esto, contaba con un kernel de la serie 2.6.9 pero igual deber\u00eda funcionar en otras versiones del kernel. 1) Requieres contar con el fuente de tu kernel, al momento de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-48","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/48","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=48"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/48\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}