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