1*cdc822ddSCarlos Bilbao.. include:: ../disclaimer-sp.rst 2*cdc822ddSCarlos Bilbao 3*cdc822ddSCarlos Bilbao:Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>` 4*cdc822ddSCarlos Bilbao:Translator: Mauricio Fuentes <mauriciofb@gmail.com> 5*cdc822ddSCarlos Bilbao 6*cdc822ddSCarlos Bilbao.. _sp_addsyscalls: 7*cdc822ddSCarlos Bilbao 8*cdc822ddSCarlos BilbaoAgregando una Nueva Llamada del Sistema 9*cdc822ddSCarlos Bilbao======================================= 10*cdc822ddSCarlos Bilbao 11*cdc822ddSCarlos BilbaoEste documento describe qué involucra agregar una nueva llamada del sistema 12*cdc822ddSCarlos Bilbaoal kernel Linux, más allá de la presentación y consejos normales en 13*cdc822ddSCarlos Bilbao:ref:`Documentation/process/submitting-patches.rst <submittingpatches>` que 14*cdc822ddSCarlos Bilbaotambién puede encontrar traducido a este idioma. 15*cdc822ddSCarlos Bilbao 16*cdc822ddSCarlos BilbaoAlternativas a Llamadas del Sistema 17*cdc822ddSCarlos Bilbao----------------------------------- 18*cdc822ddSCarlos Bilbao 19*cdc822ddSCarlos BilbaoLa primera cosa a considerar cuando se agrega una llamada al sistema es si 20*cdc822ddSCarlos Bilbaoalguna alternativa es adecuada en su lugar. Aunque las llamadas al sistema 21*cdc822ddSCarlos Bilbaoson los puntos de interacción entre el userspace y el kernel más obvios y 22*cdc822ddSCarlos Bilbaotradicionales, existen otras posibilidades -- elija la que mejor se adecúe 23*cdc822ddSCarlos Bilbaoa su interfaz. 24*cdc822ddSCarlos Bilbao 25*cdc822ddSCarlos Bilbao - Si se puede hacer que la operación se parezca a un objeto filesystem, 26*cdc822ddSCarlos Bilbao podría tener más sentido crear un nuevo sistema de ficheros o 27*cdc822ddSCarlos Bilbao dispositivo. Esto también hará más fácil encapsular la nueva 28*cdc822ddSCarlos Bilbao funcionalidad en un módulo del kernel en vez de requerir que sea 29*cdc822ddSCarlos Bilbao construido junto al kernel principal. 30*cdc822ddSCarlos Bilbao 31*cdc822ddSCarlos Bilbao - Si la nueva funcionalidad involucra operaciones donde el kernel 32*cdc822ddSCarlos Bilbao notifica al userspace que algo ha pasado, entonces retornar un nuevo 33*cdc822ddSCarlos Bilbao descriptor de archivo para el objeto relevante permite al userspace 34*cdc822ddSCarlos Bilbao usar ``poll``/``select``/``epoll`` para recibir esta notificación. 35*cdc822ddSCarlos Bilbao 36*cdc822ddSCarlos Bilbao - Sin embargo, operaciones que no mapean a operaciones similares a 37*cdc822ddSCarlos Bilbao :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas 38*cdc822ddSCarlos Bilbao como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un 39*cdc822ddSCarlos Bilbao API algo opaca. 40*cdc822ddSCarlos Bilbao 41*cdc822ddSCarlos Bilbao - Si sólo está exponiendo información del runtime, un nuevo nodo en sysfs 42*cdc822ddSCarlos Bilbao (mire ``Documentation/filesystems/sysfs.rst``) o el filesystem ``/proc`` 43*cdc822ddSCarlos Bilbao podría ser más adecuado. Sin embargo, acceder a estos mecanismos 44*cdc822ddSCarlos Bilbao requiere que el filesystem relevante esté montado, lo que podría no ser 45*cdc822ddSCarlos Bilbao siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). 46*cdc822ddSCarlos Bilbao Evite agregar cualquier API a debugfs, ya que no se considera una 47*cdc822ddSCarlos Bilbao interfaz (interface) de 'producción' para el userspace. 48*cdc822ddSCarlos Bilbao 49*cdc822ddSCarlos Bilbao - Si la operación es específica a un archivo o descriptor de archivo 50*cdc822ddSCarlos Bilbao específico, entonces la opción de comando adicional :manpage:`fcntl(2)` 51*cdc822ddSCarlos Bilbao podría ser más apropiada. Sin embargo, :manpage:`fcntl(2)` es una 52*cdc822ddSCarlos Bilbao llamada al sistema multiplexada que esconde mucha complejidad, así que 53*cdc822ddSCarlos Bilbao esta opción es mejor cuando la nueva funcion es analogamente cercana a 54*cdc822ddSCarlos Bilbao la funcionalidad existente :manpage:`fcntl(2)`, o la nueva funcionalidad 55*cdc822ddSCarlos Bilbao es muy simple (por ejemplo, definir/obtener un flag simple relacionado a 56*cdc822ddSCarlos Bilbao un descriptor de archivo). 57*cdc822ddSCarlos Bilbao 58*cdc822ddSCarlos Bilbao - Si la operación es específica a un proceso o tarea particular, entonces 59*cdc822ddSCarlos Bilbao un comando adicional :manpage:`prctl(2)` podría ser más apropiado. Tal 60*cdc822ddSCarlos Bilbao como con :manpage:`fcntl(2)`, esta llamada al sistema es un multiplexor 61*cdc822ddSCarlos Bilbao complicado así que está reservado para comandos análogamente cercanos 62*cdc822ddSCarlos Bilbao del existente ``prctl()`` u obtener/definir un flag simple relacionado a 63*cdc822ddSCarlos Bilbao un proceso. 64*cdc822ddSCarlos Bilbao 65*cdc822ddSCarlos BilbaoDiseñando el API: Planeando para extensiones 66*cdc822ddSCarlos Bilbao-------------------------------------------- 67*cdc822ddSCarlos Bilbao 68*cdc822ddSCarlos BilbaoUna nueva llamada del sistema forma parte del API del kernel, y tiene que 69*cdc822ddSCarlos Bilbaoser soportada indefinidamente. Como tal, es una muy buena idea discutir 70*cdc822ddSCarlos Bilbaoexplícitamente el interface en las listas de correo del kernel, y es 71*cdc822ddSCarlos Bilbaoimportante planear para futuras extensiones del interface. 72*cdc822ddSCarlos Bilbao 73*cdc822ddSCarlos Bilbao(La tabla syscall está poblada con ejemplos históricos donde esto no se 74*cdc822ddSCarlos Bilbaohizo, junto con los correspondientes seguimientos de los system calls -- 75*cdc822ddSCarlos Bilbao``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, 76*cdc822ddSCarlos Bilbao``pipe``/``pipe2``, ``renameat``/``renameat2`` -- así que aprenda de la 77*cdc822ddSCarlos Bilbaohistoria del kernel y planee extensiones desde el inicio.) 78*cdc822ddSCarlos Bilbao 79*cdc822ddSCarlos BilbaoPara llamadas al sistema más simples que sólo toman un par de argumentos, 80*cdc822ddSCarlos Bilbaola forma preferida de permitir futuras extensiones es incluir un argumento 81*cdc822ddSCarlos Bilbaoflag a la llamada al sistema. Para asegurarse que el userspace pueda usar 82*cdc822ddSCarlos Bilbaode forma segura estos flags entre versiones del kernel, revise si los flags 83*cdc822ddSCarlos Bilbaocontienen cualquier flag desconocido, y rechace la llamada al sistema (con 84*cdc822ddSCarlos Bilbao``EINVAL``) si ocurre:: 85*cdc822ddSCarlos Bilbao 86*cdc822ddSCarlos Bilbao if (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) 87*cdc822ddSCarlos Bilbao return -EINVAL; 88*cdc822ddSCarlos Bilbao 89*cdc822ddSCarlos Bilbao(Si no hay valores de flags usados aún, revise que los argumentos del flag 90*cdc822ddSCarlos Bilbaosean cero.) 91*cdc822ddSCarlos Bilbao 92*cdc822ddSCarlos BilbaoPara llamadas al sistema más sofisticadas que involucran un gran número de 93*cdc822ddSCarlos Bilbaoargumentos, es preferible encapsular la mayoría de los argumentos en una 94*cdc822ddSCarlos Bilbaoestructura que sea pasada a través de un puntero. Tal estructura puede 95*cdc822ddSCarlos Bilbaohacer frente a futuras extensiones mediante la inclusión de un argumento de 96*cdc822ddSCarlos Bilbaotamaño en la estructura:: 97*cdc822ddSCarlos Bilbao 98*cdc822ddSCarlos Bilbao struct xyzzy_params { 99*cdc822ddSCarlos Bilbao u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ 100*cdc822ddSCarlos Bilbao u32 param_1; 101*cdc822ddSCarlos Bilbao u64 param_2; 102*cdc822ddSCarlos Bilbao u64 param_3; 103*cdc822ddSCarlos Bilbao }; 104*cdc822ddSCarlos Bilbao 105*cdc822ddSCarlos BilbaoSiempre que cualquier campo añadido subsecuente, digamos ``param_4``, sea 106*cdc822ddSCarlos Bilbaodiseñado de forma tal que un valor cero, devuelva el comportamiento previo, 107*cdc822ddSCarlos Bilbaoentonces permite versiones no coincidentes en ambos sentidos: 108*cdc822ddSCarlos Bilbao 109*cdc822ddSCarlos Bilbao - Para hacer frente a programas del userspace más modernos, haciendo 110*cdc822ddSCarlos Bilbao llamadas a un kernel más antiguo, el código del kernel debe revisar que 111*cdc822ddSCarlos Bilbao cualquier memoria más allá del tamaño de la estructura sea cero (revisar 112*cdc822ddSCarlos Bilbao de manera efectiva que ``param_4 == 0``). 113*cdc822ddSCarlos Bilbao - Para hacer frente a programas antiguos del userspace haciendo llamadas a 114*cdc822ddSCarlos Bilbao un kernel más nuevo, el código del kernel puede extender con ceros, una 115*cdc822ddSCarlos Bilbao instancia más pequeña de la estructura (definiendo efectivamente 116*cdc822ddSCarlos Bilbao ``param_4 == 0``). 117*cdc822ddSCarlos Bilbao 118*cdc822ddSCarlos BilbaoRevise :manpage:`perf_event_open(2)` y la función ``perf_copy_attr()`` (en 119*cdc822ddSCarlos Bilbao``kernel/events/code.c``) para un ejemplo de esta aproximación. 120*cdc822ddSCarlos Bilbao 121*cdc822ddSCarlos Bilbao 122*cdc822ddSCarlos BilbaoDiseñando el API: Otras consideraciones 123*cdc822ddSCarlos Bilbao--------------------------------------- 124*cdc822ddSCarlos Bilbao 125*cdc822ddSCarlos BilbaoSi su nueva llamada al sistema permite al userspace hacer referencia a un 126*cdc822ddSCarlos Bilbaoobjeto del kernel, esta debería usar un descriptor de archivo como el 127*cdc822ddSCarlos Bilbaomanipulador de ese objeto -- no invente un nuevo tipo de objeto manipulador 128*cdc822ddSCarlos Bilbaouserspace cuando el kernel ya tiene mecanismos y semánticas bien definidas 129*cdc822ddSCarlos Bilbaopara usar los descriptores de archivos. 130*cdc822ddSCarlos Bilbao 131*cdc822ddSCarlos BilbaoSi su nueva llamada a sistema :manpage:`xyzzy(2)` retorna un nuevo 132*cdc822ddSCarlos Bilbaodescriptor de archivo, entonces el argumento flag debe incluir un valor que 133*cdc822ddSCarlos Bilbaosea equivalente a definir ``O_CLOEXEC`` en el nuevo FD. Esto hace posible 134*cdc822ddSCarlos Bilbaoal userspace acortar la brecha de tiempo entre ``xyzzy()`` y la llamada a 135*cdc822ddSCarlos Bilbao``fcntl(fd, F_SETFD, FD_CLOEXEC)``, donde un ``fork()`` inesperado y 136*cdc822ddSCarlos Bilbao``execve()`` en otro hilo podrían filtrar un descriptor al programa 137*cdc822ddSCarlos Bilbaoejecutado. (Sin embargo, resista la tentación de reusar el valor actual de 138*cdc822ddSCarlos Bilbaola constante ``O_CLOEXEC``, ya que es específica de la arquitectura y es 139*cdc822ddSCarlos Bilbaoparte de un espacio numerado de flags ``O_*`` que está bastante lleno.) 140*cdc822ddSCarlos Bilbao 141*cdc822ddSCarlos BilbaoSi su llamada de sistema retorna un nuevo descriptor de archivo, debería 142*cdc822ddSCarlos Bilbaoconsiderar también que significa usar la familia de llamadas de sistema 143*cdc822ddSCarlos Bilbao:manpage:`poll(2)` en ese descriptor de archivo. Hacer un descriptor de 144*cdc822ddSCarlos Bilbaoarchivo listo para leer o escribir es la forma normal para que el kernel 145*cdc822ddSCarlos Bilbaoindique al espacio de usuario que un evento ha ocurrido en el 146*cdc822ddSCarlos Bilbaocorrespondiente objeto del kernel. 147*cdc822ddSCarlos Bilbao 148*cdc822ddSCarlos BilbaoSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra algún nombre 149*cdc822ddSCarlos Bilbaode archivo como argumento:: 150*cdc822ddSCarlos Bilbao 151*cdc822ddSCarlos Bilbao int sys_xyzzy(const char __user *path, ..., unsigned int flags); 152*cdc822ddSCarlos Bilbao 153*cdc822ddSCarlos Bilbaodebería considerar también si una versión :manpage:`xyzzyat(2)` es mas 154*cdc822ddSCarlos Bilbaoapropiada:: 155*cdc822ddSCarlos Bilbao 156*cdc822ddSCarlos Bilbao int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags); 157*cdc822ddSCarlos Bilbao 158*cdc822ddSCarlos BilbaoEsto permite más flexibilidad en como el userspace especifica el archivo en 159*cdc822ddSCarlos Bilbaocuestión; en particular esto permite al userspace pedir la funcionalidad a 160*cdc822ddSCarlos Bilbaoun descriptor de archivo ya abierto usando el flag ``AT_EMPTY_PATH``, 161*cdc822ddSCarlos Bilbaoefectivamente dando una operación :manpage:`fxyzzy(3)` gratis:: 162*cdc822ddSCarlos Bilbao 163*cdc822ddSCarlos Bilbao - xyzzyat(AT_FDCWD, path, ..., 0) es equivalente a xyzzy(path, ...) 164*cdc822ddSCarlos Bilbao - xyzzyat(fd, "", ..., AT_EMPTY_PATH) es equivalente a fxyzzy(fd, ...) 165*cdc822ddSCarlos Bilbao 166*cdc822ddSCarlos Bilbao(Para más detalles sobre la explicación racional de las llamadas \*at(), 167*cdc822ddSCarlos Bilbaorevise el man page :manpage:`openat(2)`; para un ejemplo de AT_EMPTY_PATH, 168*cdc822ddSCarlos Bilbaomire el man page :manpage:`fstatat(2)` manpage.) 169*cdc822ddSCarlos Bilbao 170*cdc822ddSCarlos BilbaoSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra un parámetro 171*cdc822ddSCarlos Bilbaodescribiendo un describiendo un movimiento dentro de un archivo, ponga de 172*cdc822ddSCarlos Bilbaotipo ``loff_t`` para que movimientos de 64-bit puedan ser soportados 173*cdc822ddSCarlos Bilbaoincluso en arquitecturas de 32-bit. 174*cdc822ddSCarlos Bilbao 175*cdc822ddSCarlos BilbaoSi su nueva llamada de sistema :manpage:`xyzzy` involucra una 176*cdc822ddSCarlos Bilbaofuncionalidad privilegiada, esta necesita ser gobernada por la capability 177*cdc822ddSCarlos Bilbaobit linux apropiada (revisado con una llamada a ``capable()``), como se 178*cdc822ddSCarlos Bilbaodescribe en el man page :manpage:`capabilities(7)`. Elija una parte de 179*cdc822ddSCarlos Bilbaocapability linux que govierne las funcionalidades relacionadas, pero trate 180*cdc822ddSCarlos Bilbaode evitar combinar muchas funciones sólo relacionadas vagamente bajo la 181*cdc822ddSCarlos Bilbaomisma sección, ya que va en contra de los propósitos de las capabilities de 182*cdc822ddSCarlos Bilbaodividir el poder del usuario root. En particular, evite agregar nuevos usos 183*cdc822ddSCarlos Bilbaode la capacidad ya demasiado general de la capabilities ``CAP_SYS_ADMIN``. 184*cdc822ddSCarlos Bilbao 185*cdc822ddSCarlos BilbaoSi su nueva llamada de sistema :manpage:`xyzzy(2)` manipula un proceso que 186*cdc822ddSCarlos Bilbaono es el proceso invocado, este debería ser restringido (usando una llamada 187*cdc822ddSCarlos Bilbaoa ``ptrace_may_access()``) de forma que el único proceso con los mismos 188*cdc822ddSCarlos Bilbaopermisos del proceso objetivo, o con las capacidades (capabilities) 189*cdc822ddSCarlos Bilbaonecesarias, pueda manipulador el proceso objetivo. 190*cdc822ddSCarlos Bilbao 191*cdc822ddSCarlos BilbaoFinalmente, debe ser conciente de que algunas arquitecturas no-x86 tienen 192*cdc822ddSCarlos Bilbaoun manejo más sencillo si los parámetros que son explícitamente 64-bit 193*cdc822ddSCarlos Bilbaocaigan en argumentos enumerados impares (i.e. parámetros 1,3,5), para 194*cdc822ddSCarlos Bilbaopermitir el uso de pares contiguos de registros 32-bits. (Este cuidado no 195*cdc822ddSCarlos Bilbaoaplica si el argumento es parte de una estructura que se pasa a través de 196*cdc822ddSCarlos Bilbaoun puntero.) 197*cdc822ddSCarlos Bilbao 198*cdc822ddSCarlos BilbaoProponiendo el API 199*cdc822ddSCarlos Bilbao------------------ 200*cdc822ddSCarlos Bilbao 201*cdc822ddSCarlos BilbaoPara hacer una nueva llamada al sistema fácil de revisar, es mejor dividir 202*cdc822ddSCarlos Bilbaoel patchset (conjunto de parches) en trozos separados. Estos deberían 203*cdc822ddSCarlos Bilbaoincluir al menos los siguientes items como commits distintos (cada uno de 204*cdc822ddSCarlos Bilbaolos cuales se describirá más abajo): 205*cdc822ddSCarlos Bilbao 206*cdc822ddSCarlos Bilbao - La implementación central de la llamada al sistema, junto con 207*cdc822ddSCarlos Bilbao prototipos, numeración genérica, cambios Kconfig e implementaciones de 208*cdc822ddSCarlos Bilbao rutinas de respaldo (fallback stub) 209*cdc822ddSCarlos Bilbao - Conectar la nueva llamada a sistema a una arquitectura particular, 210*cdc822ddSCarlos Bilbao usualmente x86 (incluyendo todas las x86_64, x86_32 y x32). 211*cdc822ddSCarlos Bilbao - Una demostración del use de la nueva llamada a sistema en el userspace 212*cdc822ddSCarlos Bilbao vía un selftest en ``tools/testing/selftest/``. 213*cdc822ddSCarlos Bilbao - Un borrador de man-page para la nueva llamada a sistema, ya sea como 214*cdc822ddSCarlos Bilbao texto plano en la carta de presentación, o como un parche (separado) 215*cdc822ddSCarlos Bilbao para el repositorio man-pages. 216*cdc822ddSCarlos Bilbao 217*cdc822ddSCarlos BilbaoNuevas propuestas de llamadas de sistema, como cualquier cambio al API del 218*cdc822ddSCarlos Bilbaokernel, debería siempre ser copiado a linux-api@vger.kernel.org. 219*cdc822ddSCarlos Bilbao 220*cdc822ddSCarlos Bilbao 221*cdc822ddSCarlos BilbaoImplementation de Llamada de Sistema Generica 222*cdc822ddSCarlos Bilbao--------------------------------------------- 223*cdc822ddSCarlos Bilbao 224*cdc822ddSCarlos BilbaoLa entrada principal a su nueva llamada de sistema :manpage:`xyzzy(2)` será 225*cdc822ddSCarlos Bilbaollamada ``sys_xyzzy()``, pero incluya este punto de entrada con la macro 226*cdc822ddSCarlos Bilbao``SYSCALL_DEFINEn()`` apropiada en vez de explicitamente. El 'n' indica el 227*cdc822ddSCarlos Bilbaonumero de argumentos de la llamada de sistema, y la macro toma el nombre de 228*cdc822ddSCarlos Bilbaola llamada de sistema seguida por el par (tipo, nombre) para los parámetros 229*cdc822ddSCarlos Bilbaocomo argumentos. Usar esta macro permite a la metadata de la nueva llamada 230*cdc822ddSCarlos Bilbaode sistema estar disponible para otras herramientas. 231*cdc822ddSCarlos Bilbao 232*cdc822ddSCarlos BilbaoEl nuevo punto de entrada también necesita un prototipo de función 233*cdc822ddSCarlos Bilbaocorrespondiente en ``include/linux/syscalls.h``, marcado como asmlinkage 234*cdc822ddSCarlos Bilbaopara calzar en la manera en que las llamadas de sistema son invocadas:: 235*cdc822ddSCarlos Bilbao 236*cdc822ddSCarlos Bilbao asmlinkage long sys_xyzzy(...); 237*cdc822ddSCarlos Bilbao 238*cdc822ddSCarlos BilbaoAlgunas arquitecturas (e.g. x86) tienen sus propias tablas de syscall 239*cdc822ddSCarlos Bilbaoespecíficas para la arquitectura, pero muchas otras arquitecturas comparten 240*cdc822ddSCarlos Bilbaouna tabla de syscall genéricas. Agrega su nueva llamada de sistema a la 241*cdc822ddSCarlos Bilbaolista genérica agregando una entrada a la lista en 242*cdc822ddSCarlos Bilbao``include/uapi/asm-generic/unistd.h``:: 243*cdc822ddSCarlos Bilbao 244*cdc822ddSCarlos Bilbao #define __NR_xyzzy 292 245*cdc822ddSCarlos Bilbao __SYSCALL(__NR_xyzzy, sys_xyzzy ) 246*cdc822ddSCarlos Bilbao 247*cdc822ddSCarlos BilbaoTambién actualice el conteo de __NR_syscalls para reflejar la llamada de 248*cdc822ddSCarlos Bilbaosistema adicional, y note que si multiples llamadas de sistema nuevas son 249*cdc822ddSCarlos Bilbaoañadidas en la misma ventana unida, su nueva llamada de sistema podría 250*cdc822ddSCarlos Bilbaotener que ser ajustada para resolver conflictos. 251*cdc822ddSCarlos Bilbao 252*cdc822ddSCarlos BilbaoEl archivo ``kernel/sys_ni.c`` provee una implementación fallback stub 253*cdc822ddSCarlos Bilbao(rutina de respaldo) para cada llamada de sistema, retornando ``-ENOSYS``. 254*cdc822ddSCarlos BilbaoIncluya su nueva llamada a sistema aquí también:: 255*cdc822ddSCarlos Bilbao 256*cdc822ddSCarlos Bilbao COND_SYSCALL(xyzzy); 257*cdc822ddSCarlos Bilbao 258*cdc822ddSCarlos BilbaoSu nueva funcionalidad del kernel, y la llamada de sistema que la controla, 259*cdc822ddSCarlos Bilbaodebería normalmente ser opcional, así que incluya una opción ``CONFIG`` 260*cdc822ddSCarlos Bilbao(tipicamente en ``init/Kconfig``) para ella. Como es usual para opciones 261*cdc822ddSCarlos Bilbao``CONFIG`` nuevas: 262*cdc822ddSCarlos Bilbao 263*cdc822ddSCarlos Bilbao - Incluya una descripción para la nueva funcionalidad y llamada al sistema 264*cdc822ddSCarlos Bilbao controlada por la opción. 265*cdc822ddSCarlos Bilbao - Haga la opción dependiendo de EXPERT si esta debe estar escondida de los 266*cdc822ddSCarlos Bilbao usuarios normales. 267*cdc822ddSCarlos Bilbao - Haga que cualquier nuevo archivo fuente que implemente la función 268*cdc822ddSCarlos Bilbao dependa de la opción CONFIG en el Makefile (e.g. 269*cdc822ddSCarlos Bilbao ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). 270*cdc822ddSCarlos Bilbao - Revise dos veces que el kernel se siga compilando con la nueva opción 271*cdc822ddSCarlos Bilbao CONFIG apagada. 272*cdc822ddSCarlos Bilbao 273*cdc822ddSCarlos BilbaoPara resumir, necesita un commit que incluya: 274*cdc822ddSCarlos Bilbao 275*cdc822ddSCarlos Bilbao - una opción ``CONFIG`` para la nueva función, normalmente en ``init/Kconfig`` 276*cdc822ddSCarlos Bilbao - ``SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada 277*cdc822ddSCarlos Bilbao - El correspondiente prototipo en ``include/linux/syscalls.h`` 278*cdc822ddSCarlos Bilbao - Una entrada genérica en ``include/uapi/asm-generic/unistd.h`` 279*cdc822ddSCarlos Bilbao - fallback stub en ``kernel/sys_ni.c`` 280*cdc822ddSCarlos Bilbao 281*cdc822ddSCarlos Bilbao 282*cdc822ddSCarlos BilbaoImplementación de Llamada de Sistema x86 283*cdc822ddSCarlos Bilbao---------------------------------------- 284*cdc822ddSCarlos Bilbao 285*cdc822ddSCarlos BilbaoPara conectar su nueva llamada de sistema a plataformas x86, necesita 286*cdc822ddSCarlos Bilbaoactualizar las tablas maestras syscall. Asumiendo que su nueva llamada de 287*cdc822ddSCarlos Bilbaosistema ni es especial de alguna manera (revise abajo), esto involucra una 288*cdc822ddSCarlos Bilbaoentrada "común" (para x86_64 y x86_32) en 289*cdc822ddSCarlos Bilbaoarch/x86/entry/syscalls/syscall_64.tbl:: 290*cdc822ddSCarlos Bilbao 291*cdc822ddSCarlos Bilbao 333 common xyzz sys_xyzzy 292*cdc822ddSCarlos Bilbao 293*cdc822ddSCarlos Bilbaoy una entrada "i386" en ``arch/x86/entry/syscalls/syscall_32.tbl``:: 294*cdc822ddSCarlos Bilbao 295*cdc822ddSCarlos Bilbao 380 i386 xyzz sys_xyzzy 296*cdc822ddSCarlos Bilbao 297*cdc822ddSCarlos BilbaoDe nuevo, estos número son propensos de ser cambiados si hay conflictos en 298*cdc822ddSCarlos Bilbaola ventana de integración relevante. 299*cdc822ddSCarlos Bilbao 300*cdc822ddSCarlos Bilbao 301*cdc822ddSCarlos BilbaoCompatibilidad de Llamadas de Sistema (Genérica) 302*cdc822ddSCarlos Bilbao------------------------------------------------ 303*cdc822ddSCarlos Bilbao 304*cdc822ddSCarlos BilbaoPara la mayoría de llamadas al sistema la misma implementación 64-bit puede 305*cdc822ddSCarlos Bilbaoser invocada incluso cuando el programa de userspace es en si mismo 32-bit; 306*cdc822ddSCarlos Bilbaoincluso si los parámetros de la llamada de sistema incluyen un puntero 307*cdc822ddSCarlos Bilbaoexplícito, esto es manipulado de forma transparente. 308*cdc822ddSCarlos Bilbao 309*cdc822ddSCarlos BilbaoSin embargo, existe un par de situaciones donde se necesita una capa de 310*cdc822ddSCarlos Bilbaocompatibilidad para lidiar con las diferencias de tamaño entre 32-bit y 311*cdc822ddSCarlos Bilbao64-bit. 312*cdc822ddSCarlos Bilbao 313*cdc822ddSCarlos BilbaoLa primera es si el kernel 64-bit también soporta programas del userspace 314*cdc822ddSCarlos Bilbao32-bit, y por lo tanto necesita analizar areas de memoria del (``__user``) 315*cdc822ddSCarlos Bilbaoque podrían tener valores tanto 32-bit como 64-bit. En particular esto se 316*cdc822ddSCarlos Bilbaonecesita siempre que un argumento de la llamada a sistema es: 317*cdc822ddSCarlos Bilbao 318*cdc822ddSCarlos Bilbao - un puntero a un puntero 319*cdc822ddSCarlos Bilbao - un puntero a un struc conteniendo un puntero (por ejemplo 320*cdc822ddSCarlos Bilbao ``struct iovec __user *``) 321*cdc822ddSCarlos Bilbao - un puntero a un type entero de tamaño entero variable (``time_t``, 322*cdc822ddSCarlos Bilbao ``off_t``, ``long``, ...) 323*cdc822ddSCarlos Bilbao - un puntero a un struct conteniendo un type entero de tamaño variable. 324*cdc822ddSCarlos Bilbao 325*cdc822ddSCarlos BilbaoLa segunda situación que requiere una capa de compatibilidad es cuando uno 326*cdc822ddSCarlos Bilbaode los argumentos de la llamada a sistema tiene un argumento que es 327*cdc822ddSCarlos Bilbaoexplícitamente 64-bit incluso sobre arquitectura 32-bit, por ejemplo 328*cdc822ddSCarlos Bilbao``loff_t`` o ``__u64``. En este caso, el valor que llega a un kernel 64-bit 329*cdc822ddSCarlos Bilbaodesde una aplicación de 32-bit se separará en dos valores de 32-bit, los 330*cdc822ddSCarlos Bilbaoque luego necesitan ser reensamblados en la capa de compatibilidad. 331*cdc822ddSCarlos Bilbao 332*cdc822ddSCarlos Bilbao(Note que un argumento de una llamada a sistema que sea un puntero a un 333*cdc822ddSCarlos Bilbaotype explicitamente de 64-bit **no** necesita una capa de compatibilidad; 334*cdc822ddSCarlos Bilbaopor ejemplo, los argumentos de :manpage:`splice(2)`) del tipo 335*cdc822ddSCarlos Bilbao``loff_t __user *`` no significan la necesidad de una llamada a sistema 336*cdc822ddSCarlos Bilbao``compat_``.) 337*cdc822ddSCarlos Bilbao 338*cdc822ddSCarlos BilbaoLa versión compatible de la llamada de sistema se llama 339*cdc822ddSCarlos Bilbao``compat_sys_xyzzy()``, y se agrega con la macro 340*cdc822ddSCarlos Bilbao``COMPAT_SYSCALL_DEFINEn``, de manera análoga a SYSCALL_DEFINEn. Esta 341*cdc822ddSCarlos Bilbaoversión de la implementación se ejecuta como parte de un kernel de 64-bit, 342*cdc822ddSCarlos Bilbaopero espera recibir parametros con valores 32-bit y hace lo que tenga que 343*cdc822ddSCarlos Bilbaohacer para tratar con ellos. (Típicamente, la versión ``compat_sys_`` 344*cdc822ddSCarlos Bilbaoconvierte los valores a versiones de 64 bits y llama a la versión ``sys_`` 345*cdc822ddSCarlos Bilbaoo ambas llaman a una función de implementación interna común.) 346*cdc822ddSCarlos Bilbao 347*cdc822ddSCarlos BilbaoEl punto de entrada compat también necesita un prototipo de función 348*cdc822ddSCarlos Bilbaocorrespondiente, en ``include/linux/compat.h``, marcado como asmlinkage 349*cdc822ddSCarlos Bilbaopara igualar la forma en que las llamadas al sistema son invocadas:: 350*cdc822ddSCarlos Bilbao 351*cdc822ddSCarlos Bilbao asmlinkage long compat_sys_xyzzy(...); 352*cdc822ddSCarlos Bilbao 353*cdc822ddSCarlos BilbaoSi la nueva llamada al sistema involucra una estructura que que se dispone 354*cdc822ddSCarlos Bilbaode forma distinta en sistema de 32-bit y 64-bit, digamos 355*cdc822ddSCarlos Bilbao``struct xyzzy_args``, entonces el archivo de cabecera 356*cdc822ddSCarlos Bilbaoinclude/linux/compat.h también debería incluir una versión compatible de la 357*cdc822ddSCarlos Bilbaoestructura (``struct compat_xyzzy_args``) donde cada campo de tamaño 358*cdc822ddSCarlos Bilbaovariable tiene el tipo ``compat_`` apropiado que corresponde al tipo en 359*cdc822ddSCarlos Bilbao``struct xyzzy_args``. La rutina ``compat_sys_xyzzy()`` puede entonces usar 360*cdc822ddSCarlos Bilbaoesta estructura ``compat_`` para analizar los argumentos de una invocación 361*cdc822ddSCarlos Bilbaode 32-bit. 362*cdc822ddSCarlos Bilbao 363*cdc822ddSCarlos BilbaoPor ejemplo, si hay campos:: 364*cdc822ddSCarlos Bilbao 365*cdc822ddSCarlos Bilbao struct xyzzy_args { 366*cdc822ddSCarlos Bilbao const char __user *ptr; 367*cdc822ddSCarlos Bilbao __kernel_long_t varying_val; 368*cdc822ddSCarlos Bilbao u64 fixed_val; 369*cdc822ddSCarlos Bilbao /* ... */ 370*cdc822ddSCarlos Bilbao }; 371*cdc822ddSCarlos Bilbao 372*cdc822ddSCarlos Bilbaoen struct xyzzy_args, entonces struct compat_xyzzy_args debe tener:: 373*cdc822ddSCarlos Bilbao 374*cdc822ddSCarlos Bilbao struct compat_xyzzy_args { 375*cdc822ddSCarlos Bilbao compat_uptr_t ptr; 376*cdc822ddSCarlos Bilbao compat_long_t varying_val; 377*cdc822ddSCarlos Bilbao u64 fixed_val; 378*cdc822ddSCarlos Bilbao /* ... */ 379*cdc822ddSCarlos Bilbao }; 380*cdc822ddSCarlos Bilbao 381*cdc822ddSCarlos Bilbaola lista genérica de llamadas al sistema también necesita ajustes para 382*cdc822ddSCarlos Bilbaopermitir la versión compat; la entrada en 383*cdc822ddSCarlos Bilbao``include/uapi/asm-generic/unistd.h`` debería usar ``__SC_COMP`` en vez de 384*cdc822ddSCarlos Bilbao``__SYSCALL``:: 385*cdc822ddSCarlos Bilbao 386*cdc822ddSCarlos Bilbao #define __NR_xyzzy 292 387*cdc822ddSCarlos Bilbao __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy) 388*cdc822ddSCarlos Bilbao 389*cdc822ddSCarlos BilbaoPara resumir, necesita: 390*cdc822ddSCarlos Bilbao 391*cdc822ddSCarlos Bilbao - una ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada de compat. 392*cdc822ddSCarlos Bilbao - el prototipo correspondiente en ``include/linux/compat.h`` 393*cdc822ddSCarlos Bilbao - (en caso de ser necesario) un struct de mapeo de 32-bit en ``include/linux/compat.h`` 394*cdc822ddSCarlos Bilbao - una instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h`` 395*cdc822ddSCarlos Bilbao 396*cdc822ddSCarlos BilbaoCompatibilidad de Llamadas de Sistema (x86) 397*cdc822ddSCarlos Bilbao------------------------------------------- 398*cdc822ddSCarlos Bilbao 399*cdc822ddSCarlos BilbaoPara conectar la arquitectura x86 de una llamada al sistema con una versión 400*cdc822ddSCarlos Bilbaode compatibilidad, las entradas en las tablas de syscall deben ser 401*cdc822ddSCarlos Bilbaoajustadas. 402*cdc822ddSCarlos Bilbao 403*cdc822ddSCarlos BilbaoPrimero, la entrada en ``arch/x86/entry/syscalls/syscall_32.tbl`` recibe 404*cdc822ddSCarlos Bilbaouna columna extra para indicar que un programa del userspace de 32-bit 405*cdc822ddSCarlos Bilbaocorriendo en un kernel de 64-bit debe llegar al punto de entrada compat:: 406*cdc822ddSCarlos Bilbao 407*cdc822ddSCarlos Bilbao 380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy 408*cdc822ddSCarlos Bilbao 409*cdc822ddSCarlos BilbaoSegundo, tienes que averiguar qué debería pasar para la versión x32 ABI de 410*cdc822ddSCarlos Bilbaola nueva llamada al sistema. Aquí hay una elección: el diseño de los 411*cdc822ddSCarlos Bilbaoargumentos debería coincidir con la versión de 64-bit o la versión de 412*cdc822ddSCarlos Bilbao32-bit. 413*cdc822ddSCarlos Bilbao 414*cdc822ddSCarlos BilbaoSi hay involucrado un puntero-a-puntero, la decisión es fácil: x32 es 415*cdc822ddSCarlos BilbaoILP32, por lo que el diseño debe coincidir con la versión 32-bit, y la 416*cdc822ddSCarlos Bilbaoentrada en ``arch/x86/entry/syscalls/syscall_64.tbl`` se divide para que 417*cdc822ddSCarlos Bilbaoprogamas 32-bit lleguen al envoltorio de compatibilidad:: 418*cdc822ddSCarlos Bilbao 419*cdc822ddSCarlos Bilbao 333 64 xyzzy sys_xyzzy 420*cdc822ddSCarlos Bilbao ... 421*cdc822ddSCarlos Bilbao 555 x32 xyzzy __x32_compat_sys_xyzzy 422*cdc822ddSCarlos Bilbao 423*cdc822ddSCarlos BilbaoSi no hay punteros involucrados, entonces es preferible reutilizar el system 424*cdc822ddSCarlos Bilbaocall 64-bit para el x32 ABI (y consecuentemente la entrada en 425*cdc822ddSCarlos Bilbaoarch/x86/entry/syscalls/syscall_64.tbl no se cambia). 426*cdc822ddSCarlos Bilbao 427*cdc822ddSCarlos BilbaoEn cualquier caso, debes revisar que lo tipos involucrados en su diseño de 428*cdc822ddSCarlos Bilbaoargumentos de hecho asigne exactamente de x32 (-mx32) a 32-bit(-m32) o 429*cdc822ddSCarlos Bilbaoequivalentes 64-bit (-m64). 430*cdc822ddSCarlos Bilbao 431*cdc822ddSCarlos Bilbao 432*cdc822ddSCarlos BilbaoLlamadas de Sistema Retornando a Otros Lugares 433*cdc822ddSCarlos Bilbao---------------------------------------------- 434*cdc822ddSCarlos Bilbao 435*cdc822ddSCarlos BilbaoPara la mayoría de las llamadas al sistema, una vez que se la llamada al 436*cdc822ddSCarlos Bilbaosistema se ha completado el programa de usuario continúa exactamente donde 437*cdc822ddSCarlos Bilbaoquedó -- en la siguiente instrucción, con el stack igual y la mayoría de 438*cdc822ddSCarlos Bilbaolos registros igual que antes de la llamada al sistema, y con el mismo 439*cdc822ddSCarlos Bilbaoespacio en la memoria virtual. 440*cdc822ddSCarlos Bilbao 441*cdc822ddSCarlos BilbaoSin embargo, unas pocas llamadas al sistema hacen las cosas diferente. 442*cdc822ddSCarlos BilbaoEstas podrían retornar a una ubicación distinta (``rt_sigreturn``) o 443*cdc822ddSCarlos Bilbaocambiar el espacio de memoria (``fork``/``vfork``/``clone``) o incluso de 444*cdc822ddSCarlos Bilbaoarquitectura (``execve``/``execveat``) del programa. 445*cdc822ddSCarlos Bilbao 446*cdc822ddSCarlos BilbaoPara permitir esto, la implementación del kernel de la llamada al sistema 447*cdc822ddSCarlos Bilbaopodría necesitar guardar y restaurar registros adicionales al stak del 448*cdc822ddSCarlos Bilbaokernel, brindandole control completo de donde y cómo la ejecución continúa 449*cdc822ddSCarlos Bilbaodespués de la llamada a sistema. 450*cdc822ddSCarlos Bilbao 451*cdc822ddSCarlos BilbaoEsto es arch-specific, pero típicamente involucra definir puntos de entrada 452*cdc822ddSCarlos Bilbaoassembly que guardan/restauran registros adicionales e invocan el punto de 453*cdc822ddSCarlos Bilbaoentrada real de la llamada a sistema. 454*cdc822ddSCarlos Bilbao 455*cdc822ddSCarlos BilbaoPara x86_64, esto es implementado como un punto de entrada ``stub_xyzzy`` 456*cdc822ddSCarlos Bilbaoen ``arch/x86/entry/entry_64.S``, y la entrada en la tabla syscall 457*cdc822ddSCarlos Bilbao(``arch/x86/entry/syscalls/syscall_32.tbl``) es ajustada para calzar:: 458*cdc822ddSCarlos Bilbao 459*cdc822ddSCarlos Bilbao 333 common xyzzy stub_xyzzy 460*cdc822ddSCarlos Bilbao 461*cdc822ddSCarlos BilbaoEl equivalente para programas 32-bit corriendo en un kernel 64-bit es 462*cdc822ddSCarlos Bilbaonormalmente llamado ``stub32_xyzzy`` e implementado en 463*cdc822ddSCarlos Bilbao``arch/x86/entry/entry_64_compat.S``, con el correspondiente ajuste en la 464*cdc822ddSCarlos Bilbaotabla syscall en ``arch/x86/syscalls/syscall_32.tbl``:: 465*cdc822ddSCarlos Bilbao 466*cdc822ddSCarlos Bilbao 380 i386 xyzzy sys_xyzzy stub32_xyzzy 467*cdc822ddSCarlos Bilbao 468*cdc822ddSCarlos BilbaoSi la llamada a sistema necesita una capa de compatibilidad (como en la 469*cdc822ddSCarlos Bilbaosección anterior) entonces la versión ``stub32_`` necesita llamar a la 470*cdc822ddSCarlos Bilbaoversión ``compat_sys_`` de la llamada a sistema, en vez de la versión 471*cdc822ddSCarlos Bilbaonativa de 64-bit. También, si la implementación de la versión x32 ABI no es 472*cdc822ddSCarlos Bilbaocomun con la versión x86_64, entonces su tabla syscall también necesitará 473*cdc822ddSCarlos Bilbaoinvocar un stub que llame a la versión ``compat_sys_`` 474*cdc822ddSCarlos Bilbao 475*cdc822ddSCarlos BilbaoPara completar, también es agradable configurar un mapeo de modo que el 476*cdc822ddSCarlos Bilbaouser-mode linux todavía funcione -- su tabla syscall referenciará 477*cdc822ddSCarlos Bilbaostub_xyzzy, pero el UML construido no incluye una implementación 478*cdc822ddSCarlos Bilbao``arch/x86/entry/entry_64.S``. Arreglar esto es tan simple como agregar un 479*cdc822ddSCarlos Bilbao#define a ``arch/x86/um/sys_call_table_64.c``:: 480*cdc822ddSCarlos Bilbao 481*cdc822ddSCarlos Bilbao #define stub_xyzzy sys_xyzzy 482*cdc822ddSCarlos Bilbao 483*cdc822ddSCarlos Bilbao 484*cdc822ddSCarlos BilbaoOtros detalles 485*cdc822ddSCarlos Bilbao-------------- 486*cdc822ddSCarlos Bilbao 487*cdc822ddSCarlos BilbaoLa mayoría del kernel trata las llamadas a sistema de manera genérica, pero 488*cdc822ddSCarlos Bilbaoestá la excepción ocasional que pueda requerir actualización para su 489*cdc822ddSCarlos Bilbaollamada a sistema particular. 490*cdc822ddSCarlos Bilbao 491*cdc822ddSCarlos BilbaoEl subsistema de auditoría es un caso especial; este incluye funciones 492*cdc822ddSCarlos Bilbao(arch-specific) que clasifican algunos tipos especiales de llamadas al 493*cdc822ddSCarlos Bilbaosistema -- específicamente file open (``open``/``openat``), program 494*cdc822ddSCarlos Bilbaoexecution (``execve`` /``execveat``) o operaciones multiplexores de socket 495*cdc822ddSCarlos Bilbao(``socketcall``). Si su nueva llamada de sistema es análoga a alguna de 496*cdc822ddSCarlos Bilbaoestas, entonces el sistema auditor debe ser actualizado. 497*cdc822ddSCarlos Bilbao 498*cdc822ddSCarlos BilbaoMás generalmente, si existe una llamada al sistema que sea análoga a su 499*cdc822ddSCarlos Bilbaonueva llamada al sistema, entonces vale la pena hacer un grep a todo el 500*cdc822ddSCarlos Bilbaokernel de la llamada a sistema existente, para revisar que no exista otro 501*cdc822ddSCarlos Bilbaocaso especial. 502*cdc822ddSCarlos Bilbao 503*cdc822ddSCarlos Bilbao 504*cdc822ddSCarlos BilbaoTesting 505*cdc822ddSCarlos Bilbao------- 506*cdc822ddSCarlos Bilbao 507*cdc822ddSCarlos BilbaoUna nueva llamada al sistema debe obviamente ser probada; también es útil 508*cdc822ddSCarlos Bilbaoproveer a los revisores con una demostración de cómo los programas del 509*cdc822ddSCarlos Bilbaouserspace usarán la llamada al sistema. Una buena forma de combinar estos 510*cdc822ddSCarlos Bilbaoobjetivos es incluir un simple programa self-test en un nuevo directorio 511*cdc822ddSCarlos Bilbaobajo ``tools/testing/selftests/``. 512*cdc822ddSCarlos Bilbao 513*cdc822ddSCarlos BilbaoPara una nueva llamada al sistema, obviamente no habrá una función 514*cdc822ddSCarlos Bilbaoenvoltorio libc por lo que el test necesitará ser invocado usando 515*cdc822ddSCarlos Bilbao``syscall()``; también, si la llamada al sistema involucra una nueva 516*cdc822ddSCarlos Bilbaoestructura userspace-visible, el encabezado correspondiente necesitará ser 517*cdc822ddSCarlos Bilbaoinstalado para compilar el test. 518*cdc822ddSCarlos Bilbao 519*cdc822ddSCarlos BilbaoAsegure que selftest corra satisfactoriamente en todas las arquitecturas 520*cdc822ddSCarlos Bilbaosoportadas. Por ejemplo, revise si funciona cuando es compilado como un 521*cdc822ddSCarlos Bilbaox86_64 (-m64), x86_32 (-m32) y x32 (-mx32) programa ABI. 522*cdc822ddSCarlos Bilbao 523*cdc822ddSCarlos BilbaoPara pruebas más amplias y exhautivas de la nueva funcionalidad, también 524*cdc822ddSCarlos Bilbaodebería considerar agregar tests al Linus Test Project, o al proyecto 525*cdc822ddSCarlos Bilbaoxfstests para cambios filesystem-related 526*cdc822ddSCarlos Bilbao 527*cdc822ddSCarlos Bilbao - https://linux-test-project.github.io/ 528*cdc822ddSCarlos Bilbao - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git 529*cdc822ddSCarlos Bilbao 530*cdc822ddSCarlos Bilbao 531*cdc822ddSCarlos BilbaoMan Page 532*cdc822ddSCarlos Bilbao-------- 533*cdc822ddSCarlos Bilbao 534*cdc822ddSCarlos BilbaoTodas las llamada al sistema nueva deben venir con un man page completo, 535*cdc822ddSCarlos Bilbaoidealmente usando groff markup, pero texto plano también funciona. Si se 536*cdc822ddSCarlos Bilbaousa groff, es útil incluir una versión ASCII pre-renderizada del man-page 537*cdc822ddSCarlos Bilbaoen el cover del email para el patchset, para la conveniencia de los 538*cdc822ddSCarlos Bilbaorevisores. 539*cdc822ddSCarlos Bilbao 540*cdc822ddSCarlos BilbaoEl man page debe ser cc'do a linux-man@vger.kernel.org 541*cdc822ddSCarlos BilbaoPara más detalles, revise https://www.kernel.org/doc/man-pages/patches.html 542*cdc822ddSCarlos Bilbao 543*cdc822ddSCarlos Bilbao 544*cdc822ddSCarlos BilbaoNo invoque las llamadas de sistemas en el kernel 545*cdc822ddSCarlos Bilbao------------------------------------------------ 546*cdc822ddSCarlos Bilbao 547*cdc822ddSCarlos BilbaoLas llamadas al sistema son, cómo se declaró más arriba, puntos de 548*cdc822ddSCarlos Bilbaointeracción entre el userspace y el kernel. Por lo tanto, las funciones de 549*cdc822ddSCarlos Bilbaollamada al sistema como ``sys_xyzzy()`` o ``compat_sys_xyzzy()`` deberían 550*cdc822ddSCarlos Bilbaoser llamadas sólo desde el userspace vía la tabla de syscall, pero no de 551*cdc822ddSCarlos Bilbaootro lugar en el kernel. Si la funcionalidad syscall es útil para ser usada 552*cdc822ddSCarlos Bilbaodentro del kernel, necesita ser compartida entre syscalls nuevas o 553*cdc822ddSCarlos Bilbaoantiguas, o necesita ser compartida entre una syscall y su variante de 554*cdc822ddSCarlos Bilbaocompatibilidad, esta debería ser implementada mediante una función "helper" 555*cdc822ddSCarlos Bilbao(como ``ksys_xyzzy()``). Esta función del kernel puede ahora ser llamada 556*cdc822ddSCarlos Bilbaodentro del syscall stub (``sys_xyzzy()``), la syscall stub de 557*cdc822ddSCarlos Bilbaocompatibilidad (``compat_sys_xyzzy()``), y/o otro código del kernel. 558*cdc822ddSCarlos Bilbao 559*cdc822ddSCarlos BilbaoAl menos en 64-bit x86, será un requerimiento duro desde la v4.17 en 560*cdc822ddSCarlos Bilbaoadelante no invocar funciones de llamada al sistema (system call) en el 561*cdc822ddSCarlos Bilbaokernel. Este usa una convención de llamada diferente para llamadas al 562*cdc822ddSCarlos Bilbaosistema donde ``struct pt_regs`` es decodificado on-the-fly en un 563*cdc822ddSCarlos Bilbaoenvoltorio syscall que luego entrega el procesamiento al syscall real. Esto 564*cdc822ddSCarlos Bilbaosignifica que sólo aquellos parámetros que son realmente necesarios para 565*cdc822ddSCarlos Bilbaouna syscall específica son pasados durante la entrada del syscall, en vez 566*cdc822ddSCarlos Bilbaode llenar en seis registros de CPU con contenido random del userspace todo 567*cdc822ddSCarlos Bilbaoel tiempo (los cuales podrían causar serios problemas bajando la cadena de 568*cdc822ddSCarlos Bilbaollamadas). 569*cdc822ddSCarlos Bilbao 570*cdc822ddSCarlos BilbaoMás aún, reglas sobre cómo se debería acceder a la data pueden diferir 571*cdc822ddSCarlos Bilbaoentre la data del kernel y la data de usuario. Esta es otra razón por la 572*cdc822ddSCarlos Bilbaocual llamar a ``sys_xyzzy()`` es generalmente una mala idea. 573*cdc822ddSCarlos Bilbao 574*cdc822ddSCarlos BilbaoExcepciones a esta regla están permitidas solamente en overrides 575*cdc822ddSCarlos Bilbaoespecíficos de arquitectura, envoltorios de compatibilidad específicos de 576*cdc822ddSCarlos Bilbaoarquitectura, u otro código en arch/. 577*cdc822ddSCarlos Bilbao 578*cdc822ddSCarlos Bilbao 579*cdc822ddSCarlos BilbaoReferencias y fuentes 580*cdc822ddSCarlos Bilbao--------------------- 581*cdc822ddSCarlos Bilbao 582*cdc822ddSCarlos Bilbao - Artículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al 583*cdc822ddSCarlos Bilbao sistema: 584*cdc822ddSCarlos Bilbao https://lwn.net/Articles/585415/ 585*cdc822ddSCarlos Bilbao - Artículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una 586*cdc822ddSCarlos Bilbao llamada al sistema: https://lwn.net/Articles/588444/ 587*cdc822ddSCarlos Bilbao - Artículo LWN de Jake Edge describiendo restricciones en argumentos en 588*cdc822ddSCarlos Bilbao 64-bit system call: https://lwn.net/Articles/311630/ 589*cdc822ddSCarlos Bilbao - Par de artículos LWN de David Drysdale que describen la ruta de implementación 590*cdc822ddSCarlos Bilbao de llamadas al sistema en detalle para v3.14: 591*cdc822ddSCarlos Bilbao 592*cdc822ddSCarlos Bilbao - https://lwn.net/Articles/604287/ 593*cdc822ddSCarlos Bilbao - https://lwn.net/Articles/604515/ 594*cdc822ddSCarlos Bilbao 595*cdc822ddSCarlos Bilbao - Requerimientos arquitectura-específicos para llamadas al sistema son discutidos en el 596*cdc822ddSCarlos Bilbao :manpage:`syscall(2)` man-page: 597*cdc822ddSCarlos Bilbao http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES 598*cdc822ddSCarlos Bilbao - Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: 599*cdc822ddSCarlos Bilbao https://yarchive.net/comp/linux/ioctl.html 600*cdc822ddSCarlos Bilbao - "How to not invent kernel interfaces", Arnd Bergmann, 601*cdc822ddSCarlos Bilbao https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf 602*cdc822ddSCarlos Bilbao - Artículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: 603*cdc822ddSCarlos Bilbao https://lwn.net/Articles/486306/ 604*cdc822ddSCarlos Bilbao - Recomendaciones de Andrew Morton que toda la información relacionada a una nueva 605*cdc822ddSCarlos Bilbao llamada al sistema debe venir en el mismo hilo de correos: 606*cdc822ddSCarlos Bilbao https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org 607*cdc822ddSCarlos Bilbao - Recomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir 608*cdc822ddSCarlos Bilbao con un man-page: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com 609*cdc822ddSCarlos Bilbao - Sugerencias de Thomas Gleixner que conexiones x86 deben ir en commits 610*cdc822ddSCarlos Bilbao separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos 611*cdc822ddSCarlos Bilbao - Sugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema 612*cdc822ddSCarlos Bilbao que vengan con man-page y selftest: https://lore.kernel.org/r/20140320025530.GA25469@kroah.com 613*cdc822ddSCarlos Bilbao - Discusión de Michael Kerrisk de nuevas system call vs. extensiones :manpage:`prctl(2)`: 614*cdc822ddSCarlos Bilbao https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com 615*cdc822ddSCarlos Bilbao - Sugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples 616*cdc822ddSCarlos Bilbao argumentos deben encapsular estos argumentos en una estructura, la cual incluye 617*cdc822ddSCarlos Bilbao un campo de tamaño para futura extensibilidad: https://lore.kernel.org/r/20150730083831.GA22182@gmail.com 618*cdc822ddSCarlos Bilbao - Enumerando rarezas por la (re-)utilización de O_* numbering space flags: 619*cdc822ddSCarlos Bilbao 620*cdc822ddSCarlos Bilbao - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness 621*cdc822ddSCarlos Bilbao check") 622*cdc822ddSCarlos Bilbao - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc 623*cdc822ddSCarlos Bilbao conflict") 624*cdc822ddSCarlos Bilbao - commit bb458c644a59 ("Safer ABI for O_TMPFILE") 625*cdc822ddSCarlos Bilbao 626*cdc822ddSCarlos Bilbao - Discusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: 627*cdc822ddSCarlos Bilbao https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org 628*cdc822ddSCarlos Bilbao - Recomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser 629*cdc822ddSCarlos Bilbao vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com 630*cdc822ddSCarlos Bilbao - Recomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer 631*cdc822ddSCarlos Bilbao compatibilidad con versiones 64-bit sobre versiones 32-bit: 632*cdc822ddSCarlos Bilbao https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com 633