{"id":49,"date":"2006-06-16T21:12:25","date_gmt":"2006-06-17T02:12:25","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=49"},"modified":"2006-08-22T20:48:00","modified_gmt":"2006-08-23T01:48:00","slug":"programando-llamadas-al-sistema-del-kernel-linux","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=49","title":{"rendered":"Programando llamadas al sistema del kernel Linux"},"content":{"rendered":"<p>Normalmente todo esta implementado en las librer\u00edas , sin embargo conocer esta informaci\u00f3n es \u00fatil y seguro le podr\u00eda encontrar un uso, adem\u00e1s cuando implemente sus propias funciones en el kernel de Linux y requiera llamarlas y esas no estar\u00e1n disponible en la biblioteca standart<\/p>\n<p>Re implementado el comando kill<\/p>\n<p>kill.c<\/p>\n<p>#include &lt;linux\/unistd.h&gt;<\/p>\n<p>_syscall2(int,kill,int, pid, int, sig);<\/p>\n<p>int main ()<br \/>\n{<br \/>\n   int ppid = 0, argumento = 0;<br \/>\n   printf (&#8220;Pid: &#8220;);<br \/>\n   scanf (&#8220;%d&#8221;,&#038;ppid);<br \/>\n   printf (&#8220;Argumento: &#8220;);<br \/>\n   scanf (&#8220;%d&#8221;,&#038;argumento);<br \/>\n   kill (ppid,argumento);<br \/>\n   return 0;<br \/>\n}<\/p>\n<p>solo 3 l\u00edneas podr\u00edan ser nuevas para usted<\/p>\n<p>primero esta la include a Linux\/unistd.h que es diferente a solo usar unistd.h pues aqu\u00ed la funciones las vamos sacar directamente del kernel no de una librer\u00eda<\/p>\n<p>la segunda l\u00ednea es la declaraci\u00f3n de la llamada y para activarla en el programa busca que este definida en el archivo de kernel \/usr\/src\/kernels\/2.6.9-5.EL-i686\/include\/asm\/unistd.h<br \/>\ny lo esta de la siguiente forma<\/p>\n<p>#define __NR_kill                37<\/p>\n<p>Ahora busquemos su prototipo para saber que argumentos y cuantos requiere, en el archivo<br \/>\n\/usr\/src\/kernels\/2.6.9-5.EL-smp-i686\/include\/linux\/syscalls.h<\/p>\n<p>aparece de la siguiente forma:<br \/>\nasmlinkage long sys_kill(int pid, int sig);<\/p>\n<p>aqu\u00ed se ve que kill esta implementado con 2 argumentos el pid del programa a matar y la se\u00f1al<\/p>\n<p>En el programa muestra hago una llamada a _syscall2(int,kill,int, pid, int, sig)<\/p>\n<p>el _syscall2 significa que quiero llamar una funci\u00f3n que tiene 2 argumentos, si llamara a syscall0 seria una funci\u00f3n sin argumento \u201cvoid?? o _syscall6 seria una funci\u00f3n con 6 argumentos y as\u00ed.<\/p>\n<p>sin embargo cuanto la implemento vemos que hay mas de 2 argumentos<\/p>\n<p>el primero es un int y es para el resultado de la funci\u00f3n por que kill devuelve un valor entero para saber si se ejecuto correctamente o no, el segundo argumento es el nombre de la funciona que estoy llamando, en syscalls.h esta implementada como sys_kill, pero la macro de syscall le retira el sys_ <\/p>\n<p>el tercer argumento es el tipo del primer argumento de la funci\u00f3n, esta es entera, el siguiente argumento es el nombre de la variable que le pasamos a la funci\u00f3n pid, el quinto argumento es nuevamente el tipo de argumento y de nuevo es entero y por ultimo el nombre del segundo argumento que pasamos a la funci\u00f3n.<\/p>\n<p>syscall ocupa un argumento para definir solo tipo, otro para definir nombre por eso hay 6 argumentos para llamar a una funci\u00f3n que solo deber\u00eda tener 2<\/p>\n<p>por ultimo en el programa que he puesto pongo por fin la llamada a la funci\u00f3n en el kernel<\/p>\n<p>kill (ppid,argumento);<\/p>\n<p>ppid y argumentos son variables declaradas en el mismo programa y capturadas por stdin o s\u00e9ase teclado si la ejecutas en consola.<\/p>\n<p>compilamos y ejecutamos<\/p>\n<p>[root@linux eboot]# gcc kill.c -o kill<br \/>\n[root@linux eboot]# .\/kill<br \/>\nPid: 2296<br \/>\nArgumento: 9<br \/>\n[root@linux eboot]#<\/p>\n<p>esto seria el equivalente a el comando nativo que viene en la distro kill y usado as\u00ed kill 2296  -9<\/p>\n<p>como ultima practica se hace un programa que obtiene su propio PID uno escrito usando la librer\u00edas del sistema y otro que nuevamente hace uso de una llamada al sistema para obtener el pid directamente del kernel, aunque al final el feel and look del programa es el mismo el c\u00f3digo que ejecutan es diferente<\/p>\n<p>primero la versi\u00f3n normalmente programada por la mayoria.<\/p>\n<p>normalpid.c<\/p>\n<p>#include &lt;unistd.h&gt;<\/p>\n<p>int main ()<br \/>\n{<br \/>\n        printf (&#8220;Mi propio PID es: %d&#8221;,getpid());<br \/>\n        return 0;<br \/>\n}<\/p>\n<p>Ahora el c\u00f3digo con la llamada al sistema<\/p>\n<p>kernelpid.c<\/p>\n<p>#include &lt;linux\/unistd.h&gt;<\/p>\n<p>_syscall0(int,getpid);<\/p>\n<p>int main ()<br \/>\n{<br \/>\n        printf (&#8220;Mi propio PID es: %d&#8221;,getpid());<br \/>\n        return 0;<br \/>\n}<\/p>\n<p>veamos los archivos anteriores para ver su define y su prototipo<br \/>\n#define __NR_getpid              20  \/\/ en Linux\/unistd.h<br \/>\nasmlinkage long sys_getpid(void); \/\/ en syscalls.h<\/p>\n<p>al ejecutar ambos la salida ser\u00e1 id\u00e9ntica<\/p>\n<p>[root@linux eboot]# gcc kernelpid.c -o kernelpid; .\/kernelpid<br \/>\nMi propio PID es: 3421<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalmente todo esta implementado en las librer\u00edas , sin embargo conocer esta informaci\u00f3n es \u00fatil y seguro le podr\u00eda encontrar un uso, adem\u00e1s cuando implemente sus propias funciones en el kernel de Linux y requiera llamarlas y esas no estar\u00e1n disponible en la biblioteca standart Re implementado el comando kill kill.c #include &lt;linux\/unistd.h&gt; _syscall2(int,kill,int, pid,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-49","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/49","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=49"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/49\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=49"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=49"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=49"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}