162306a36Sopenharmony_ci.. include:: ../disclaimer-sp.rst 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci:Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>` 462306a36Sopenharmony_ci:Translator: Mauricio Fuentes <mauriciofb@gmail.com> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci.. _sp_addsyscalls: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciAgregando una Nueva Llamada del Sistema 962306a36Sopenharmony_ci======================================= 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciEste documento describe qué involucra agregar una nueva llamada del sistema 1262306a36Sopenharmony_cial kernel Linux, más allá de la presentación y consejos normales en 1362306a36Sopenharmony_ci:ref:`Documentation/process/submitting-patches.rst <submittingpatches>` que 1462306a36Sopenharmony_citambién puede encontrar traducido a este idioma. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciAlternativas a Llamadas del Sistema 1762306a36Sopenharmony_ci----------------------------------- 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciLa primera cosa a considerar cuando se agrega una llamada al sistema es si 2062306a36Sopenharmony_cialguna alternativa es adecuada en su lugar. Aunque las llamadas al sistema 2162306a36Sopenharmony_cison los puntos de interacción entre el userspace y el kernel más obvios y 2262306a36Sopenharmony_citradicionales, existen otras posibilidades -- elija la que mejor se adecúe 2362306a36Sopenharmony_cia su interfaz. 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci - Si se puede hacer que la operación se parezca a un objeto filesystem, 2662306a36Sopenharmony_ci podría tener más sentido crear un nuevo sistema de ficheros o 2762306a36Sopenharmony_ci dispositivo. Esto también hará más fácil encapsular la nueva 2862306a36Sopenharmony_ci funcionalidad en un módulo del kernel en vez de requerir que sea 2962306a36Sopenharmony_ci construido junto al kernel principal. 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci - Si la nueva funcionalidad involucra operaciones donde el kernel 3262306a36Sopenharmony_ci notifica al userspace que algo ha pasado, entonces retornar un nuevo 3362306a36Sopenharmony_ci descriptor de archivo para el objeto relevante permite al userspace 3462306a36Sopenharmony_ci usar ``poll``/``select``/``epoll`` para recibir esta notificación. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci - Sin embargo, operaciones que no mapean a operaciones similares a 3762306a36Sopenharmony_ci :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas 3862306a36Sopenharmony_ci como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un 3962306a36Sopenharmony_ci API algo opaca. 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci - Si sólo está exponiendo información del runtime, un nuevo nodo en sysfs 4262306a36Sopenharmony_ci (mire ``Documentation/filesystems/sysfs.rst``) o el filesystem ``/proc`` 4362306a36Sopenharmony_ci podría ser más adecuado. Sin embargo, acceder a estos mecanismos 4462306a36Sopenharmony_ci requiere que el filesystem relevante esté montado, lo que podría no ser 4562306a36Sopenharmony_ci siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). 4662306a36Sopenharmony_ci Evite agregar cualquier API a debugfs, ya que no se considera una 4762306a36Sopenharmony_ci interfaz (interface) de 'producción' para el userspace. 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci - Si la operación es específica a un archivo o descriptor de archivo 5062306a36Sopenharmony_ci específico, entonces la opción de comando adicional :manpage:`fcntl(2)` 5162306a36Sopenharmony_ci podría ser más apropiada. Sin embargo, :manpage:`fcntl(2)` es una 5262306a36Sopenharmony_ci llamada al sistema multiplexada que esconde mucha complejidad, así que 5362306a36Sopenharmony_ci esta opción es mejor cuando la nueva funcion es analogamente cercana a 5462306a36Sopenharmony_ci la funcionalidad existente :manpage:`fcntl(2)`, o la nueva funcionalidad 5562306a36Sopenharmony_ci es muy simple (por ejemplo, definir/obtener un flag simple relacionado a 5662306a36Sopenharmony_ci un descriptor de archivo). 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci - Si la operación es específica a un proceso o tarea particular, entonces 5962306a36Sopenharmony_ci un comando adicional :manpage:`prctl(2)` podría ser más apropiado. Tal 6062306a36Sopenharmony_ci como con :manpage:`fcntl(2)`, esta llamada al sistema es un multiplexor 6162306a36Sopenharmony_ci complicado así que está reservado para comandos análogamente cercanos 6262306a36Sopenharmony_ci del existente ``prctl()`` u obtener/definir un flag simple relacionado a 6362306a36Sopenharmony_ci un proceso. 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciDiseñando el API: Planeando para extensiones 6662306a36Sopenharmony_ci-------------------------------------------- 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciUna nueva llamada del sistema forma parte del API del kernel, y tiene que 6962306a36Sopenharmony_ciser soportada indefinidamente. Como tal, es una muy buena idea discutir 7062306a36Sopenharmony_ciexplícitamente el interface en las listas de correo del kernel, y es 7162306a36Sopenharmony_ciimportante planear para futuras extensiones del interface. 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci(La tabla syscall está poblada con ejemplos históricos donde esto no se 7462306a36Sopenharmony_cihizo, junto con los correspondientes seguimientos de los system calls -- 7562306a36Sopenharmony_ci``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, 7662306a36Sopenharmony_ci``pipe``/``pipe2``, ``renameat``/``renameat2`` -- así que aprenda de la 7762306a36Sopenharmony_cihistoria del kernel y planee extensiones desde el inicio.) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciPara llamadas al sistema más simples que sólo toman un par de argumentos, 8062306a36Sopenharmony_cila forma preferida de permitir futuras extensiones es incluir un argumento 8162306a36Sopenharmony_ciflag a la llamada al sistema. Para asegurarse que el userspace pueda usar 8262306a36Sopenharmony_cide forma segura estos flags entre versiones del kernel, revise si los flags 8362306a36Sopenharmony_cicontienen cualquier flag desconocido, y rechace la llamada al sistema (con 8462306a36Sopenharmony_ci``EINVAL``) si ocurre:: 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci if (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) 8762306a36Sopenharmony_ci return -EINVAL; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci(Si no hay valores de flags usados aún, revise que los argumentos del flag 9062306a36Sopenharmony_cisean cero.) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciPara llamadas al sistema más sofisticadas que involucran un gran número de 9362306a36Sopenharmony_ciargumentos, es preferible encapsular la mayoría de los argumentos en una 9462306a36Sopenharmony_ciestructura que sea pasada a través de un puntero. Tal estructura puede 9562306a36Sopenharmony_cihacer frente a futuras extensiones mediante la inclusión de un argumento de 9662306a36Sopenharmony_citamaño en la estructura:: 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci struct xyzzy_params { 9962306a36Sopenharmony_ci u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ 10062306a36Sopenharmony_ci u32 param_1; 10162306a36Sopenharmony_ci u64 param_2; 10262306a36Sopenharmony_ci u64 param_3; 10362306a36Sopenharmony_ci }; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ciSiempre que cualquier campo añadido subsecuente, digamos ``param_4``, sea 10662306a36Sopenharmony_cidiseñado de forma tal que un valor cero, devuelva el comportamiento previo, 10762306a36Sopenharmony_cientonces permite versiones no coincidentes en ambos sentidos: 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci - Para hacer frente a programas del userspace más modernos, haciendo 11062306a36Sopenharmony_ci llamadas a un kernel más antiguo, el código del kernel debe revisar que 11162306a36Sopenharmony_ci cualquier memoria más allá del tamaño de la estructura sea cero (revisar 11262306a36Sopenharmony_ci de manera efectiva que ``param_4 == 0``). 11362306a36Sopenharmony_ci - Para hacer frente a programas antiguos del userspace haciendo llamadas a 11462306a36Sopenharmony_ci un kernel más nuevo, el código del kernel puede extender con ceros, una 11562306a36Sopenharmony_ci instancia más pequeña de la estructura (definiendo efectivamente 11662306a36Sopenharmony_ci ``param_4 == 0``). 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciRevise :manpage:`perf_event_open(2)` y la función ``perf_copy_attr()`` (en 11962306a36Sopenharmony_ci``kernel/events/code.c``) para un ejemplo de esta aproximación. 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ciDiseñando el API: Otras consideraciones 12362306a36Sopenharmony_ci--------------------------------------- 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ciSi su nueva llamada al sistema permite al userspace hacer referencia a un 12662306a36Sopenharmony_ciobjeto del kernel, esta debería usar un descriptor de archivo como el 12762306a36Sopenharmony_cimanipulador de ese objeto -- no invente un nuevo tipo de objeto manipulador 12862306a36Sopenharmony_ciuserspace cuando el kernel ya tiene mecanismos y semánticas bien definidas 12962306a36Sopenharmony_cipara usar los descriptores de archivos. 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ciSi su nueva llamada a sistema :manpage:`xyzzy(2)` retorna un nuevo 13262306a36Sopenharmony_cidescriptor de archivo, entonces el argumento flag debe incluir un valor que 13362306a36Sopenharmony_cisea equivalente a definir ``O_CLOEXEC`` en el nuevo FD. Esto hace posible 13462306a36Sopenharmony_cial userspace acortar la brecha de tiempo entre ``xyzzy()`` y la llamada a 13562306a36Sopenharmony_ci``fcntl(fd, F_SETFD, FD_CLOEXEC)``, donde un ``fork()`` inesperado y 13662306a36Sopenharmony_ci``execve()`` en otro hilo podrían filtrar un descriptor al programa 13762306a36Sopenharmony_ciejecutado. (Sin embargo, resista la tentación de reusar el valor actual de 13862306a36Sopenharmony_cila constante ``O_CLOEXEC``, ya que es específica de la arquitectura y es 13962306a36Sopenharmony_ciparte de un espacio numerado de flags ``O_*`` que está bastante lleno.) 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciSi su llamada de sistema retorna un nuevo descriptor de archivo, debería 14262306a36Sopenharmony_ciconsiderar también que significa usar la familia de llamadas de sistema 14362306a36Sopenharmony_ci:manpage:`poll(2)` en ese descriptor de archivo. Hacer un descriptor de 14462306a36Sopenharmony_ciarchivo listo para leer o escribir es la forma normal para que el kernel 14562306a36Sopenharmony_ciindique al espacio de usuario que un evento ha ocurrido en el 14662306a36Sopenharmony_cicorrespondiente objeto del kernel. 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra algún nombre 14962306a36Sopenharmony_cide archivo como argumento:: 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci int sys_xyzzy(const char __user *path, ..., unsigned int flags); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cidebería considerar también si una versión :manpage:`xyzzyat(2)` es mas 15462306a36Sopenharmony_ciapropiada:: 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ciEsto permite más flexibilidad en como el userspace especifica el archivo en 15962306a36Sopenharmony_cicuestión; en particular esto permite al userspace pedir la funcionalidad a 16062306a36Sopenharmony_ciun descriptor de archivo ya abierto usando el flag ``AT_EMPTY_PATH``, 16162306a36Sopenharmony_ciefectivamente dando una operación :manpage:`fxyzzy(3)` gratis:: 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci - xyzzyat(AT_FDCWD, path, ..., 0) es equivalente a xyzzy(path, ...) 16462306a36Sopenharmony_ci - xyzzyat(fd, "", ..., AT_EMPTY_PATH) es equivalente a fxyzzy(fd, ...) 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci(Para más detalles sobre la explicación racional de las llamadas \*at(), 16762306a36Sopenharmony_cirevise el man page :manpage:`openat(2)`; para un ejemplo de AT_EMPTY_PATH, 16862306a36Sopenharmony_cimire el man page :manpage:`fstatat(2)` manpage.) 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra un parámetro 17162306a36Sopenharmony_cidescribiendo un describiendo un movimiento dentro de un archivo, ponga de 17262306a36Sopenharmony_citipo ``loff_t`` para que movimientos de 64-bit puedan ser soportados 17362306a36Sopenharmony_ciincluso en arquitecturas de 32-bit. 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ciSi su nueva llamada de sistema :manpage:`xyzzy` involucra una 17662306a36Sopenharmony_cifuncionalidad privilegiada, esta necesita ser gobernada por la capability 17762306a36Sopenharmony_cibit linux apropiada (revisado con una llamada a ``capable()``), como se 17862306a36Sopenharmony_cidescribe en el man page :manpage:`capabilities(7)`. Elija una parte de 17962306a36Sopenharmony_cicapability linux que govierne las funcionalidades relacionadas, pero trate 18062306a36Sopenharmony_cide evitar combinar muchas funciones sólo relacionadas vagamente bajo la 18162306a36Sopenharmony_cimisma sección, ya que va en contra de los propósitos de las capabilities de 18262306a36Sopenharmony_cidividir el poder del usuario root. En particular, evite agregar nuevos usos 18362306a36Sopenharmony_cide la capacidad ya demasiado general de la capabilities ``CAP_SYS_ADMIN``. 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ciSi su nueva llamada de sistema :manpage:`xyzzy(2)` manipula un proceso que 18662306a36Sopenharmony_cino es el proceso invocado, este debería ser restringido (usando una llamada 18762306a36Sopenharmony_cia ``ptrace_may_access()``) de forma que el único proceso con los mismos 18862306a36Sopenharmony_cipermisos del proceso objetivo, o con las capacidades (capabilities) 18962306a36Sopenharmony_cinecesarias, pueda manipulador el proceso objetivo. 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ciFinalmente, debe ser conciente de que algunas arquitecturas no-x86 tienen 19262306a36Sopenharmony_ciun manejo más sencillo si los parámetros que son explícitamente 64-bit 19362306a36Sopenharmony_cicaigan en argumentos enumerados impares (i.e. parámetros 1,3,5), para 19462306a36Sopenharmony_cipermitir el uso de pares contiguos de registros 32-bits. (Este cuidado no 19562306a36Sopenharmony_ciaplica si el argumento es parte de una estructura que se pasa a través de 19662306a36Sopenharmony_ciun puntero.) 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ciProponiendo el API 19962306a36Sopenharmony_ci------------------ 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ciPara hacer una nueva llamada al sistema fácil de revisar, es mejor dividir 20262306a36Sopenharmony_ciel patchset (conjunto de parches) en trozos separados. Estos deberían 20362306a36Sopenharmony_ciincluir al menos los siguientes items como commits distintos (cada uno de 20462306a36Sopenharmony_cilos cuales se describirá más abajo): 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci - La implementación central de la llamada al sistema, junto con 20762306a36Sopenharmony_ci prototipos, numeración genérica, cambios Kconfig e implementaciones de 20862306a36Sopenharmony_ci rutinas de respaldo (fallback stub) 20962306a36Sopenharmony_ci - Conectar la nueva llamada a sistema a una arquitectura particular, 21062306a36Sopenharmony_ci usualmente x86 (incluyendo todas las x86_64, x86_32 y x32). 21162306a36Sopenharmony_ci - Una demostración del use de la nueva llamada a sistema en el userspace 21262306a36Sopenharmony_ci vía un selftest en ``tools/testing/selftest/``. 21362306a36Sopenharmony_ci - Un borrador de man-page para la nueva llamada a sistema, ya sea como 21462306a36Sopenharmony_ci texto plano en la carta de presentación, o como un parche (separado) 21562306a36Sopenharmony_ci para el repositorio man-pages. 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ciNuevas propuestas de llamadas de sistema, como cualquier cambio al API del 21862306a36Sopenharmony_cikernel, debería siempre ser copiado a linux-api@vger.kernel.org. 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ciImplementation de Llamada de Sistema Generica 22262306a36Sopenharmony_ci--------------------------------------------- 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ciLa entrada principal a su nueva llamada de sistema :manpage:`xyzzy(2)` será 22562306a36Sopenharmony_cillamada ``sys_xyzzy()``, pero incluya este punto de entrada con la macro 22662306a36Sopenharmony_ci``SYSCALL_DEFINEn()`` apropiada en vez de explicitamente. El 'n' indica el 22762306a36Sopenharmony_cinumero de argumentos de la llamada de sistema, y la macro toma el nombre de 22862306a36Sopenharmony_cila llamada de sistema seguida por el par (tipo, nombre) para los parámetros 22962306a36Sopenharmony_cicomo argumentos. Usar esta macro permite a la metadata de la nueva llamada 23062306a36Sopenharmony_cide sistema estar disponible para otras herramientas. 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ciEl nuevo punto de entrada también necesita un prototipo de función 23362306a36Sopenharmony_cicorrespondiente en ``include/linux/syscalls.h``, marcado como asmlinkage 23462306a36Sopenharmony_cipara calzar en la manera en que las llamadas de sistema son invocadas:: 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci asmlinkage long sys_xyzzy(...); 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ciAlgunas arquitecturas (e.g. x86) tienen sus propias tablas de syscall 23962306a36Sopenharmony_ciespecíficas para la arquitectura, pero muchas otras arquitecturas comparten 24062306a36Sopenharmony_ciuna tabla de syscall genéricas. Agrega su nueva llamada de sistema a la 24162306a36Sopenharmony_cilista genérica agregando una entrada a la lista en 24262306a36Sopenharmony_ci``include/uapi/asm-generic/unistd.h``:: 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci #define __NR_xyzzy 292 24562306a36Sopenharmony_ci __SYSCALL(__NR_xyzzy, sys_xyzzy ) 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ciTambién actualice el conteo de __NR_syscalls para reflejar la llamada de 24862306a36Sopenharmony_cisistema adicional, y note que si multiples llamadas de sistema nuevas son 24962306a36Sopenharmony_ciañadidas en la misma ventana unida, su nueva llamada de sistema podría 25062306a36Sopenharmony_citener que ser ajustada para resolver conflictos. 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ciEl archivo ``kernel/sys_ni.c`` provee una implementación fallback stub 25362306a36Sopenharmony_ci(rutina de respaldo) para cada llamada de sistema, retornando ``-ENOSYS``. 25462306a36Sopenharmony_ciIncluya su nueva llamada a sistema aquí también:: 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci COND_SYSCALL(xyzzy); 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ciSu nueva funcionalidad del kernel, y la llamada de sistema que la controla, 25962306a36Sopenharmony_cidebería normalmente ser opcional, así que incluya una opción ``CONFIG`` 26062306a36Sopenharmony_ci(tipicamente en ``init/Kconfig``) para ella. Como es usual para opciones 26162306a36Sopenharmony_ci``CONFIG`` nuevas: 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci - Incluya una descripción para la nueva funcionalidad y llamada al sistema 26462306a36Sopenharmony_ci controlada por la opción. 26562306a36Sopenharmony_ci - Haga la opción dependiendo de EXPERT si esta debe estar escondida de los 26662306a36Sopenharmony_ci usuarios normales. 26762306a36Sopenharmony_ci - Haga que cualquier nuevo archivo fuente que implemente la función 26862306a36Sopenharmony_ci dependa de la opción CONFIG en el Makefile (e.g. 26962306a36Sopenharmony_ci ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). 27062306a36Sopenharmony_ci - Revise dos veces que el kernel se siga compilando con la nueva opción 27162306a36Sopenharmony_ci CONFIG apagada. 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ciPara resumir, necesita un commit que incluya: 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci - una opción ``CONFIG`` para la nueva función, normalmente en ``init/Kconfig`` 27662306a36Sopenharmony_ci - ``SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada 27762306a36Sopenharmony_ci - El correspondiente prototipo en ``include/linux/syscalls.h`` 27862306a36Sopenharmony_ci - Una entrada genérica en ``include/uapi/asm-generic/unistd.h`` 27962306a36Sopenharmony_ci - fallback stub en ``kernel/sys_ni.c`` 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ciImplementación de Llamada de Sistema x86 28362306a36Sopenharmony_ci---------------------------------------- 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ciPara conectar su nueva llamada de sistema a plataformas x86, necesita 28662306a36Sopenharmony_ciactualizar las tablas maestras syscall. Asumiendo que su nueva llamada de 28762306a36Sopenharmony_cisistema ni es especial de alguna manera (revise abajo), esto involucra una 28862306a36Sopenharmony_cientrada "común" (para x86_64 y x86_32) en 28962306a36Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl:: 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci 333 common xyzz sys_xyzzy 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ciy una entrada "i386" en ``arch/x86/entry/syscalls/syscall_32.tbl``:: 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci 380 i386 xyzz sys_xyzzy 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ciDe nuevo, estos número son propensos de ser cambiados si hay conflictos en 29862306a36Sopenharmony_cila ventana de integración relevante. 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ciCompatibilidad de Llamadas de Sistema (Genérica) 30262306a36Sopenharmony_ci------------------------------------------------ 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ciPara la mayoría de llamadas al sistema la misma implementación 64-bit puede 30562306a36Sopenharmony_ciser invocada incluso cuando el programa de userspace es en si mismo 32-bit; 30662306a36Sopenharmony_ciincluso si los parámetros de la llamada de sistema incluyen un puntero 30762306a36Sopenharmony_ciexplícito, esto es manipulado de forma transparente. 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ciSin embargo, existe un par de situaciones donde se necesita una capa de 31062306a36Sopenharmony_cicompatibilidad para lidiar con las diferencias de tamaño entre 32-bit y 31162306a36Sopenharmony_ci64-bit. 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ciLa primera es si el kernel 64-bit también soporta programas del userspace 31462306a36Sopenharmony_ci32-bit, y por lo tanto necesita analizar areas de memoria del (``__user``) 31562306a36Sopenharmony_cique podrían tener valores tanto 32-bit como 64-bit. En particular esto se 31662306a36Sopenharmony_cinecesita siempre que un argumento de la llamada a sistema es: 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci - un puntero a un puntero 31962306a36Sopenharmony_ci - un puntero a un struc conteniendo un puntero (por ejemplo 32062306a36Sopenharmony_ci ``struct iovec __user *``) 32162306a36Sopenharmony_ci - un puntero a un type entero de tamaño entero variable (``time_t``, 32262306a36Sopenharmony_ci ``off_t``, ``long``, ...) 32362306a36Sopenharmony_ci - un puntero a un struct conteniendo un type entero de tamaño variable. 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciLa segunda situación que requiere una capa de compatibilidad es cuando uno 32662306a36Sopenharmony_cide los argumentos de la llamada a sistema tiene un argumento que es 32762306a36Sopenharmony_ciexplícitamente 64-bit incluso sobre arquitectura 32-bit, por ejemplo 32862306a36Sopenharmony_ci``loff_t`` o ``__u64``. En este caso, el valor que llega a un kernel 64-bit 32962306a36Sopenharmony_cidesde una aplicación de 32-bit se separará en dos valores de 32-bit, los 33062306a36Sopenharmony_cique luego necesitan ser reensamblados en la capa de compatibilidad. 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci(Note que un argumento de una llamada a sistema que sea un puntero a un 33362306a36Sopenharmony_citype explicitamente de 64-bit **no** necesita una capa de compatibilidad; 33462306a36Sopenharmony_cipor ejemplo, los argumentos de :manpage:`splice(2)`) del tipo 33562306a36Sopenharmony_ci``loff_t __user *`` no significan la necesidad de una llamada a sistema 33662306a36Sopenharmony_ci``compat_``.) 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ciLa versión compatible de la llamada de sistema se llama 33962306a36Sopenharmony_ci``compat_sys_xyzzy()``, y se agrega con la macro 34062306a36Sopenharmony_ci``COMPAT_SYSCALL_DEFINEn``, de manera análoga a SYSCALL_DEFINEn. Esta 34162306a36Sopenharmony_civersión de la implementación se ejecuta como parte de un kernel de 64-bit, 34262306a36Sopenharmony_cipero espera recibir parametros con valores 32-bit y hace lo que tenga que 34362306a36Sopenharmony_cihacer para tratar con ellos. (Típicamente, la versión ``compat_sys_`` 34462306a36Sopenharmony_ciconvierte los valores a versiones de 64 bits y llama a la versión ``sys_`` 34562306a36Sopenharmony_cio ambas llaman a una función de implementación interna común.) 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ciEl punto de entrada compat también necesita un prototipo de función 34862306a36Sopenharmony_cicorrespondiente, en ``include/linux/compat.h``, marcado como asmlinkage 34962306a36Sopenharmony_cipara igualar la forma en que las llamadas al sistema son invocadas:: 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci asmlinkage long compat_sys_xyzzy(...); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ciSi la nueva llamada al sistema involucra una estructura que que se dispone 35462306a36Sopenharmony_cide forma distinta en sistema de 32-bit y 64-bit, digamos 35562306a36Sopenharmony_ci``struct xyzzy_args``, entonces el archivo de cabecera 35662306a36Sopenharmony_ciinclude/linux/compat.h también debería incluir una versión compatible de la 35762306a36Sopenharmony_ciestructura (``struct compat_xyzzy_args``) donde cada campo de tamaño 35862306a36Sopenharmony_civariable tiene el tipo ``compat_`` apropiado que corresponde al tipo en 35962306a36Sopenharmony_ci``struct xyzzy_args``. La rutina ``compat_sys_xyzzy()`` puede entonces usar 36062306a36Sopenharmony_ciesta estructura ``compat_`` para analizar los argumentos de una invocación 36162306a36Sopenharmony_cide 32-bit. 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ciPor ejemplo, si hay campos:: 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci struct xyzzy_args { 36662306a36Sopenharmony_ci const char __user *ptr; 36762306a36Sopenharmony_ci __kernel_long_t varying_val; 36862306a36Sopenharmony_ci u64 fixed_val; 36962306a36Sopenharmony_ci /* ... */ 37062306a36Sopenharmony_ci }; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cien struct xyzzy_args, entonces struct compat_xyzzy_args debe tener:: 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci struct compat_xyzzy_args { 37562306a36Sopenharmony_ci compat_uptr_t ptr; 37662306a36Sopenharmony_ci compat_long_t varying_val; 37762306a36Sopenharmony_ci u64 fixed_val; 37862306a36Sopenharmony_ci /* ... */ 37962306a36Sopenharmony_ci }; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cila lista genérica de llamadas al sistema también necesita ajustes para 38262306a36Sopenharmony_cipermitir la versión compat; la entrada en 38362306a36Sopenharmony_ci``include/uapi/asm-generic/unistd.h`` debería usar ``__SC_COMP`` en vez de 38462306a36Sopenharmony_ci``__SYSCALL``:: 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci #define __NR_xyzzy 292 38762306a36Sopenharmony_ci __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy) 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ciPara resumir, necesita: 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci - una ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada de compat. 39262306a36Sopenharmony_ci - el prototipo correspondiente en ``include/linux/compat.h`` 39362306a36Sopenharmony_ci - (en caso de ser necesario) un struct de mapeo de 32-bit en ``include/linux/compat.h`` 39462306a36Sopenharmony_ci - una instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h`` 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ciCompatibilidad de Llamadas de Sistema (x86) 39762306a36Sopenharmony_ci------------------------------------------- 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ciPara conectar la arquitectura x86 de una llamada al sistema con una versión 40062306a36Sopenharmony_cide compatibilidad, las entradas en las tablas de syscall deben ser 40162306a36Sopenharmony_ciajustadas. 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ciPrimero, la entrada en ``arch/x86/entry/syscalls/syscall_32.tbl`` recibe 40462306a36Sopenharmony_ciuna columna extra para indicar que un programa del userspace de 32-bit 40562306a36Sopenharmony_cicorriendo en un kernel de 64-bit debe llegar al punto de entrada compat:: 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci 380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ciSegundo, tienes que averiguar qué debería pasar para la versión x32 ABI de 41062306a36Sopenharmony_cila nueva llamada al sistema. Aquí hay una elección: el diseño de los 41162306a36Sopenharmony_ciargumentos debería coincidir con la versión de 64-bit o la versión de 41262306a36Sopenharmony_ci32-bit. 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ciSi hay involucrado un puntero-a-puntero, la decisión es fácil: x32 es 41562306a36Sopenharmony_ciILP32, por lo que el diseño debe coincidir con la versión 32-bit, y la 41662306a36Sopenharmony_cientrada en ``arch/x86/entry/syscalls/syscall_64.tbl`` se divide para que 41762306a36Sopenharmony_ciprogamas 32-bit lleguen al envoltorio de compatibilidad:: 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci 333 64 xyzzy sys_xyzzy 42062306a36Sopenharmony_ci ... 42162306a36Sopenharmony_ci 555 x32 xyzzy __x32_compat_sys_xyzzy 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ciSi no hay punteros involucrados, entonces es preferible reutilizar el system 42462306a36Sopenharmony_cicall 64-bit para el x32 ABI (y consecuentemente la entrada en 42562306a36Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl no se cambia). 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ciEn cualquier caso, debes revisar que lo tipos involucrados en su diseño de 42862306a36Sopenharmony_ciargumentos de hecho asigne exactamente de x32 (-mx32) a 32-bit(-m32) o 42962306a36Sopenharmony_ciequivalentes 64-bit (-m64). 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ciLlamadas de Sistema Retornando a Otros Lugares 43362306a36Sopenharmony_ci---------------------------------------------- 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ciPara la mayoría de las llamadas al sistema, una vez que se la llamada al 43662306a36Sopenharmony_cisistema se ha completado el programa de usuario continúa exactamente donde 43762306a36Sopenharmony_ciquedó -- en la siguiente instrucción, con el stack igual y la mayoría de 43862306a36Sopenharmony_cilos registros igual que antes de la llamada al sistema, y con el mismo 43962306a36Sopenharmony_ciespacio en la memoria virtual. 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ciSin embargo, unas pocas llamadas al sistema hacen las cosas diferente. 44262306a36Sopenharmony_ciEstas podrían retornar a una ubicación distinta (``rt_sigreturn``) o 44362306a36Sopenharmony_cicambiar el espacio de memoria (``fork``/``vfork``/``clone``) o incluso de 44462306a36Sopenharmony_ciarquitectura (``execve``/``execveat``) del programa. 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ciPara permitir esto, la implementación del kernel de la llamada al sistema 44762306a36Sopenharmony_cipodría necesitar guardar y restaurar registros adicionales al stak del 44862306a36Sopenharmony_cikernel, brindandole control completo de donde y cómo la ejecución continúa 44962306a36Sopenharmony_cidespués de la llamada a sistema. 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ciEsto es arch-specific, pero típicamente involucra definir puntos de entrada 45262306a36Sopenharmony_ciassembly que guardan/restauran registros adicionales e invocan el punto de 45362306a36Sopenharmony_cientrada real de la llamada a sistema. 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ciPara x86_64, esto es implementado como un punto de entrada ``stub_xyzzy`` 45662306a36Sopenharmony_cien ``arch/x86/entry/entry_64.S``, y la entrada en la tabla syscall 45762306a36Sopenharmony_ci(``arch/x86/entry/syscalls/syscall_32.tbl``) es ajustada para calzar:: 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci 333 common xyzzy stub_xyzzy 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ciEl equivalente para programas 32-bit corriendo en un kernel 64-bit es 46262306a36Sopenharmony_cinormalmente llamado ``stub32_xyzzy`` e implementado en 46362306a36Sopenharmony_ci``arch/x86/entry/entry_64_compat.S``, con el correspondiente ajuste en la 46462306a36Sopenharmony_citabla syscall en ``arch/x86/syscalls/syscall_32.tbl``:: 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci 380 i386 xyzzy sys_xyzzy stub32_xyzzy 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ciSi la llamada a sistema necesita una capa de compatibilidad (como en la 46962306a36Sopenharmony_cisección anterior) entonces la versión ``stub32_`` necesita llamar a la 47062306a36Sopenharmony_civersión ``compat_sys_`` de la llamada a sistema, en vez de la versión 47162306a36Sopenharmony_cinativa de 64-bit. También, si la implementación de la versión x32 ABI no es 47262306a36Sopenharmony_cicomun con la versión x86_64, entonces su tabla syscall también necesitará 47362306a36Sopenharmony_ciinvocar un stub que llame a la versión ``compat_sys_`` 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ciPara completar, también es agradable configurar un mapeo de modo que el 47662306a36Sopenharmony_ciuser-mode linux todavía funcione -- su tabla syscall referenciará 47762306a36Sopenharmony_cistub_xyzzy, pero el UML construido no incluye una implementación 47862306a36Sopenharmony_ci``arch/x86/entry/entry_64.S``. Arreglar esto es tan simple como agregar un 47962306a36Sopenharmony_ci#define a ``arch/x86/um/sys_call_table_64.c``:: 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci #define stub_xyzzy sys_xyzzy 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ciOtros detalles 48562306a36Sopenharmony_ci-------------- 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ciLa mayoría del kernel trata las llamadas a sistema de manera genérica, pero 48862306a36Sopenharmony_ciestá la excepción ocasional que pueda requerir actualización para su 48962306a36Sopenharmony_cillamada a sistema particular. 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ciEl subsistema de auditoría es un caso especial; este incluye funciones 49262306a36Sopenharmony_ci(arch-specific) que clasifican algunos tipos especiales de llamadas al 49362306a36Sopenharmony_cisistema -- específicamente file open (``open``/``openat``), program 49462306a36Sopenharmony_ciexecution (``execve`` /``execveat``) o operaciones multiplexores de socket 49562306a36Sopenharmony_ci(``socketcall``). Si su nueva llamada de sistema es análoga a alguna de 49662306a36Sopenharmony_ciestas, entonces el sistema auditor debe ser actualizado. 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ciMás generalmente, si existe una llamada al sistema que sea análoga a su 49962306a36Sopenharmony_cinueva llamada al sistema, entonces vale la pena hacer un grep a todo el 50062306a36Sopenharmony_cikernel de la llamada a sistema existente, para revisar que no exista otro 50162306a36Sopenharmony_cicaso especial. 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ciTesting 50562306a36Sopenharmony_ci------- 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ciUna nueva llamada al sistema debe obviamente ser probada; también es útil 50862306a36Sopenharmony_ciproveer a los revisores con una demostración de cómo los programas del 50962306a36Sopenharmony_ciuserspace usarán la llamada al sistema. Una buena forma de combinar estos 51062306a36Sopenharmony_ciobjetivos es incluir un simple programa self-test en un nuevo directorio 51162306a36Sopenharmony_cibajo ``tools/testing/selftests/``. 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ciPara una nueva llamada al sistema, obviamente no habrá una función 51462306a36Sopenharmony_cienvoltorio libc por lo que el test necesitará ser invocado usando 51562306a36Sopenharmony_ci``syscall()``; también, si la llamada al sistema involucra una nueva 51662306a36Sopenharmony_ciestructura userspace-visible, el encabezado correspondiente necesitará ser 51762306a36Sopenharmony_ciinstalado para compilar el test. 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ciAsegure que selftest corra satisfactoriamente en todas las arquitecturas 52062306a36Sopenharmony_cisoportadas. Por ejemplo, revise si funciona cuando es compilado como un 52162306a36Sopenharmony_cix86_64 (-m64), x86_32 (-m32) y x32 (-mx32) programa ABI. 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ciPara pruebas más amplias y exhautivas de la nueva funcionalidad, también 52462306a36Sopenharmony_cidebería considerar agregar tests al Linus Test Project, o al proyecto 52562306a36Sopenharmony_cixfstests para cambios filesystem-related 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci - https://linux-test-project.github.io/ 52862306a36Sopenharmony_ci - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ciMan Page 53262306a36Sopenharmony_ci-------- 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ciTodas las llamada al sistema nueva deben venir con un man page completo, 53562306a36Sopenharmony_ciidealmente usando groff markup, pero texto plano también funciona. Si se 53662306a36Sopenharmony_ciusa groff, es útil incluir una versión ASCII pre-renderizada del man-page 53762306a36Sopenharmony_cien el cover del email para el patchset, para la conveniencia de los 53862306a36Sopenharmony_cirevisores. 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ciEl man page debe ser cc'do a linux-man@vger.kernel.org 54162306a36Sopenharmony_ciPara más detalles, revise https://www.kernel.org/doc/man-pages/patches.html 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ciNo invoque las llamadas de sistemas en el kernel 54562306a36Sopenharmony_ci------------------------------------------------ 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ciLas llamadas al sistema son, cómo se declaró más arriba, puntos de 54862306a36Sopenharmony_ciinteracción entre el userspace y el kernel. Por lo tanto, las funciones de 54962306a36Sopenharmony_cillamada al sistema como ``sys_xyzzy()`` o ``compat_sys_xyzzy()`` deberían 55062306a36Sopenharmony_ciser llamadas sólo desde el userspace vía la tabla de syscall, pero no de 55162306a36Sopenharmony_ciotro lugar en el kernel. Si la funcionalidad syscall es útil para ser usada 55262306a36Sopenharmony_cidentro del kernel, necesita ser compartida entre syscalls nuevas o 55362306a36Sopenharmony_ciantiguas, o necesita ser compartida entre una syscall y su variante de 55462306a36Sopenharmony_cicompatibilidad, esta debería ser implementada mediante una función "helper" 55562306a36Sopenharmony_ci(como ``ksys_xyzzy()``). Esta función del kernel puede ahora ser llamada 55662306a36Sopenharmony_cidentro del syscall stub (``sys_xyzzy()``), la syscall stub de 55762306a36Sopenharmony_cicompatibilidad (``compat_sys_xyzzy()``), y/o otro código del kernel. 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ciAl menos en 64-bit x86, será un requerimiento duro desde la v4.17 en 56062306a36Sopenharmony_ciadelante no invocar funciones de llamada al sistema (system call) en el 56162306a36Sopenharmony_cikernel. Este usa una convención de llamada diferente para llamadas al 56262306a36Sopenharmony_cisistema donde ``struct pt_regs`` es decodificado on-the-fly en un 56362306a36Sopenharmony_cienvoltorio syscall que luego entrega el procesamiento al syscall real. Esto 56462306a36Sopenharmony_cisignifica que sólo aquellos parámetros que son realmente necesarios para 56562306a36Sopenharmony_ciuna syscall específica son pasados durante la entrada del syscall, en vez 56662306a36Sopenharmony_cide llenar en seis registros de CPU con contenido random del userspace todo 56762306a36Sopenharmony_ciel tiempo (los cuales podrían causar serios problemas bajando la cadena de 56862306a36Sopenharmony_cillamadas). 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ciMás aún, reglas sobre cómo se debería acceder a la data pueden diferir 57162306a36Sopenharmony_cientre la data del kernel y la data de usuario. Esta es otra razón por la 57262306a36Sopenharmony_cicual llamar a ``sys_xyzzy()`` es generalmente una mala idea. 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ciExcepciones a esta regla están permitidas solamente en overrides 57562306a36Sopenharmony_ciespecíficos de arquitectura, envoltorios de compatibilidad específicos de 57662306a36Sopenharmony_ciarquitectura, u otro código en arch/. 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ciReferencias y fuentes 58062306a36Sopenharmony_ci--------------------- 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci - Artículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al 58362306a36Sopenharmony_ci sistema: 58462306a36Sopenharmony_ci https://lwn.net/Articles/585415/ 58562306a36Sopenharmony_ci - Artículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una 58662306a36Sopenharmony_ci llamada al sistema: https://lwn.net/Articles/588444/ 58762306a36Sopenharmony_ci - Artículo LWN de Jake Edge describiendo restricciones en argumentos en 58862306a36Sopenharmony_ci 64-bit system call: https://lwn.net/Articles/311630/ 58962306a36Sopenharmony_ci - Par de artículos LWN de David Drysdale que describen la ruta de implementación 59062306a36Sopenharmony_ci de llamadas al sistema en detalle para v3.14: 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci - https://lwn.net/Articles/604287/ 59362306a36Sopenharmony_ci - https://lwn.net/Articles/604515/ 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci - Requerimientos arquitectura-específicos para llamadas al sistema son discutidos en el 59662306a36Sopenharmony_ci :manpage:`syscall(2)` man-page: 59762306a36Sopenharmony_ci http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES 59862306a36Sopenharmony_ci - Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: 59962306a36Sopenharmony_ci https://yarchive.net/comp/linux/ioctl.html 60062306a36Sopenharmony_ci - "How to not invent kernel interfaces", Arnd Bergmann, 60162306a36Sopenharmony_ci https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf 60262306a36Sopenharmony_ci - Artículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: 60362306a36Sopenharmony_ci https://lwn.net/Articles/486306/ 60462306a36Sopenharmony_ci - Recomendaciones de Andrew Morton que toda la información relacionada a una nueva 60562306a36Sopenharmony_ci llamada al sistema debe venir en el mismo hilo de correos: 60662306a36Sopenharmony_ci https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org 60762306a36Sopenharmony_ci - Recomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir 60862306a36Sopenharmony_ci con un man-page: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com 60962306a36Sopenharmony_ci - Sugerencias de Thomas Gleixner que conexiones x86 deben ir en commits 61062306a36Sopenharmony_ci separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos 61162306a36Sopenharmony_ci - Sugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema 61262306a36Sopenharmony_ci que vengan con man-page y selftest: https://lore.kernel.org/r/20140320025530.GA25469@kroah.com 61362306a36Sopenharmony_ci - Discusión de Michael Kerrisk de nuevas system call vs. extensiones :manpage:`prctl(2)`: 61462306a36Sopenharmony_ci https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com 61562306a36Sopenharmony_ci - Sugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples 61662306a36Sopenharmony_ci argumentos deben encapsular estos argumentos en una estructura, la cual incluye 61762306a36Sopenharmony_ci un campo de tamaño para futura extensibilidad: https://lore.kernel.org/r/20150730083831.GA22182@gmail.com 61862306a36Sopenharmony_ci - Enumerando rarezas por la (re-)utilización de O_* numbering space flags: 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness 62162306a36Sopenharmony_ci check") 62262306a36Sopenharmony_ci - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc 62362306a36Sopenharmony_ci conflict") 62462306a36Sopenharmony_ci - commit bb458c644a59 ("Safer ABI for O_TMPFILE") 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci - Discusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: 62762306a36Sopenharmony_ci https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org 62862306a36Sopenharmony_ci - Recomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser 62962306a36Sopenharmony_ci vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com 63062306a36Sopenharmony_ci - Recomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer 63162306a36Sopenharmony_ci compatibilidad con versiones 64-bit sobre versiones 32-bit: 63262306a36Sopenharmony_ci https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com 633