@sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/process/adding-syscallsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Simplified)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_CN/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hChinese (Traditional)}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/it_IT/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageSpanishuh1h hh _documenthsourceNlineNubhwarning)}(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.h]h paragraph)}(hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.h]hX?Si tiene alguna duda sobre la exactitud del contenido de esta traducción, la única referencia válida es la documentación oficial en inglés. Además, por defecto, los enlaces a documentos redirigen a la documentación en inglés, incluso si existe una versión traducida. Consulte el índice para más información.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh2Documentation/translations/sp_SP/disclaimer-sp.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhX/var/lib/git/docbuild/linux/Documentation/translations/sp_SP/process/adding-syscalls.rsthKubh field_body)}(h>:ref:`Documentation/process/adding-syscalls.rst `h]h)}(hhh]h)}(hhh]hinline)}(hhh]h)Documentation/process/adding-syscalls.rst}(hhhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdoc*translations/sp_SP/process/adding-syscalls refdomainhreftyperef refexplicitrefwarn reftarget addsyscallsuh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Translatorh]h Translator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h(Mauricio Fuentes h]h)}(h'Mauricio Fuentes h](hMauricio Fuentes <}(hj-hhhNhNubh reference)}(hmauriciofb@gmail.comh]hmauriciofb@gmail.com}(hj7hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:mauriciofb@gmail.comuh1j5hj-ubh>}(hj-hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj)ubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h.. _sp_addsyscalls:h]h}(h]h ]h"]h$]h&]refidsp-addsyscallsuh1jchKhhhhhhubhsection)}(hhh](htitle)}(h'Agregando una Nueva Llamada del Sistemah]h'Agregando una Nueva Llamada del Sistema}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjshhhhhK ubh)}(hXEste documento describe qué involucra agregar una nueva llamada del sistema al kernel Linux, más allá de la presentación y consejos normales en :ref:`Documentation/process/submitting-patches.rst ` que también puede encontrar traducido a este idioma.h](hEste documento describe qué involucra agregar una nueva llamada del sistema al kernel Linux, más allá de la presentación y consejos normales en }(hjhhhNhNubh)}(hG:ref:`Documentation/process/submitting-patches.rst `h]h)}(hjh]h,Documentation/process/submitting-patches.rst}(hjhhhNhNubah}(h]h ](hstdstd-refeh"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]refdoch refdomainjreftyperef refexplicitrefwarnjsubmittingpatchesuh1hhhhK hjubh6 que también puede encontrar traducido a este idioma.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjshhubjr)}(hhh](jw)}(h#Alternativas a Llamadas del Sistemah]h#Alternativas a Llamadas del Sistema}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhKubh)}(hX<La primera cosa a considerar cuando se agrega una llamada al sistema es si alguna alternativa es adecuada en su lugar. Aunque las llamadas al sistema son los puntos de interacción entre el userspace y el kernel más obvios y tradicionales, existen otras posibilidades -- elija la que mejor se adecúe a su interfaz.h]hX<La primera cosa a considerar cuando se agrega una llamada al sistema es si alguna alternativa es adecuada en su lugar. Aunque las llamadas al sistema son los puntos de interacción entre el userspace y el kernel más obvios y tradicionales, existen otras posibilidades -- elija la que mejor se adecúe a su interfaz.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh block_quote)}(hX- Si se puede hacer que la operación se parezca a un objeto filesystem, podría tener más sentido crear un nuevo sistema de ficheros o dispositivo. Esto también hará más fácil encapsular la nueva funcionalidad en un módulo del kernel en vez de requerir que sea construido junto al kernel principal. - Si la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar ``poll``/``select``/``epoll`` para recibir esta notificación. - Sin embargo, operaciones que no mapean a operaciones similares a :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un API algo opaca. - Si sólo está exponiendo información del runtime, un nuevo nodo en sysfs (mire ``Documentation/filesystems/sysfs.rst``) o el filesystem ``/proc`` podría ser más adecuado. Sin embargo, acceder a estos mecanismos requiere que el filesystem relevante esté montado, lo que podría no ser siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). Evite agregar cualquier API a debugfs, ya que no se considera una interfaz (interface) de 'producción' para el userspace. - Si la operación es específica a un archivo o descriptor de archivo específico, entonces la opción de comando adicional :manpage:`fcntl(2)` podría ser más apropiada. Sin embargo, :manpage:`fcntl(2)` es una llamada al sistema multiplexada que esconde mucha complejidad, así que esta opción es mejor cuando la nueva funcion es analogamente cercana a la funcionalidad existente :manpage:`fcntl(2)`, o la nueva funcionalidad es muy simple (por ejemplo, definir/obtener un flag simple relacionado a un descriptor de archivo). - Si la operación es específica a un proceso o tarea particular, entonces un comando adicional :manpage:`prctl(2)` podría ser más apropiado. Tal como con :manpage:`fcntl(2)`, esta llamada al sistema es un multiplexor complicado así que está reservado para comandos análogamente cercanos del existente ``prctl()`` u obtener/definir un flag simple relacionado a un proceso. h]h bullet_list)}(hhh](h list_item)}(hX8Si se puede hacer que la operación se parezca a un objeto filesystem, podría tener más sentido crear un nuevo sistema de ficheros o dispositivo. Esto también hará más fácil encapsular la nueva funcionalidad en un módulo del kernel en vez de requerir que sea construido junto al kernel principal. - Si la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar ``poll``/``select``/``epoll`` para recibir esta notificación. - Sin embargo, operaciones que no mapean a operaciones similares a :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un API algo opaca. h](h)}(hX/Si se puede hacer que la operación se parezca a un objeto filesystem, podría tener más sentido crear un nuevo sistema de ficheros o dispositivo. Esto también hará más fácil encapsular la nueva funcionalidad en un módulo del kernel en vez de requerir que sea construido junto al kernel principal.h]hX/Si se puede hacer que la operación se parezca a un objeto filesystem, podría tener más sentido crear un nuevo sistema de ficheros o dispositivo. Esto también hará más fácil encapsular la nueva funcionalidad en un módulo del kernel en vez de requerir que sea construido junto al kernel principal.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(hX- Si la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar ``poll``/``select``/``epoll`` para recibir esta notificación. - Sin embargo, operaciones que no mapean a operaciones similares a :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un API algo opaca. h]j)}(hhh](j)}(hX Si la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar ``poll``/``select``/``epoll`` para recibir esta notificación. h]h)}(hX Si la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar ``poll``/``select``/``epoll`` para recibir esta notificación.h](hSi la nueva funcionalidad involucra operaciones donde el kernel notifica al userspace que algo ha pasado, entonces retornar un nuevo descriptor de archivo para el objeto relevante permite al userspace usar }(hjhhhNhNubhliteral)}(h``poll``h]hpoll}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}(hjhhhNhNubj )}(h ``select``h]hselect}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}hjsbj )}(h ``epoll``h]hepoll}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh! para recibir esta notificación.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hSin embargo, operaciones que no mapean a operaciones similares a :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un API algo opaca. h]h)}(hSin embargo, operaciones que no mapean a operaciones similares a :manpage:`read(2)`/:manpage:`write(2)` tienen que ser implementadas como solicitudes :manpage:`ioctl(2)`, las cuales pueden llevar a un API algo opaca.h](hASin embargo, operaciones que no mapean a operaciones similares a }(hjQhhhNhNubhmanpage)}(h:manpage:`read(2)`h]hread(2)}(hj[hhhNhNubah}(h]h ]jYah"]h$]h&] xml:spacepreservepathread(2)pagereadsection2uh1jYhjQubh/}(hjQhhhNhNubjZ)}(h:manpage:`write(2)`h]hwrite(2)}(hjuhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkwrite(2)jmwritejojpuh1jYhjQubh/ tienen que ser implementadas como solicitudes }(hjQhhhNhNubjZ)}(h:manpage:`ioctl(2)`h]hioctl(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkioctl(2)jmioctljojpuh1jYhjQubh/, las cuales pueden llevar a un API algo opaca.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hjMubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hXSi sólo está exponiendo información del runtime, un nuevo nodo en sysfs (mire ``Documentation/filesystems/sysfs.rst``) o el filesystem ``/proc`` podría ser más adecuado. Sin embargo, acceder a estos mecanismos requiere que el filesystem relevante esté montado, lo que podría no ser siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). Evite agregar cualquier API a debugfs, ya que no se considera una interfaz (interface) de 'producción' para el userspace. h]h)}(hXSi sólo está exponiendo información del runtime, un nuevo nodo en sysfs (mire ``Documentation/filesystems/sysfs.rst``) o el filesystem ``/proc`` podría ser más adecuado. Sin embargo, acceder a estos mecanismos requiere que el filesystem relevante esté montado, lo que podría no ser siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). Evite agregar cualquier API a debugfs, ya que no se considera una interfaz (interface) de 'producción' para el userspace.h](hQSi sólo está exponiendo información del runtime, un nuevo nodo en sysfs (mire }(hjhhhNhNubj )}(h'``Documentation/filesystems/sysfs.rst``h]h#Documentation/filesystems/sysfs.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh) o el filesystem }(hjhhhNhNubj )}(h ``/proc``h]h/proc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhXQ podría ser más adecuado. Sin embargo, acceder a estos mecanismos requiere que el filesystem relevante esté montado, lo que podría no ser siempre el caso (e.g. en un ambiente namespaced/sandboxed/chrooted). Evite agregar cualquier API a debugfs, ya que no se considera una interfaz (interface) de ‘producción’ para el userspace.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXSi la operación es específica a un archivo o descriptor de archivo específico, entonces la opción de comando adicional :manpage:`fcntl(2)` podría ser más apropiada. Sin embargo, :manpage:`fcntl(2)` es una llamada al sistema multiplexada que esconde mucha complejidad, así que esta opción es mejor cuando la nueva funcion es analogamente cercana a la funcionalidad existente :manpage:`fcntl(2)`, o la nueva funcionalidad es muy simple (por ejemplo, definir/obtener un flag simple relacionado a un descriptor de archivo). h]h)}(hXSi la operación es específica a un archivo o descriptor de archivo específico, entonces la opción de comando adicional :manpage:`fcntl(2)` podría ser más apropiada. Sin embargo, :manpage:`fcntl(2)` es una llamada al sistema multiplexada que esconde mucha complejidad, así que esta opción es mejor cuando la nueva funcion es analogamente cercana a la funcionalidad existente :manpage:`fcntl(2)`, o la nueva funcionalidad es muy simple (por ejemplo, definir/obtener un flag simple relacionado a un descriptor de archivo).h](h{Si la operación es específica a un archivo o descriptor de archivo específico, entonces la opción de comando adicional }(hjhhhNhNubjZ)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkfcntl(2)jmfcntljojpuh1jYhjubh* podría ser más apropiada. Sin embargo, }(hjhhhNhNubjZ)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkfcntl(2)jmfcntljojpuh1jYhjubh es una llamada al sistema multiplexada que esconde mucha complejidad, así que esta opción es mejor cuando la nueva funcion es analogamente cercana a la funcionalidad existente }(hjhhhNhNubjZ)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hj-hhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkfcntl(2)jmfcntljojpuh1jYhjubh~, o la nueva funcionalidad es muy simple (por ejemplo, definir/obtener un flag simple relacionado a un descriptor de archivo).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXySi la operación es específica a un proceso o tarea particular, entonces un comando adicional :manpage:`prctl(2)` podría ser más apropiado. Tal como con :manpage:`fcntl(2)`, esta llamada al sistema es un multiplexor complicado así que está reservado para comandos análogamente cercanos del existente ``prctl()`` u obtener/definir un flag simple relacionado a un proceso. h]h)}(hXxSi la operación es específica a un proceso o tarea particular, entonces un comando adicional :manpage:`prctl(2)` podría ser más apropiado. Tal como con :manpage:`fcntl(2)`, esta llamada al sistema es un multiplexor complicado así que está reservado para comandos análogamente cercanos del existente ``prctl()`` u obtener/definir un flag simple relacionado a un proceso.h](h_Si la operación es específica a un proceso o tarea particular, entonces un comando adicional }(hjQhhhNhNubjZ)}(h:manpage:`prctl(2)`h]hprctl(2)}(hjYhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkprctl(2)jmprctljojpuh1jYhjQubh* podría ser más apropiado. Tal como con }(hjQhhhNhNubjZ)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hjmhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkfcntl(2)jmfcntljojpuh1jYhjQubh, esta llamada al sistema es un multiplexor complicado así que está reservado para comandos análogamente cercanos del existente }(hjQhhhNhNubj )}(h ``prctl()``h]hprctl()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjQubh; u obtener/definir un flag simple relacionado a un proceso.}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK:hjMubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjhhubeh}(h]#alternativas-a-llamadas-del-sistemaah ]h"]#alternativas a llamadas del sistemaah$]h&]uh1jqhjshhhhhKubjr)}(hhh](jw)}(h-Diseñando el API: Planeando para extensionesh]h-Diseñando el API: Planeando para extensiones}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhKBubh)}(hXUna nueva llamada del sistema forma parte del API del kernel, y tiene que ser soportada indefinidamente. Como tal, es una muy buena idea discutir explícitamente el interface en las listas de correo del kernel, y es importante planear para futuras extensiones del interface.h]hXUna nueva llamada del sistema forma parte del API del kernel, y tiene que ser soportada indefinidamente. Como tal, es una muy buena idea discutir explícitamente el interface en las listas de correo del kernel, y es importante planear para futuras extensiones del interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjhhubh)}(hXg(La tabla syscall está poblada con ejemplos históricos donde esto no se hizo, junto con los correspondientes seguimientos de los system calls -- ``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, ``pipe``/``pipe2``, ``renameat``/``renameat2`` -- así que aprenda de la historia del kernel y planee extensiones desde el inicio.)h](h(La tabla syscall está poblada con ejemplos históricos donde esto no se hizo, junto con los correspondientes seguimientos de los system calls -- }(hjhhhNhNubj )}(h ``eventfd``h]heventfd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}(hjhhhNhNubj )}(h ``eventfd2``h]heventfd2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }(hjhhhNhNubj )}(h``dup2``h]hdup2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}hjsbj )}(h``dup3``h]hdup3}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }hjsbj )}(h``inotify_init``h]h inotify_init}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}hjsbj )}(h``inotify_init1``h]h inotify_init1}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }(hjhhhNhNubj )}(h``pipe``h]hpipe}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}hjsbj )}(h ``pipe2``h]hpipe2}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, }hjsbj )}(h ``renameat``h]hrenameat}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}hjsbj )}(h ``renameat2``h]h renameat2}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhU -- así que aprenda de la historia del kernel y planee extensiones desde el inicio.)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(hXPara llamadas al sistema más simples que sólo toman un par de argumentos, la forma preferida de permitir futuras extensiones es incluir un argumento flag a la llamada al sistema. Para asegurarse que el userspace pueda usar de forma segura estos flags entre versiones del kernel, revise si los flags contienen cualquier flag desconocido, y rechace la llamada al sistema (con ``EINVAL``) si ocurre::h](hXxPara llamadas al sistema más simples que sólo toman un par de argumentos, la forma preferida de permitir futuras extensiones es incluir un argumento flag a la llamada al sistema. Para asegurarse que el userspace pueda usar de forma segura estos flags entre versiones del kernel, revise si los flags contienen cualquier flag desconocido, y rechace la llamada al sistema (con }(hjhhhNhNubj )}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh ) si ocurre:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKOhjhhubh literal_block)}(hJif (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) return -EINVAL;h]hJif (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) return -EINVAL;}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhKVhjhhubh)}(hW(Si no hay valores de flags usados aún, revise que los argumentos del flag sean cero.)h]hW(Si no hay valores de flags usados aún, revise que los argumentos del flag sean cero.)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjhhubh)}(hXFPara llamadas al sistema más sofisticadas que involucran un gran número de argumentos, es preferible encapsular la mayoría de los argumentos en una estructura que sea pasada a través de un puntero. Tal estructura puede hacer frente a futuras extensiones mediante la inclusión de un argumento de tamaño en la estructura::h]hXEPara llamadas al sistema más sofisticadas que involucran un gran número de argumentos, es preferible encapsular la mayoría de los argumentos en una estructura que sea pasada a través de un puntero. Tal estructura puede hacer frente a futuras extensiones mediante la inclusión de un argumento de tamaño en la estructura:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hjhhubj)}(hstruct xyzzy_params { u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };h]hstruct xyzzy_params { u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhKbhjhhubh)}(hSiempre que cualquier campo añadido subsecuente, digamos ``param_4``, sea diseñado de forma tal que un valor cero, devuelva el comportamiento previo, entonces permite versiones no coincidentes en ambos sentidos:h](h:Siempre que cualquier campo añadido subsecuente, digamos }(hjhhhNhNubj )}(h ``param_4``h]hparam_4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh, sea diseñado de forma tal que un valor cero, devuelva el comportamiento previo, entonces permite versiones no coincidentes en ambos sentidos:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKihjhhubj)}(hX- Para hacer frente a programas del userspace más modernos, haciendo llamadas a un kernel más antiguo, el código del kernel debe revisar que cualquier memoria más allá del tamaño de la estructura sea cero (revisar de manera efectiva que ``param_4 == 0``). - Para hacer frente a programas antiguos del userspace haciendo llamadas a un kernel más nuevo, el código del kernel puede extender con ceros, una instancia más pequeña de la estructura (definiendo efectivamente ``param_4 == 0``). h]j)}(hhh](j)}(hXPara hacer frente a programas del userspace más modernos, haciendo llamadas a un kernel más antiguo, el código del kernel debe revisar que cualquier memoria más allá del tamaño de la estructura sea cero (revisar de manera efectiva que ``param_4 == 0``).h]h)}(hXPara hacer frente a programas del userspace más modernos, haciendo llamadas a un kernel más antiguo, el código del kernel debe revisar que cualquier memoria más allá del tamaño de la estructura sea cero (revisar de manera efectiva que ``param_4 == 0``).h](hPara hacer frente a programas del userspace más modernos, haciendo llamadas a un kernel más antiguo, el código del kernel debe revisar que cualquier memoria más allá del tamaño de la estructura sea cero (revisar de manera efectiva que }(hjhhhNhNubj )}(h``param_4 == 0``h]h param_4 == 0}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKmhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hPara hacer frente a programas antiguos del userspace haciendo llamadas a un kernel más nuevo, el código del kernel puede extender con ceros, una instancia más pequeña de la estructura (definiendo efectivamente ``param_4 == 0``). h]h)}(hPara hacer frente a programas antiguos del userspace haciendo llamadas a un kernel más nuevo, el código del kernel puede extender con ceros, una instancia más pequeña de la estructura (definiendo efectivamente ``param_4 == 0``).h](hPara hacer frente a programas antiguos del userspace haciendo llamadas a un kernel más nuevo, el código del kernel puede extender con ceros, una instancia más pequeña de la estructura (definiendo efectivamente }(hjChhhNhNubj )}(h``param_4 == 0``h]h param_4 == 0}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjCubh).}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKqhj?ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhKmhjubah}(h]h ]h"]h$]h&]uh1jhhhKmhjhhubh)}(hRevise :manpage:`perf_event_open(2)` y la función ``perf_copy_attr()`` (en ``kernel/events/code.c``) para un ejemplo de esta aproximación.h](hRevise }(hjuhhhNhNubjZ)}(h:manpage:`perf_event_open(2)`h]hperf_event_open(2)}(hj}hhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkperf_event_open(2)jmperf_event_openjojpuh1jYhjuubh y la función }(hjuhhhNhNubj )}(h``perf_copy_attr()``h]hperf_copy_attr()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh (en }(hjuhhhNhNubj )}(h``kernel/events/code.c``h]hkernel/events/code.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh() para un ejemplo de esta aproximación.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKvhjhhubeh}(h]+disenando-el-api-planeando-para-extensionesah ]h"]-diseñando el api: planeando para extensionesah$]h&]uh1jqhjshhhhhKBubjr)}(hhh](jw)}(h(Diseñando el API: Otras consideracionesh]h(Diseñando el API: Otras consideraciones}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhK{ubh)}(hXPSi su nueva llamada al sistema permite al userspace hacer referencia a un objeto del kernel, esta debería usar un descriptor de archivo como el manipulador de ese objeto -- no invente un nuevo tipo de objeto manipulador userspace cuando el kernel ya tiene mecanismos y semánticas bien definidas para usar los descriptores de archivos.h]hXPSi su nueva llamada al sistema permite al userspace hacer referencia a un objeto del kernel, esta debería usar un descriptor de archivo como el manipulador de ese objeto -- no invente un nuevo tipo de objeto manipulador userspace cuando el kernel ya tiene mecanismos y semánticas bien definidas para usar los descriptores de archivos.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK}hjhhubh)}(hXSi su nueva llamada a sistema :manpage:`xyzzy(2)` retorna un nuevo descriptor de archivo, entonces el argumento flag debe incluir un valor que sea equivalente a definir ``O_CLOEXEC`` en el nuevo FD. Esto hace posible al userspace acortar la brecha de tiempo entre ``xyzzy()`` y la llamada a ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, donde un ``fork()`` inesperado y ``execve()`` en otro hilo podrían filtrar un descriptor al programa ejecutado. (Sin embargo, resista la tentación de reusar el valor actual de la constante ``O_CLOEXEC``, ya que es específica de la arquitectura y es parte de un espacio numerado de flags ``O_*`` que está bastante lleno.)h](hSi su nueva llamada a sistema }(hjhhhNhNubjZ)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkxyzzy(2)jmxyzzyjojpuh1jYhjubhx retorna un nuevo descriptor de archivo, entonces el argumento flag debe incluir un valor que sea equivalente a definir }(hjhhhNhNubj )}(h ``O_CLOEXEC``h]h O_CLOEXEC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhR en el nuevo FD. Esto hace posible al userspace acortar la brecha de tiempo entre }(hjhhhNhNubj )}(h ``xyzzy()``h]hxyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh y la llamada a }(hjhhhNhNubj )}(h"``fcntl(fd, F_SETFD, FD_CLOEXEC)``h]hfcntl(fd, F_SETFD, FD_CLOEXEC)}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh , donde un }(hjhhhNhNubj )}(h ``fork()``h]hfork()}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh inesperado y }(hjhhhNhNubj )}(h ``execve()``h]hexecve()}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh en otro hilo podrían filtrar un descriptor al programa ejecutado. (Sin embargo, resista la tentación de reusar el valor actual de la constante }(hjhhhNhNubj )}(h ``O_CLOEXEC``h]h O_CLOEXEC}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhV, ya que es específica de la arquitectura y es parte de un espacio numerado de flags }(hjhhhNhNubj )}(h``O_*``h]hO_*}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh que está bastante lleno.)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXSi su llamada de sistema retorna un nuevo descriptor de archivo, debería considerar también que significa usar la familia de llamadas de sistema :manpage:`poll(2)` en ese descriptor de archivo. Hacer un descriptor de archivo listo para leer o escribir es la forma normal para que el kernel indique al espacio de usuario que un evento ha ocurrido en el correspondiente objeto del kernel.h](hSi su llamada de sistema retorna un nuevo descriptor de archivo, debería considerar también que significa usar la familia de llamadas de sistema }(hjhhhNhNubjZ)}(h:manpage:`poll(2)`h]hpoll(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkpoll(2)jmpolljojpuh1jYhjubh en ese descriptor de archivo. Hacer un descriptor de archivo listo para leer o escribir es la forma normal para que el kernel indique al espacio de usuario que un evento ha ocurrido en el correspondiente objeto del kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hfSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra algún nombre de archivo como argumento::h](hSi su nueva llamada de sistema }(hjhhhNhNubjZ)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkxyzzy(2)jmxyzzyjojpuh1jYhjubh3 involucra algún nombre de archivo como argumento:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h@int sys_xyzzy(const char __user *path, ..., unsigned int flags);h]h@int sys_xyzzy(const char __user *path, ..., unsigned int flags);}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhKhjhhubh)}(hUdebería considerar también si una versión :manpage:`xyzzyat(2)` es mas apropiada::h](h-debería considerar también si una versión }(hjhhhNhNubjZ)}(h:manpage:`xyzzyat(2)`h]h xyzzyat(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk xyzzyat(2)jmxyzzyatjojpuh1jYhjubh es mas apropiada:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);h]hKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhKhjhhubh)}(hXEsto permite más flexibilidad en como el userspace especifica el archivo en cuestión; en particular esto permite al userspace pedir la funcionalidad a un descriptor de archivo ya abierto usando el flag ``AT_EMPTY_PATH``, efectivamente dando una operación :manpage:`fxyzzy(3)` gratis::h](hEsto permite más flexibilidad en como el userspace especifica el archivo en cuestión; en particular esto permite al userspace pedir la funcionalidad a un descriptor de archivo ya abierto usando el flag }(hjhhhNhNubj )}(h``AT_EMPTY_PATH``h]h AT_EMPTY_PATH}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh%, efectivamente dando una operación }(hjhhhNhNubjZ)}(h:manpage:`fxyzzy(3)`h]h fxyzzy(3)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk fxyzzy(3)jmfxyzzyjo3uh1jYhjubh gratis:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h- xyzzyat(AT_FDCWD, path, ..., 0) es equivalente a xyzzy(path, ...) - xyzzyat(fd, "", ..., AT_EMPTY_PATH) es equivalente a fxyzzy(fd, ...)h]h- xyzzyat(AT_FDCWD, path, ..., 0) es equivalente a xyzzy(path, ...) - xyzzyat(fd, "", ..., AT_EMPTY_PATH) es equivalente a fxyzzy(fd, ...)}hj9sbah}(h]h ]h"]h$]h&]jijjuh1jhhhKhjhhubh)}(h(Para más detalles sobre la explicación racional de las llamadas \*at(), revise el man page :manpage:`openat(2)`; para un ejemplo de AT_EMPTY_PATH, mire el man page :manpage:`fstatat(2)` manpage.)h](h^(Para más detalles sobre la explicación racional de las llamadas *at(), revise el man page }(hjGhhhNhNubjZ)}(h:manpage:`openat(2)`h]h openat(2)}(hjOhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk openat(2)jmopenatjojpuh1jYhjGubh5; para un ejemplo de AT_EMPTY_PATH, mire el man page }(hjGhhhNhNubjZ)}(h:manpage:`fstatat(2)`h]h fstatat(2)}(hjchhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk fstatat(2)jmfstatatjojpuh1jYhjGubh manpage.)}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hSi su nueva llamada de sistema :manpage:`xyzzy(2)` involucra un parámetro describiendo un describiendo un movimiento dentro de un archivo, ponga de tipo ``loff_t`` para que movimientos de 64-bit puedan ser soportados incluso en arquitecturas de 32-bit.h](hSi su nueva llamada de sistema }(hj}hhhNhNubjZ)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkxyzzy(2)jmxyzzyjojpuh1jYhj}ubhh involucra un parámetro describiendo un describiendo un movimiento dentro de un archivo, ponga de tipo }(hj}hhhNhNubj )}(h ``loff_t``h]hloff_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj}ubhY para que movimientos de 64-bit puedan ser soportados incluso en arquitecturas de 32-bit.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXSi su nueva llamada de sistema :manpage:`xyzzy` involucra una funcionalidad privilegiada, esta necesita ser gobernada por la capability bit linux apropiada (revisado con una llamada a ``capable()``), como se describe en el man page :manpage:`capabilities(7)`. Elija una parte de capability linux que govierne las funcionalidades relacionadas, pero trate de evitar combinar muchas funciones sólo relacionadas vagamente bajo la misma sección, ya que va en contra de los propósitos de las capabilities de dividir el poder del usuario root. En particular, evite agregar nuevos usos de la capacidad ya demasiado general de la capabilities ``CAP_SYS_ADMIN``.h](h Si su nueva llamada de sistema }(hjhhhNhNubjZ)}(h:manpage:`xyzzy`h]hxyzzy}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjpathxyzzypagejjqhuh1jYhjubh involucra una funcionalidad privilegiada, esta necesita ser gobernada por la capability bit linux apropiada (revisado con una llamada a }(hjhhhNhNubj )}(h ``capable()``h]h capable()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh#), como se describe en el man page }(hjhhhNhNubjZ)}(h:manpage:`capabilities(7)`h]hcapabilities(7)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkcapabilities(7)jm capabilitiesjo7uh1jYhjubhX{. Elija una parte de capability linux que govierne las funcionalidades relacionadas, pero trate de evitar combinar muchas funciones sólo relacionadas vagamente bajo la misma sección, ya que va en contra de los propósitos de las capabilities de dividir el poder del usuario root. En particular, evite agregar nuevos usos de la capacidad ya demasiado general de la capabilities }(hjhhhNhNubj )}(h``CAP_SYS_ADMIN``h]h CAP_SYS_ADMIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXWSi su nueva llamada de sistema :manpage:`xyzzy(2)` manipula un proceso que no es el proceso invocado, este debería ser restringido (usando una llamada a ``ptrace_may_access()``) de forma que el único proceso con los mismos permisos del proceso objetivo, o con las capacidades (capabilities) necesarias, pueda manipulador el proceso objetivo.h](hSi su nueva llamada de sistema }(hj hhhNhNubjZ)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkxyzzy(2)jmxyzzyjojpuh1jYhj ubhh manipula un proceso que no es el proceso invocado, este debería ser restringido (usando una llamada a }(hj hhhNhNubj )}(h``ptrace_may_access()``h]hptrace_may_access()}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh) de forma que el único proceso con los mismos permisos del proceso objetivo, o con las capacidades (capabilities) necesarias, pueda manipulador el proceso objetivo.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX|Finalmente, debe ser conciente de que algunas arquitecturas no-x86 tienen un manejo más sencillo si los parámetros que son explícitamente 64-bit caigan en argumentos enumerados impares (i.e. parámetros 1,3,5), para permitir el uso de pares contiguos de registros 32-bits. (Este cuidado no aplica si el argumento es parte de una estructura que se pasa a través de un puntero.)h]hX|Finalmente, debe ser conciente de que algunas arquitecturas no-x86 tienen un manejo más sencillo si los parámetros que son explícitamente 64-bit caigan en argumentos enumerados impares (i.e. parámetros 1,3,5), para permitir el uso de pares contiguos de registros 32-bits. (Este cuidado no aplica si el argumento es parte de una estructura que se pasa a través de un puntero.)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]&disenando-el-api-otras-consideracionesah ]h"](diseñando el api: otras consideracionesah$]h&]uh1jqhjshhhhhK{ubjr)}(hhh](jw)}(hProponiendo el APIh]hProponiendo el API}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjWhhhhhKubh)}(hXPara hacer una nueva llamada al sistema fácil de revisar, es mejor dividir el patchset (conjunto de parches) en trozos separados. Estos deberían incluir al menos los siguientes items como commits distintos (cada uno de los cuales se describirá más abajo):h]hXPara hacer una nueva llamada al sistema fácil de revisar, es mejor dividir el patchset (conjunto de parches) en trozos separados. Estos deberían incluir al menos los siguientes items como commits distintos (cada uno de los cuales se describirá más abajo):}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjWhhubj)}(hXb- La implementación central de la llamada al sistema, junto con prototipos, numeración genérica, cambios Kconfig e implementaciones de rutinas de respaldo (fallback stub) - Conectar la nueva llamada a sistema a una arquitectura particular, usualmente x86 (incluyendo todas las x86_64, x86_32 y x32). - Una demostración del use de la nueva llamada a sistema en el userspace vía un selftest en ``tools/testing/selftest/``. - Un borrador de man-page para la nueva llamada a sistema, ya sea como texto plano en la carta de presentación, o como un parche (separado) para el repositorio man-pages. h]j)}(hhh](j)}(hLa implementación central de la llamada al sistema, junto con prototipos, numeración genérica, cambios Kconfig e implementaciones de rutinas de respaldo (fallback stub)h]h)}(hLa implementación central de la llamada al sistema, junto con prototipos, numeración genérica, cambios Kconfig e implementaciones de rutinas de respaldo (fallback stub)h]hLa implementación central de la llamada al sistema, junto con prototipos, numeración genérica, cambios Kconfig e implementaciones de rutinas de respaldo (fallback stub)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj}ubah}(h]h ]h"]h$]h&]uh1jhjzubj)}(h~Conectar la nueva llamada a sistema a una arquitectura particular, usualmente x86 (incluyendo todas las x86_64, x86_32 y x32).h]h)}(h~Conectar la nueva llamada a sistema a una arquitectura particular, usualmente x86 (incluyendo todas las x86_64, x86_32 y x32).h]h~Conectar la nueva llamada a sistema a una arquitectura particular, usualmente x86 (incluyendo todas las x86_64, x86_32 y x32).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjzubj)}(hxUna demostración del use de la nueva llamada a sistema en el userspace vía un selftest en ``tools/testing/selftest/``.h]h)}(hxUna demostración del use de la nueva llamada a sistema en el userspace vía un selftest en ``tools/testing/selftest/``.h](h\Una demostración del use de la nueva llamada a sistema en el userspace vía un selftest en }(hjhhhNhNubj )}(h``tools/testing/selftest/``h]htools/testing/selftest/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjzubj)}(hUn borrador de man-page para la nueva llamada a sistema, ya sea como texto plano en la carta de presentación, o como un parche (separado) para el repositorio man-pages. h]h)}(hUn borrador de man-page para la nueva llamada a sistema, ya sea como texto plano en la carta de presentación, o como un parche (separado) para el repositorio man-pages.h]hUn borrador de man-page para la nueva llamada a sistema, ya sea como texto plano en la carta de presentación, o como un parche (separado) para el repositorio man-pages.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjvubah}(h]h ]h"]h$]h&]uh1jhhhKhjWhhubh)}(hNuevas propuestas de llamadas de sistema, como cualquier cambio al API del kernel, debería siempre ser copiado a linux-api@vger.kernel.org.h](hrNuevas propuestas de llamadas de sistema, como cualquier cambio al API del kernel, debería siempre ser copiado a }(hjhhhNhNubj6)}(hlinux-api@vger.kernel.orgh]hlinux-api@vger.kernel.org}(hj hhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:linux-api@vger.kernel.orguh1j5hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjWhhubeh}(h]proponiendo-el-apiah ]h"]proponiendo el apiah$]h&]uh1jqhjshhhhhKubjr)}(hhh](jw)}(h-Implementation de Llamada de Sistema Genericah]h-Implementation de Llamada de Sistema Generica}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1jvhj% hhhhhKubh)}(hXLa entrada principal a su nueva llamada de sistema :manpage:`xyzzy(2)` será llamada ``sys_xyzzy()``, pero incluya este punto de entrada con la macro ``SYSCALL_DEFINEn()`` apropiada en vez de explicitamente. El 'n' indica el numero de argumentos de la llamada de sistema, y la macro toma el nombre de la llamada de sistema seguida por el par (tipo, nombre) para los parámetros como argumentos. Usar esta macro permite a la metadata de la nueva llamada de sistema estar disponible para otras herramientas.h](h3La entrada principal a su nueva llamada de sistema }(hj6 hhhNhNubjZ)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hj> hhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkxyzzy(2)jmxyzzyjojpuh1jYhj6 ubh será llamada }(hj6 hhhNhNubj )}(h``sys_xyzzy()``h]h sys_xyzzy()}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6 ubh2, pero incluya este punto de entrada con la macro }(hj6 hhhNhNubj )}(h``SYSCALL_DEFINEn()``h]hSYSCALL_DEFINEn()}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj6 ubhXR apropiada en vez de explicitamente. El ‘n’ indica el numero de argumentos de la llamada de sistema, y la macro toma el nombre de la llamada de sistema seguida por el par (tipo, nombre) para los parámetros como argumentos. Usar esta macro permite a la metadata de la nueva llamada de sistema estar disponible para otras herramientas.}(hj6 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj% hhubh)}(hEl nuevo punto de entrada también necesita un prototipo de función correspondiente en ``include/linux/syscalls.h``, marcado como asmlinkage para calzar en la manera en que las llamadas de sistema son invocadas::h](hXEl nuevo punto de entrada también necesita un prototipo de función correspondiente en }(hj| hhhNhNubj )}(h``include/linux/syscalls.h``h]hinclude/linux/syscalls.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj| ubha, marcado como asmlinkage para calzar en la manera en que las llamadas de sistema son invocadas:}(hj| hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj% hhubj)}(hasmlinkage long sys_xyzzy(...);h]hasmlinkage long sys_xyzzy(...);}hj sbah}(h]h ]h"]h$]h&]jijjuh1jhhhKhj% hhubh)}(hX7Algunas arquitecturas (e.g. x86) tienen sus propias tablas de syscall específicas para la arquitectura, pero muchas otras arquitecturas comparten una tabla de syscall genéricas. Agrega su nueva llamada de sistema a la lista genérica agregando una entrada a la lista en ``include/uapi/asm-generic/unistd.h``::h](hXAlgunas arquitecturas (e.g. x86) tienen sus propias tablas de syscall específicas para la arquitectura, pero muchas otras arquitecturas comparten una tabla de syscall genéricas. Agrega su nueva llamada de sistema a la lista genérica agregando una entrada a la lista en }(hj hhhNhNubj )}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj% hhubj)}(h8#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy )h]h8#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy )}hj sbah}(h]h ]h"]h$]h&]jijjuh1jhhhKhj% hhubh)}(hX También actualice el conteo de __NR_syscalls para reflejar la llamada de sistema adicional, y note que si multiples llamadas de sistema nuevas son añadidas en la misma ventana unida, su nueva llamada de sistema podría tener que ser ajustada para resolver conflictos.h]hX También actualice el conteo de __NR_syscalls para reflejar la llamada de sistema adicional, y note que si multiples llamadas de sistema nuevas son añadidas en la misma ventana unida, su nueva llamada de sistema podría tener que ser ajustada para resolver conflictos.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj% hhubh)}(hEl archivo ``kernel/sys_ni.c`` provee una implementación fallback stub (rutina de respaldo) para cada llamada de sistema, retornando ``-ENOSYS``. Incluya su nueva llamada a sistema aquí también::h](h El archivo }(hj hhhNhNubj )}(h``kernel/sys_ni.c``h]hkernel/sys_ni.c}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhh provee una implementación fallback stub (rutina de respaldo) para cada llamada de sistema, retornando }(hj hhhNhNubj )}(h ``-ENOSYS``h]h-ENOSYS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh4. Incluya su nueva llamada a sistema aquí también:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj% hhubj)}(hCOND_SYSCALL(xyzzy);h]hCOND_SYSCALL(xyzzy);}hj sbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhj% hhubh)}(hSu nueva funcionalidad del kernel, y la llamada de sistema que la controla, debería normalmente ser opcional, así que incluya una opción ``CONFIG`` (tipicamente en ``init/Kconfig``) para ella. Como es usual para opciones ``CONFIG`` nuevas:h](hSu nueva funcionalidad del kernel, y la llamada de sistema que la controla, debería normalmente ser opcional, así que incluya una opción }(hj& hhhNhNubj )}(h ``CONFIG``h]hCONFIG}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj& ubh (tipicamente en }(hj& hhhNhNubj )}(h``init/Kconfig``h]h init/Kconfig}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj& ubh)) para ella. Como es usual para opciones }(hj& hhhNhNubj )}(h ``CONFIG``h]hCONFIG}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj& ubh nuevas:}(hj& hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj% hhubj)}(hX- Incluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción. - Haga la opción dependiendo de EXPERT si esta debe estar escondida de los usuarios normales. - Haga que cualquier nuevo archivo fuente que implemente la función dependa de la opción CONFIG en el Makefile (e.g. ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). - Revise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada. h]j)}(hhh](j)}(hdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.h]h)}(hdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.h]hdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjq ubah}(h]h ]h"]h$]h&]uh1jhjn ubj)}(h\Haga la opción dependiendo de EXPERT si esta debe estar escondida de los usuarios normales.h]h)}(h\Haga la opción dependiendo de EXPERT si esta debe estar escondida de los usuarios normales.h]h\Haga la opción dependiendo de EXPERT si esta debe estar escondida de los usuarios normales.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj ubah}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hHaga que cualquier nuevo archivo fuente que implemente la función dependa de la opción CONFIG en el Makefile (e.g. ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).h]h)}(hHaga que cualquier nuevo archivo fuente que implemente la función dependa de la opción CONFIG en el Makefile (e.g. ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).h](huHaga que cualquier nuevo archivo fuente que implemente la función dependa de la opción CONFIG en el Makefile (e.g. }(hj hhhNhNubj )}(h*``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``h]h&obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh).}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM hj ubah}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hWRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada. h]h)}(hVRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada.h]hVRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhjn ubeh}(h]h ]h"]h$]h&]jjuh1jhhhMhjj ubah}(h]h ]h"]h$]h&]uh1jhhhMhj% hhubh)}(h-Para resumir, necesita un commit que incluya:h]h-Para resumir, necesita un commit que incluya:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj% hhubj)}(hX4- una opción ``CONFIG`` para la nueva función, normalmente en ``init/Kconfig`` - ``SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada - El correspondiente prototipo en ``include/linux/syscalls.h`` - Una entrada genérica en ``include/uapi/asm-generic/unistd.h`` - fallback stub en ``kernel/sys_ni.c`` h]j)}(hhh](j)}(hNuna opción ``CONFIG`` para la nueva función, normalmente en ``init/Kconfig``h]h)}(hj h](h una opción }(hj hhhNhNubj )}(h ``CONFIG``h]hCONFIG}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh( para la nueva función, normalmente en }(hj hhhNhNubj )}(h``init/Kconfig``h]h init/Kconfig}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h8``SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entradah]h)}(hj= h](j )}(h``SYSCALL_DEFINEn(xyzzy, ...)``h]hSYSCALL_DEFINEn(xyzzy, ...)}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj? ubh para el punto de entrada}(hj? hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj; ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hUna entrada genérica en ``include/uapi/asm-generic/unistd.h``h]h)}(hj h](hUna entrada genérica en }(hj hhhNhNubj )}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h&fallback stub en ``kernel/sys_ni.c`` h]h)}(h$fallback stub en ``kernel/sys_ni.c``h](hfallback stub en }(hj hhhNhNubj )}(h``kernel/sys_ni.c``h]hkernel/sys_ni.c}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhhhMhj ubah}(h]h ]h"]h$]h&]uh1jhhhMhj% hhubeh}(h]-implementation-de-llamada-de-sistema-genericaah ]h"]-implementation de llamada de sistema genericaah$]h&]uh1jqhjshhhhhKubjr)}(hhh](jw)}(h)Implementación de Llamada de Sistema x86h]h)Implementación de Llamada de Sistema x86}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jvhj hhhhhMubh)}(hX.Para conectar su nueva llamada de sistema a plataformas x86, necesita actualizar las tablas maestras syscall. Asumiendo que su nueva llamada de sistema ni es especial de alguna manera (revise abajo), esto involucra una entrada "común" (para x86_64 y x86_32) en arch/x86/entry/syscalls/syscall_64.tbl::h]hX1Para conectar su nueva llamada de sistema a plataformas x86, necesita actualizar las tablas maestras syscall. Asumiendo que su nueva llamada de sistema ni es especial de alguna manera (revise abajo), esto involucra una entrada “común” (para x86_64 y x86_32) en arch/x86/entry/syscalls/syscall_64.tbl:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(h!333 common xyzz sys_xyzzyh]h!333 common xyzz sys_xyzzy}hj sbah}(h]h ]h"]h$]h&]jijjuh1jhhhM#hj hhubh)}(hDy una entrada "i386" en ``arch/x86/entry/syscalls/syscall_32.tbl``::h](hy una entrada “i386” en }(hj hhhNhNubj )}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM%hj hhubj)}(h!380 i386 xyzz sys_xyzzyh]h!380 i386 xyzz sys_xyzzy}hj1 sbah}(h]h ]h"]h$]h&]jijjuh1jhhhM'hj hhubh)}(hqDe nuevo, estos número son propensos de ser cambiados si hay conflictos en la ventana de integración relevante.h]hqDe nuevo, estos número son propensos de ser cambiados si hay conflictos en la ventana de integración relevante.}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hj hhubeh}(h](implementacion-de-llamada-de-sistema-x86ah ]h"])implementación de llamada de sistema x86ah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(h1Compatibilidad de Llamadas de Sistema (Genérica)h]h1Compatibilidad de Llamadas de Sistema (Genérica)}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjU hhhhhM.ubh)}(hXPara la mayoría de llamadas al sistema la misma implementación 64-bit puede ser invocada incluso cuando el programa de userspace es en si mismo 32-bit; incluso si los parámetros de la llamada de sistema incluyen un puntero explícito, esto es manipulado de forma transparente.h]hXPara la mayoría de llamadas al sistema la misma implementación 64-bit puede ser invocada incluso cuando el programa de userspace es en si mismo 32-bit; incluso si los parámetros de la llamada de sistema incluyen un puntero explícito, esto es manipulado de forma transparente.}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM0hjU hhubh)}(hSin embargo, existe un par de situaciones donde se necesita una capa de compatibilidad para lidiar con las diferencias de tamaño entre 32-bit y 64-bit.h]hSin embargo, existe un par de situaciones donde se necesita una capa de compatibilidad para lidiar con las diferencias de tamaño entre 32-bit y 64-bit.}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM5hjU hhubh)}(hXLa primera es si el kernel 64-bit también soporta programas del userspace 32-bit, y por lo tanto necesita analizar areas de memoria del (``__user``) que podrían tener valores tanto 32-bit como 64-bit. En particular esto se necesita siempre que un argumento de la llamada a sistema es:h](hLa primera es si el kernel 64-bit también soporta programas del userspace 32-bit, y por lo tanto necesita analizar areas de memoria del (}(hj hhhNhNubj )}(h ``__user``h]h__user}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh) que podrían tener valores tanto 32-bit como 64-bit. En particular esto se necesita siempre que un argumento de la llamada a sistema es:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM9hjU hhubj)}(hX- un puntero a un puntero - un puntero a un struc conteniendo un puntero (por ejemplo ``struct iovec __user *``) - un puntero a un type entero de tamaño entero variable (``time_t``, ``off_t``, ``long``, ...) - un puntero a un struct conteniendo un type entero de tamaño variable. h]j)}(hhh](j)}(hun puntero a un punteroh]h)}(hj h]hun puntero a un puntero}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hTun puntero a un struc conteniendo un puntero (por ejemplo ``struct iovec __user *``)h]h)}(hTun puntero a un struc conteniendo un puntero (por ejemplo ``struct iovec __user *``)h](h:un puntero a un struc conteniendo un puntero (por ejemplo }(hj hhhNhNubj )}(h``struct iovec __user *``h]hstruct iovec __user *}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM?hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h]un puntero a un type entero de tamaño entero variable (``time_t``, ``off_t``, ``long``, ...)h]h)}(h]un puntero a un type entero de tamaño entero variable (``time_t``, ``off_t``, ``long``, ...)h](h8un puntero a un type entero de tamaño entero variable (}(hj hhhNhNubj )}(h ``time_t``h]htime_t}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh, }(hj hhhNhNubj )}(h ``off_t``h]hoff_t}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh, }(hj hhhNhNubj )}(h``long``h]hlong}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh, ...)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMAhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hGun puntero a un struct conteniendo un type entero de tamaño variable. h]h)}(hFun puntero a un struct conteniendo un type entero de tamaño variable.h]hFun puntero a un struct conteniendo un type entero de tamaño variable.}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMChj8 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhhhM>hj ubah}(h]h ]h"]h$]h&]uh1jhhhM>hjU hhubh)}(hXLa segunda situación que requiere una capa de compatibilidad es cuando uno de los argumentos de la llamada a sistema tiene un argumento que es explícitamente 64-bit incluso sobre arquitectura 32-bit, por ejemplo ``loff_t`` o ``__u64``. En este caso, el valor que llega a un kernel 64-bit desde una aplicación de 32-bit se separará en dos valores de 32-bit, los que luego necesitan ser reensamblados en la capa de compatibilidad.h](hLa segunda situación que requiere una capa de compatibilidad es cuando uno de los argumentos de la llamada a sistema tiene un argumento que es explícitamente 64-bit incluso sobre arquitectura 32-bit, por ejemplo }(hj\ hhhNhNubj )}(h ``loff_t``h]hloff_t}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\ ubh o }(hj\ hhhNhNubj )}(h ``__u64``h]h__u64}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\ ubh. En este caso, el valor que llega a un kernel 64-bit desde una aplicación de 32-bit se separará en dos valores de 32-bit, los que luego necesitan ser reensamblados en la capa de compatibilidad.}(hj\ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMEhjU hhubh)}(hX%(Note que un argumento de una llamada a sistema que sea un puntero a un type explicitamente de 64-bit **no** necesita una capa de compatibilidad; por ejemplo, los argumentos de :manpage:`splice(2)`) del tipo ``loff_t __user *`` no significan la necesidad de una llamada a sistema ``compat_``.)h](hf(Note que un argumento de una llamada a sistema que sea un puntero a un type explicitamente de 64-bit }(hj hhhNhNubhstrong)}(h**no**h]hno}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhE necesita una capa de compatibilidad; por ejemplo, los argumentos de }(hj hhhNhNubjZ)}(h:manpage:`splice(2)`h]h splice(2)}(hj hhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk splice(2)jmsplicejojpuh1jYhj ubh ) del tipo }(hj hhhNhNubj )}(h``loff_t __user *``h]hloff_t __user *}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh5 no significan la necesidad de una llamada a sistema }(hj hhhNhNubj )}(h ``compat_``h]hcompat_}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh.)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMLhjU hhubh)}(hXLa versión compatible de la llamada de sistema se llama ``compat_sys_xyzzy()``, y se agrega con la macro ``COMPAT_SYSCALL_DEFINEn``, de manera análoga a SYSCALL_DEFINEn. Esta versión de la implementación se ejecuta como parte de un kernel de 64-bit, pero espera recibir parametros con valores 32-bit y hace lo que tenga que hacer para tratar con ellos. (Típicamente, la versión ``compat_sys_`` convierte los valores a versiones de 64 bits y llama a la versión ``sys_`` o ambas llaman a una función de implementación interna común.)h](h9La versión compatible de la llamada de sistema se llama }(hj hhhNhNubj )}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh, y se agrega con la macro }(hj hhhNhNubj )}(h``COMPAT_SYSCALL_DEFINEn``h]hCOMPAT_SYSCALL_DEFINEn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh, de manera análoga a SYSCALL_DEFINEn. Esta versión de la implementación se ejecuta como parte de un kernel de 64-bit, pero espera recibir parametros con valores 32-bit y hace lo que tenga que hacer para tratar con ellos. (Típicamente, la versión }(hj hhhNhNubj )}(h``compat_sys_``h]h compat_sys_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhD convierte los valores a versiones de 64 bits y llama a la versión }(hj hhhNhNubj )}(h``sys_``h]hsys_}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubhB o ambas llaman a una función de implementación interna común.)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMRhjU hhubh)}(hEl punto de entrada compat también necesita un prototipo de función correspondiente, en ``include/linux/compat.h``, marcado como asmlinkage para igualar la forma en que las llamadas al sistema son invocadas::h](hZEl punto de entrada compat también necesita un prototipo de función correspondiente, en }(hj>hhhNhNubj )}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj>ubh], marcado como asmlinkage para igualar la forma en que las llamadas al sistema son invocadas:}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM[hjU hhubj)}(h&asmlinkage long compat_sys_xyzzy(...);h]h&asmlinkage long compat_sys_xyzzy(...);}hj^sbah}(h]h ]h"]h$]h&]jijjuh1jhhhM_hjU hhubh)}(hX:Si la nueva llamada al sistema involucra una estructura que que se dispone de forma distinta en sistema de 32-bit y 64-bit, digamos ``struct xyzzy_args``, entonces el archivo de cabecera include/linux/compat.h también debería incluir una versión compatible de la estructura (``struct compat_xyzzy_args``) donde cada campo de tamaño variable tiene el tipo ``compat_`` apropiado que corresponde al tipo en ``struct xyzzy_args``. La rutina ``compat_sys_xyzzy()`` puede entonces usar esta estructura ``compat_`` para analizar los argumentos de una invocación de 32-bit.h](hSi la nueva llamada al sistema involucra una estructura que que se dispone de forma distinta en sistema de 32-bit y 64-bit, digamos }(hjlhhhNhNubj )}(h``struct xyzzy_args``h]hstruct xyzzy_args}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh}, entonces el archivo de cabecera include/linux/compat.h también debería incluir una versión compatible de la estructura (}(hjlhhhNhNubj )}(h``struct compat_xyzzy_args``h]hstruct compat_xyzzy_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh5) donde cada campo de tamaño variable tiene el tipo }(hjlhhhNhNubj )}(h ``compat_``h]hcompat_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh& apropiado que corresponde al tipo en }(hjlhhhNhNubj )}(h``struct xyzzy_args``h]hstruct xyzzy_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh . La rutina }(hjlhhhNhNubj )}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh% puede entonces usar esta estructura }(hjlhhhNhNubj )}(h ``compat_``h]hcompat_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjlubh; para analizar los argumentos de una invocación de 32-bit.}(hjlhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMahjU hhubh)}(hPor ejemplo, si hay campos::h]hPor ejemplo, si hay campos:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMkhjU hhubj)}(hlstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };h]hlstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMmhjU hhubh)}(hDen struct xyzzy_args, entonces struct compat_xyzzy_args debe tener::h]hCen struct xyzzy_args, entonces struct compat_xyzzy_args debe tener:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMthjU hhubj)}(hlstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };h]hlstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMvhjU hhubh)}(hla lista genérica de llamadas al sistema también necesita ajustes para permitir la versión compat; la entrada en ``include/uapi/asm-generic/unistd.h`` debería usar ``__SC_COMP`` en vez de ``__SYSCALL``::h](htla lista genérica de llamadas al sistema también necesita ajustes para permitir la versión compat; la entrada en }(hjhhhNhNubj )}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh debería usar }(hjhhhNhNubj )}(h ``__SC_COMP``h]h __SC_COMP}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh en vez de }(hjhhhNhNubj )}(h ``__SYSCALL``h]h __SYSCALL}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM}hjU hhubj)}(hI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)h]hI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)}hjbsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjU hhubh)}(hPara resumir, necesita:h]hPara resumir, necesita:}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjU hhubj)}(hXA- una ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada de compat. - el prototipo correspondiente en ``include/linux/compat.h`` - (en caso de ser necesario) un struct de mapeo de 32-bit en ``include/linux/compat.h`` - una instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h`` h]j)}(hhh](j)}(hNuna ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada de compat.h]h)}(hjh](huna }(hjhhhNhNubj )}(h&``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)``h]h"COMPAT_SYSCALL_DEFINEn(xyzzy, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh$ para el punto de entrada de compat.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h:el prototipo correspondiente en ``include/linux/compat.h``h]h)}(hjh](h el prototipo correspondiente en }(hjhhhNhNubj )}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hU(en caso de ser necesario) un struct de mapeo de 32-bit en ``include/linux/compat.h``h]h)}(hjh](h;(en caso de ser necesario) un struct de mapeo de 32-bit en }(hjhhhNhNubj )}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hYuna instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h`` h]h)}(hXuna instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h``h](huna instancia de }(hjhhhNhNubj )}(h ``__SC_COMP``h]h __SC_COMP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh no }(hjhhhNhNubj )}(h ``__SYSCALL``h]h __SYSCALL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh en }(hjhhhNhNubj )}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhMhj~ubah}(h]h ]h"]h$]h&]uh1jhhhMhjU hhubeh}(h].compatibilidad-de-llamadas-de-sistema-genericaah ]h"]1compatibilidad de llamadas de sistema (genérica)ah$]h&]uh1jqhjshhhhhM.ubjr)}(hhh](jw)}(h+Compatibilidad de Llamadas de Sistema (x86)h]h+Compatibilidad de Llamadas de Sistema (x86)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjVhhhhhMubh)}(hPara conectar la arquitectura x86 de una llamada al sistema con una versión de compatibilidad, las entradas en las tablas de syscall deben ser ajustadas.h]hPara conectar la arquitectura x86 de una llamada al sistema con una versión de compatibilidad, las entradas en las tablas de syscall deben ser ajustadas.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubh)}(hPrimero, la entrada en ``arch/x86/entry/syscalls/syscall_32.tbl`` recibe una columna extra para indicar que un programa del userspace de 32-bit corriendo en un kernel de 64-bit debe llegar al punto de entrada compat::h](hPrimero, la entrada en }(hjuhhhNhNubj )}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjuubh recibe una columna extra para indicar que un programa del userspace de 32-bit corriendo en un kernel de 64-bit debe llegar al punto de entrada compat:}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubj)}(h=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzyh]h=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjVhhubh)}(hSegundo, tienes que averiguar qué debería pasar para la versión x32 ABI de la nueva llamada al sistema. Aquí hay una elección: el diseño de los argumentos debería coincidir con la versión de 64-bit o la versión de 32-bit.h]hSegundo, tienes que averiguar qué debería pasar para la versión x32 ABI de la nueva llamada al sistema. Aquí hay una elección: el diseño de los argumentos debería coincidir con la versión de 64-bit o la versión de 32-bit.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubh)}(hXSi hay involucrado un puntero-a-puntero, la decisión es fácil: x32 es ILP32, por lo que el diseño debe coincidir con la versión 32-bit, y la entrada en ``arch/x86/entry/syscalls/syscall_64.tbl`` se divide para que progamas 32-bit lleguen al envoltorio de compatibilidad::h](hSi hay involucrado un puntero-a-puntero, la decisión es fácil: x32 es ILP32, por lo que el diseño debe coincidir con la versión 32-bit, y la entrada en }(hjhhhNhNubj )}(h*``arch/x86/entry/syscalls/syscall_64.tbl``h]h&arch/x86/entry/syscalls/syscall_64.tbl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhL se divide para que progamas 32-bit lleguen al envoltorio de compatibilidad:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubj)}(h\333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzyh]h\333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzy}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjVhhubh)}(hSi no hay punteros involucrados, entonces es preferible reutilizar el system call 64-bit para el x32 ABI (y consecuentemente la entrada en arch/x86/entry/syscalls/syscall_64.tbl no se cambia).h]hSi no hay punteros involucrados, entonces es preferible reutilizar el system call 64-bit para el x32 ABI (y consecuentemente la entrada en arch/x86/entry/syscalls/syscall_64.tbl no se cambia).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubh)}(hEn cualquier caso, debes revisar que lo tipos involucrados en su diseño de argumentos de hecho asigne exactamente de x32 (-mx32) a 32-bit(-m32) o equivalentes 64-bit (-m64).h]hEn cualquier caso, debes revisar que lo tipos involucrados en su diseño de argumentos de hecho asigne exactamente de x32 (-mx32) a 32-bit(-m32) o equivalentes 64-bit (-m64).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjVhhubeh}(h])compatibilidad-de-llamadas-de-sistema-x86ah ]h"]+compatibilidad de llamadas de sistema (x86)ah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(h.Llamadas de Sistema Retornando a Otros Lugaresh]h.Llamadas de Sistema Retornando a Otros Lugares}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhMubh)}(hXGPara la mayoría de las llamadas al sistema, una vez que se la llamada al sistema se ha completado el programa de usuario continúa exactamente donde quedó -- en la siguiente instrucción, con el stack igual y la mayoría de los registros igual que antes de la llamada al sistema, y con el mismo espacio en la memoria virtual.h]hXGPara la mayoría de las llamadas al sistema, una vez que se la llamada al sistema se ha completado el programa de usuario continúa exactamente donde quedó -- en la siguiente instrucción, con el stack igual y la mayoría de los registros igual que antes de la llamada al sistema, y con el mismo espacio en la memoria virtual.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hX Sin embargo, unas pocas llamadas al sistema hacen las cosas diferente. Estas podrían retornar a una ubicación distinta (``rt_sigreturn``) o cambiar el espacio de memoria (``fork``/``vfork``/``clone``) o incluso de arquitectura (``execve``/``execveat``) del programa.h](hzSin embargo, unas pocas llamadas al sistema hacen las cosas diferente. Estas podrían retornar a una ubicación distinta (}(hj"hhhNhNubj )}(h``rt_sigreturn``h]h rt_sigreturn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh#) o cambiar el espacio de memoria (}(hj"hhhNhNubj )}(h``fork``h]hfork}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh/}(hj"hhhNhNubj )}(h ``vfork``h]hvfork}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh/}hj"sbj )}(h ``clone``h]hclone}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh) o incluso de arquitectura (}(hj"hhhNhNubj )}(h ``execve``h]hexecve}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh/}hj"sbj )}(h ``execveat``h]hexecveat}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj"ubh) del programa.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXPara permitir esto, la implementación del kernel de la llamada al sistema podría necesitar guardar y restaurar registros adicionales al stak del kernel, brindandole control completo de donde y cómo la ejecución continúa después de la llamada a sistema.h]hXPara permitir esto, la implementación del kernel de la llamada al sistema podría necesitar guardar y restaurar registros adicionales al stak del kernel, brindandole control completo de donde y cómo la ejecución continúa después de la llamada a sistema.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hEsto es arch-specific, pero típicamente involucra definir puntos de entrada assembly que guardan/restauran registros adicionales e invocan el punto de entrada real de la llamada a sistema.h]hEsto es arch-specific, pero típicamente involucra definir puntos de entrada assembly que guardan/restauran registros adicionales e invocan el punto de entrada real de la llamada a sistema.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hPara x86_64, esto es implementado como un punto de entrada ``stub_xyzzy`` en ``arch/x86/entry/entry_64.S``, y la entrada en la tabla syscall (``arch/x86/entry/syscalls/syscall_32.tbl``) es ajustada para calzar::h](h;Para x86_64, esto es implementado como un punto de entrada }(hjhhhNhNubj )}(h``stub_xyzzy``h]h stub_xyzzy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh en }(hjhhhNhNubj )}(h``arch/x86/entry/entry_64.S``h]harch/x86/entry/entry_64.S}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh$, y la entrada en la tabla syscall (}(hjhhhNhNubj )}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh) es ajustada para calzar:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(h"333 common xyzzy stub_xyzzyh]h"333 common xyzzy stub_xyzzy}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjhhubh)}(hEl equivalente para programas 32-bit corriendo en un kernel 64-bit es normalmente llamado ``stub32_xyzzy`` e implementado en ``arch/x86/entry/entry_64_compat.S``, con el correspondiente ajuste en la tabla syscall en ``arch/x86/syscalls/syscall_32.tbl``::h](hZEl equivalente para programas 32-bit corriendo en un kernel 64-bit es normalmente llamado }(hj hhhNhNubj )}(h``stub32_xyzzy``h]h stub32_xyzzy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh e implementado en }(hj hhhNhNubj )}(h$``arch/x86/entry/entry_64_compat.S``h]h arch/x86/entry/entry_64_compat.S}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh7, con el correspondiente ajuste en la tabla syscall en }(hj hhhNhNubj )}(h$``arch/x86/syscalls/syscall_32.tbl``h]h arch/x86/syscalls/syscall_32.tbl}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(h6380 i386 xyzzy sys_xyzzy stub32_xyzzyh]h6380 i386 xyzzy sys_xyzzy stub32_xyzzy}hjNsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjhhubh)}(hXSi la llamada a sistema necesita una capa de compatibilidad (como en la sección anterior) entonces la versión ``stub32_`` necesita llamar a la versión ``compat_sys_`` de la llamada a sistema, en vez de la versión nativa de 64-bit. También, si la implementación de la versión x32 ABI no es comun con la versión x86_64, entonces su tabla syscall también necesitará invocar un stub que llame a la versión ``compat_sys_``h](hpSi la llamada a sistema necesita una capa de compatibilidad (como en la sección anterior) entonces la versión }(hj\hhhNhNubj )}(h ``stub32_``h]hstub32_}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\ubh necesita llamar a la versión }(hj\hhhNhNubj )}(h``compat_sys_``h]h compat_sys_}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\ubh de la llamada a sistema, en vez de la versión nativa de 64-bit. También, si la implementación de la versión x32 ABI no es comun con la versión x86_64, entonces su tabla syscall también necesitará invocar un stub que llame a la versión }(hj\hhhNhNubj )}(h``compat_sys_``h]h compat_sys_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hj\ubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXIPara completar, también es agradable configurar un mapeo de modo que el user-mode linux todavía funcione -- su tabla syscall referenciará stub_xyzzy, pero el UML construido no incluye una implementación ``arch/x86/entry/entry_64.S``. Arreglar esto es tan simple como agregar un #define a ``arch/x86/um/sys_call_table_64.c``::h](hPara completar, también es agradable configurar un mapeo de modo que el user-mode linux todavía funcione -- su tabla syscall referenciará stub_xyzzy, pero el UML construido no incluye una implementación }(hjhhhNhNubj )}(h``arch/x86/entry/entry_64.S``h]harch/x86/entry/entry_64.S}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh8. Arreglar esto es tan simple como agregar un #define a }(hjhhhNhNubj )}(h#``arch/x86/um/sys_call_table_64.c``h]harch/x86/um/sys_call_table_64.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(h#define stub_xyzzy sys_xyzzyh]h#define stub_xyzzy sys_xyzzy}hjsbah}(h]h ]h"]h$]h&]jijjuh1jhhhMhjhhubeh}(h].llamadas-de-sistema-retornando-a-otros-lugaresah ]h"].llamadas de sistema retornando a otros lugaresah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(hOtros detallesh]hOtros detalles}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhMubh)}(hLa mayoría del kernel trata las llamadas a sistema de manera genérica, pero está la excepción ocasional que pueda requerir actualización para su llamada a sistema particular.h]hLa mayoría del kernel trata las llamadas a sistema de manera genérica, pero está la excepción ocasional que pueda requerir actualización para su llamada a sistema particular.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hXEl subsistema de auditoría es un caso especial; este incluye funciones (arch-specific) que clasifican algunos tipos especiales de llamadas al sistema -- específicamente file open (``open``/``openat``), program execution (``execve`` /``execveat``) o operaciones multiplexores de socket (``socketcall``). Si su nueva llamada de sistema es análoga a alguna de estas, entonces el sistema auditor debe ser actualizado.h](hEl subsistema de auditoría es un caso especial; este incluye funciones (arch-specific) que clasifican algunos tipos especiales de llamadas al sistema -- específicamente file open (}(hjhhhNhNubj )}(h``open``h]hopen}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh/}(hjhhhNhNubj )}(h ``openat``h]hopenat}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh), program execution (}(hjhhhNhNubj )}(h ``execve``h]hexecve}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh /}(hjhhhNhNubj )}(h ``execveat``h]hexecveat}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh)) o operaciones multiplexores de socket (}(hjhhhNhNubj )}(h``socketcall``h]h socketcall}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhr). Si su nueva llamada de sistema es análoga a alguna de estas, entonces el sistema auditor debe ser actualizado.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hMás generalmente, si existe una llamada al sistema que sea análoga a su nueva llamada al sistema, entonces vale la pena hacer un grep a todo el kernel de la llamada a sistema existente, para revisar que no exista otro caso especial.h]hMás generalmente, si existe una llamada al sistema que sea análoga a su nueva llamada al sistema, entonces vale la pena hacer un grep a todo el kernel de la llamada a sistema existente, para revisar que no exista otro caso especial.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubeh}(h]otros-detallesah ]h"]otros detallesah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(hTestingh]hTesting}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhMubh)}(hXKUna nueva llamada al sistema debe obviamente ser probada; también es útil proveer a los revisores con una demostración de cómo los programas del userspace usarán la llamada al sistema. Una buena forma de combinar estos objetivos es incluir un simple programa self-test en un nuevo directorio bajo ``tools/testing/selftests/``.h](hX.Una nueva llamada al sistema debe obviamente ser probada; también es útil proveer a los revisores con una demostración de cómo los programas del userspace usarán la llamada al sistema. Una buena forma de combinar estos objetivos es incluir un simple programa self-test en un nuevo directorio bajo }(hjhhhNhNubj )}(h``tools/testing/selftests/``h]htools/testing/selftests/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hX:Para una nueva llamada al sistema, obviamente no habrá una función envoltorio libc por lo que el test necesitará ser invocado usando ``syscall()``; también, si la llamada al sistema involucra una nueva estructura userspace-visible, el encabezado correspondiente necesitará ser instalado para compilar el test.h](hPara una nueva llamada al sistema, obviamente no habrá una función envoltorio libc por lo que el test necesitará ser invocado usando }(hjhhhNhNubj )}(h ``syscall()``h]h syscall()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh; también, si la llamada al sistema involucra una nueva estructura userspace-visible, el encabezado correspondiente necesitará ser instalado para compilar el test.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hAsegure que selftest corra satisfactoriamente en todas las arquitecturas soportadas. Por ejemplo, revise si funciona cuando es compilado como un x86_64 (-m64), x86_32 (-m32) y x32 (-mx32) programa ABI.h]hAsegure que selftest corra satisfactoriamente en todas las arquitecturas soportadas. Por ejemplo, revise si funciona cuando es compilado como un x86_64 (-m64), x86_32 (-m32) y x32 (-mx32) programa ABI.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubh)}(hPara pruebas más amplias y exhautivas de la nueva funcionalidad, también debería considerar agregar tests al Linus Test Project, o al proyecto xfstests para cambios filesystem-relatedh]hPara pruebas más amplias y exhautivas de la nueva funcionalidad, también debería considerar agregar tests al Linus Test Project, o al proyecto xfstests para cambios filesystem-related}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hjhhubj)}(h`- https://linux-test-project.github.io/ - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git h]j)}(hhh](j)}(h%https://linux-test-project.github.io/h]h)}(hjh]j6)}(hjh]h%https://linux-test-project.github.io/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h6git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git h]h)}(h4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.gith]h4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhMhjubah}(h]h ]h"]h$]h&]uh1jhhhMhjhhubeh}(h]testingah ]h"]testingah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(hMan Pageh]hMan Page}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjBhhhhhMubh)}(hX-Todas las llamada al sistema nueva deben venir con un man page completo, idealmente usando groff markup, pero texto plano también funciona. Si se usa groff, es útil incluir una versión ASCII pre-renderizada del man-page en el cover del email para el patchset, para la conveniencia de los revisores.h]hX-Todas las llamada al sistema nueva deben venir con un man page completo, idealmente usando groff markup, pero texto plano también funciona. Si se usa groff, es útil incluir una versión ASCII pre-renderizada del man-page en el cover del email para el patchset, para la conveniencia de los revisores.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjBhhubh)}(hEl man page debe ser cc'do a linux-man@vger.kernel.org Para más detalles, revise https://www.kernel.org/doc/man-pages/patches.htmlh](hEl man page debe ser cc’do a }(hjahhhNhNubj6)}(hlinux-man@vger.kernel.orgh]hlinux-man@vger.kernel.org}(hjihhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:linux-man@vger.kernel.orguh1j5hjaubh Para más detalles, revise }(hjahhhNhNubj6)}(h1https://www.kernel.org/doc/man-pages/patches.htmlh]h1https://www.kernel.org/doc/man-pages/patches.html}(hj}hhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjaubeh}(h]h ]h"]h$]h&]uh1hhhhMhjBhhubeh}(h]man-pageah ]h"]man pageah$]h&]uh1jqhjshhhhhMubjr)}(hhh](jw)}(h0No invoque las llamadas de sistemas en el kernelh]h0No invoque las llamadas de sistemas en el kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjhhhhhM!ubh)}(hXLas llamadas al sistema son, cómo se declaró más arriba, puntos de interacción entre el userspace y el kernel. Por lo tanto, las funciones de llamada al sistema como ``sys_xyzzy()`` o ``compat_sys_xyzzy()`` deberían ser llamadas sólo desde el userspace vía la tabla de syscall, pero no de otro lugar en el kernel. Si la funcionalidad syscall es útil para ser usada dentro del kernel, necesita ser compartida entre syscalls nuevas o antiguas, o necesita ser compartida entre una syscall y su variante de compatibilidad, esta debería ser implementada mediante una función "helper" (como ``ksys_xyzzy()``). Esta función del kernel puede ahora ser llamada dentro del syscall stub (``sys_xyzzy()``), la syscall stub de compatibilidad (``compat_sys_xyzzy()``), y/o otro código del kernel.h](hLas llamadas al sistema son, cómo se declaró más arriba, puntos de interacción entre el userspace y el kernel. Por lo tanto, las funciones de llamada al sistema como }(hjhhhNhNubj )}(h``sys_xyzzy()``h]h sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh o }(hjhhhNhNubj )}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhX deberían ser llamadas sólo desde el userspace vía la tabla de syscall, pero no de otro lugar en el kernel. Si la funcionalidad syscall es útil para ser usada dentro del kernel, necesita ser compartida entre syscalls nuevas o antiguas, o necesita ser compartida entre una syscall y su variante de compatibilidad, esta debería ser implementada mediante una función “helper” (como }(hjhhhNhNubj )}(h``ksys_xyzzy()``h]h ksys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhM). Esta función del kernel puede ahora ser llamada dentro del syscall stub (}(hjhhhNhNubj )}(h``sys_xyzzy()``h]h sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh&), la syscall stub de compatibilidad (}(hjhhhNhNubj )}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh), y/o otro código del kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM#hjhhubh)}(hXAl menos en 64-bit x86, será un requerimiento duro desde la v4.17 en adelante no invocar funciones de llamada al sistema (system call) en el kernel. Este usa una convención de llamada diferente para llamadas al sistema donde ``struct pt_regs`` es decodificado on-the-fly en un envoltorio syscall que luego entrega el procesamiento al syscall real. Esto significa que sólo aquellos parámetros que son realmente necesarios para una syscall específica son pasados durante la entrada del syscall, en vez de llenar en seis registros de CPU con contenido random del userspace todo el tiempo (los cuales podrían causar serios problemas bajando la cadena de llamadas).h](hAl menos en 64-bit x86, será un requerimiento duro desde la v4.17 en adelante no invocar funciones de llamada al sistema (system call) en el kernel. Este usa una convención de llamada diferente para llamadas al sistema donde }(hjhhhNhNubj )}(h``struct pt_regs``h]hstruct pt_regs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubhX es decodificado on-the-fly en un envoltorio syscall que luego entrega el procesamiento al syscall real. Esto significa que sólo aquellos parámetros que son realmente necesarios para una syscall específica son pasados durante la entrada del syscall, en vez de llenar en seis registros de CPU con contenido random del userspace todo el tiempo (los cuales podrían causar serios problemas bajando la cadena de llamadas).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM/hjhhubh)}(hMás aún, reglas sobre cómo se debería acceder a la data pueden diferir entre la data del kernel y la data de usuario. Esta es otra razón por la cual llamar a ``sys_xyzzy()`` es generalmente una mala idea.h](hMás aún, reglas sobre cómo se debería acceder a la data pueden diferir entre la data del kernel y la data de usuario. Esta es otra razón por la cual llamar a }(hj3hhhNhNubj )}(h``sys_xyzzy()``h]h sys_xyzzy()}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j hj3ubh es generalmente una mala idea.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hjhhubh)}(hExcepciones a esta regla están permitidas solamente en overrides específicos de arquitectura, envoltorios de compatibilidad específicos de arquitectura, u otro código en arch/.h]hExcepciones a esta regla están permitidas solamente en overrides específicos de arquitectura, envoltorios de compatibilidad específicos de arquitectura, u otro código en arch/.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hjhhubeh}(h]0no-invoque-las-llamadas-de-sistemas-en-el-kernelah ]h"]0no invoque las llamadas de sistemas en el kernelah$]h&]uh1jqhjshhhhhM!ubjr)}(hhh](jw)}(hReferencias y fuentesh]hReferencias y fuentes}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jvhjihhhhhMDubj)}(hX - Artículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: https://lwn.net/Articles/585415/ - Artículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: https://lwn.net/Articles/588444/ - Artículo LWN de Jake Edge describiendo restricciones en argumentos en 64-bit system call: https://lwn.net/Articles/311630/ - Par de artículos LWN de David Drysdale que describen la ruta de implementación de llamadas al sistema en detalle para v3.14: - https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ - Requerimientos arquitectura-específicos para llamadas al sistema son discutidos en el :manpage:`syscall(2)` man-page: http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES - Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: https://yarchive.net/comp/linux/ioctl.html - "How to not invent kernel interfaces", Arnd Bergmann, https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf - Artículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: https://lwn.net/Articles/486306/ - Recomendaciones de Andrew Morton que toda la información relacionada a una nueva llamada al sistema debe venir en el mismo hilo de correos: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org - Recomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir con un man-page: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com - Sugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos - Sugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema que vengan con man-page y selftest: https://lore.kernel.org/r/20140320025530.GA25469@kroah.com - Discusión de Michael Kerrisk de nuevas system call vs. extensiones :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com - Sugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples argumentos deben encapsular estos argumentos en una estructura, la cual incluye un campo de tamaño para futura extensibilidad: https://lore.kernel.org/r/20150730083831.GA22182@gmail.com - Enumerando rarezas por la (re-)utilización de O_* numbering space flags: - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") - Discusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org - Recomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com - Recomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer compatibilidad con versiones 64-bit sobre versiones 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]j)}(hhh](j)}(hzArtículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: https://lwn.net/Articles/585415/h]h)}(hzArtículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: https://lwn.net/Articles/585415/h](hZArtículo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: }(hjhhhNhNubj6)}(h https://lwn.net/Articles/585415/h]h https://lwn.net/Articles/585415/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMFhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hArtículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: https://lwn.net/Articles/588444/h]h)}(hArtículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: https://lwn.net/Articles/588444/h](hcArtículo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: }(hjhhhNhNubj6)}(h https://lwn.net/Articles/588444/h]h https://lwn.net/Articles/588444/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMIhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(h{Artículo LWN de Jake Edge describiendo restricciones en argumentos en 64-bit system call: https://lwn.net/Articles/311630/h]h)}(h{Artículo LWN de Jake Edge describiendo restricciones en argumentos en 64-bit system call: https://lwn.net/Articles/311630/h](h[Artículo LWN de Jake Edge describiendo restricciones en argumentos en 64-bit system call: }(hjhhhNhNubj6)}(h https://lwn.net/Articles/311630/h]h https://lwn.net/Articles/311630/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMKhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hPar de artículos LWN de David Drysdale que describen la ruta de implementación de llamadas al sistema en detalle para v3.14: - https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ h](h)}(h~Par de artículos LWN de David Drysdale que describen la ruta de implementación de llamadas al sistema en detalle para v3.14:h]h~Par de artículos LWN de David Drysdale que describen la ruta de implementación de llamadas al sistema en detalle para v3.14:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMMhjubj)}(hF- https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ h]j)}(hhh](j)}(h https://lwn.net/Articles/604287/h]h)}(hjh]j6)}(hjh]h https://lwn.net/Articles/604287/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubah}(h]h ]h"]h$]h&]uh1hhhhMPhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h!https://lwn.net/Articles/604515/ h]h)}(h https://lwn.net/Articles/604515/h]j6)}(hj6h]h https://lwn.net/Articles/604515/}(hj8hhhNhNubah}(h]h ]h"]h$]h&]refurij6uh1j5hj4ubah}(h]h ]h"]h$]h&]uh1hhhhMQhj0ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhhhMPhjubah}(h]h ]h"]h$]h&]uh1jhhhMPhjubeh}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hRequerimientos arquitectura-específicos para llamadas al sistema son discutidos en el :manpage:`syscall(2)` man-page: http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh]h)}(hRequerimientos arquitectura-específicos para llamadas al sistema son discutidos en el :manpage:`syscall(2)` man-page: http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh](hWRequerimientos arquitectura-específicos para llamadas al sistema son discutidos en el }(hjhhhhNhNubjZ)}(h:manpage:`syscall(2)`h]h syscall(2)}(hjphhhNhNubah}(h]h ]jYah"]h$]h&]jijjjk syscall(2)jmsyscalljojpuh1jYhjhubh man-page: }(hjhhhhNhNubj6)}(h9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh]h9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjhubeh}(h]h ]h"]h$]h&]uh1hhhhMShjdubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(h{Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: https://yarchive.net/comp/linux/ioctl.htmlh]h)}(h{Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: https://yarchive.net/comp/linux/ioctl.htmlh](hDRecopilación de emails de Linus Torvalds discutiendo problemas con }(hjhhhNhNubj )}(h ``ioctl()``h]hioctl()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j hjubh: }(hjhhhNhNubj6)}(h*https://yarchive.net/comp/linux/ioctl.htmlh]h*https://yarchive.net/comp/linux/ioctl.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMVhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hu"How to not invent kernel interfaces", Arnd Bergmann, https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh]h)}(hu"How to not invent kernel interfaces", Arnd Bergmann, https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh](h:“How to not invent kernel interfaces”, Arnd Bergmann, }(hjhhhNhNubj6)}(h?https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh]h?https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMXhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hlArtículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: https://lwn.net/Articles/486306/h]h)}(hlArtículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: https://lwn.net/Articles/486306/h](hLArtículo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: }(hjhhhNhNubj6)}(h https://lwn.net/Articles/486306/h]h https://lwn.net/Articles/486306/}(hj hhhNhNubah}(h]h ]h"]h$]h&]refurij uh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMZhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hRecomendaciones de Andrew Morton que toda la información relacionada a una nueva llamada al sistema debe venir en el mismo hilo de correos: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh]h)}(hRecomendaciones de Andrew Morton que toda la información relacionada a una nueva llamada al sistema debe venir en el mismo hilo de correos: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh](hRecomendaciones de Andrew Morton que toda la información relacionada a una nueva llamada al sistema debe venir en el mismo hilo de correos: }(hj*hhhNhNubj6)}(hVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh]hVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org}(hj2hhhNhNubah}(h]h ]h"]h$]h&]refurij4uh1j5hj*ubeh}(h]h ]h"]h$]h&]uh1hhhhM\hj&ubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hRecomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir con un man-page: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh]h)}(hRecomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir con un man-page: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh](h`Recomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir con un man-page: }(hjQhhhNhNubj6)}(h\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh]h\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com}(hjYhhhNhNubah}(h]h ]h"]h$]h&]refurij[uh1j5hjQubeh}(h]h ]h"]h$]h&]uh1hhhhM_hjMubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hSugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh]h)}(hSugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh](hQSugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: }(hjxhhhNhNubj6)}(hBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh]hBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjxubeh}(h]h ]h"]h$]h&]uh1hhhhMahjtubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hSugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema que vengan con man-page y selftest: https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh]h)}(hSugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema que vengan con man-page y selftest: https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh](hvSugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema que vengan con man-page y selftest: }(hjhhhNhNubj6)}(h:https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh]h:https://lore.kernel.org/r/20140320025530.GA25469@kroah.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMchjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hDiscusión de Michael Kerrisk de nuevas system call vs. extensiones :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh]h)}(hDiscusión de Michael Kerrisk de nuevas system call vs. extensiones :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh](hDDiscusión de Michael Kerrisk de nuevas system call vs. extensiones }(hjhhhNhNubjZ)}(h:manpage:`prctl(2)`h]hprctl(2)}(hjhhhNhNubah}(h]h ]jYah"]h$]h&]jijjjkprctl(2)jmprctljojpuh1jYhjubh: }(hjhhhNhNubj6)}(h\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh]h\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMehjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hXSugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples argumentos deben encapsular estos argumentos en una estructura, la cual incluye un campo de tamaño para futura extensibilidad: https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh]h)}(hXSugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples argumentos deben encapsular estos argumentos en una estructura, la cual incluye un campo de tamaño para futura extensibilidad: https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh](hSugerencias de Ingo Molnar que llamadas al sistema que involucran múltiples argumentos deben encapsular estos argumentos en una estructura, la cual incluye un campo de tamaño para futura extensibilidad: }(hjhhhNhNubj6)}(h:https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh]h:https://lore.kernel.org/r/20150730083831.GA22182@gmail.com}(hj hhhNhNubah}(h]h ]h"]h$]h&]refurij uh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMghjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hX+Enumerando rarezas por la (re-)utilización de O_* numbering space flags: - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") h](h)}(hIEnumerando rarezas por la (re-)utilización de O_* numbering space flags:h]hIEnumerando rarezas por la (re-)utilización de O_* numbering space flags:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMjhj$ubj)}(h- commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") h]j)}(hhh](j)}(hPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")h]h)}(hPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")h]hTcommit 75069f2b5bfb (“vfs: renumber FMODE_NONOTIFY and add to uniqueness check”)}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMlhj=ubah}(h]h ]h"]h$]h&]uh1jhj:ubj)}(hOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")h]h)}(hOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")h]hScommit 12ed2e36c98a (“fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict”)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMnhjUubah}(h]h ]h"]h$]h&]uh1jhj:ubj)}(h0commit bb458c644a59 ("Safer ABI for O_TMPFILE") h]h)}(h/commit bb458c644a59 ("Safer ABI for O_TMPFILE")h]h3commit bb458c644a59 (“Safer ABI for O_TMPFILE”)}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMphjmubah}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]jjuh1jhhhMlhj6ubah}(h]h ]h"]h$]h&]uh1jhhhMlhj$ubeh}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgh]h)}(hDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgh](hKDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: }(hjhhhNhNubj6)}(hAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgh]hAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMrhjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh]h)}(hRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh](hTRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: }(hjhhhNhNubj6)}(h9https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh]h9https://lore.kernel.org/r/20140717193330.GB4703@kroah.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMthjubah}(h]h ]h"]h$]h&]uh1jhj~ubj)}(hRecomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer compatibilidad con versiones 64-bit sobre versiones 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]h)}(hRecomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer compatibilidad con versiones 64-bit sobre versiones 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh](hRecomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer compatibilidad con versiones 64-bit sobre versiones 32-bit: }(hjhhhNhNubj6)}(h\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]h\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1j5hjubeh}(h]h ]h"]h$]h&]uh1hhhhMvhjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]jjuh1jhhhMFhjzubah}(h]h ]h"]h$]h&]uh1jhhhMFhjihhubeh}(h]referencias-y-fuentesah ]h"]referencias y fuentesah$]h&]uh1jqhjshhhhhMDubeh}(h]('agregando-una-nueva-llamada-del-sistemajpeh ]h"]('agregando una nueva llamada del sistemasp_addsyscallseh$]h&]uh1jqhhhhhhhK expect_referenced_by_name}j&jesexpect_referenced_by_id}jpjesubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jvN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjPerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}jp]jeasnameids}(j&jpj%j"jjjjjTjQj" j j j jR jO jSjPjjjjj~j{j?j<jjjfjcjju nametypes}(j&j%jjjTj" j jR jSjjj~j?jjfjuh}(jpjsj"jsjjjjjQjj jWj j% jO j jPjU jjVjjj{jj<jjjBjcjjjiu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h4Hyperlink target "sp-addsyscalls" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourceh،lineKuh1juba transformerN include_log]