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