€•Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/zh_CN/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/zh_TW/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/it_IT/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ja_JP/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ko_KR/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/pt_BR/process/adding-syscalls”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒSpanish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(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.”…””}”(hh½h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³Œ2Documentation/translations/sp_SP/disclaimer-sp.rst”h“Khh·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hµhhh²hh³hĖh“NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hhŽh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhhŁh³ŒX/var/lib/git/docbuild/linux/Documentation/translations/sp_SP/process/adding-syscalls.rst”h“KubhŒ field_body”“”)”}”(hŒ>:ref:`Documentation/process/adding-syscalls.rst `”h]”h¼)”}”(hhńh]”h)”}”(hhńh]”hŒinline”“”)”}”(hhńh]”hŒ)Documentation/process/adding-syscalls.rst”…””}”(hhūh²hh³Nh“Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hłhhöubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ*translations/sp_SP/process/adding-syscalls”Œ refdomain”jŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ addsyscalls”uh1hh³hģh“Khhóubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khhļubah}”(h]”h ]”h"]”h$]”h&]”uh1hķhhŁubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hģh“KhhŌh²hubhŲ)”}”(hhh]”(hŻ)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hj/h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜhj,h³hģh“Kubhī)”}”(hŒ(Mauricio Fuentes ”h]”h¼)”}”(hŒ'Mauricio Fuentes ”h]”(hŒMauricio Fuentes <”…””}”(hjAh²hh³Nh“NubhŒ reference”“”)”}”(hŒmauriciofb@gmail.com”h]”hŒmauriciofb@gmail.com”…””}”(hjKh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:mauriciofb@gmail.com”uh1jIhjAubhŒ>”…””}”(hjAh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hķhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×h³hģh“KhhŌh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hŅhhh²hh³hģh“KubhŒtarget”“”)”}”(hŒ.. _sp_addsyscalls:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œsp-addsyscalls”uh1jwh“Khhh²hh³hģubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ'Agregando una Nueva Llamada del Sistema”h]”hŒ'Agregando una Nueva Llamada del Sistema”…””}”(hjŒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj‡h²hh³hģh“K 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]”(hŒ”Este documento describe quĆ© involucra agregar una nueva llamada del sistema al kernel Linux, mĆ”s allĆ” de la presentación y consejos normales en ”…””}”(hjšh²hh³Nh“Nubh)”}”(hŒG:ref:`Documentation/process/submitting-patches.rst `”h]”hś)”}”(hj¤h]”hŒ,Documentation/process/submitting-patches.rst”…””}”(hj¦h²hh³Nh“Nubah}”(h]”h ]”(jŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hłhj¢ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jŒ refdomain”j°Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjŒsubmittingpatches”uh1hh³hģh“K hjšubhŒ6 que tambiĆ©n puede encontrar traducido a este idioma.”…””}”(hjšh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K hj‡h²hubj†)”}”(hhh]”(j‹)”}”(hŒ#Alternativas a Llamadas del Sistema”h]”hŒ#Alternativas a Llamadas del Sistema”…””}”(hjĻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjĢh²hh³hģh“Kubh¼)”}”(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.”…””}”(hjŻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KhjĢh²hubhŒ 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.”…””}”(hjüh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khjųubjģ)”}”(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]”(hŒĪ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 ”…””}”(hjh²hh³Nh“NubhŒliteral”“”)”}”(hŒ``poll``”h]”hŒpoll”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ/”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ ``select``”h]”hŒselect”…””}”(hj1h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ/”…””}”hjsbj)”}”(hŒ ``epoll``”h]”hŒepoll”…””}”(hjCh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ! para recibir esta notificación.”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubj÷)”}”(hŒŁ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¼)”}”(hŒŲ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ŒASin embargo, operaciones que no mapean a operaciones similares a ”…””}”(hjeh²hh³Nh“NubhŒmanpage”“”)”}”(hŒ:manpage:`read(2)`”h]”hŒread(2)”…””}”(hjoh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”Œ xml:space”Œpreserve”Œpath”Œread(2)”Œpage”Œread”Œsection”Œ2”uh1jmhjeubhŒ/”…””}”(hjeh²hh³Nh“Nubjn)”}”(hŒ:manpage:`write(2)`”h]”hŒwrite(2)”…””}”(hj‰h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒwrite(2)”jŒwrite”jƒj„uh1jmhjeubhŒ/ tienen que ser implementadas como solicitudes ”…””}”(hjeh²hh³Nh“Nubjn)”}”(hŒ:manpage:`ioctl(2)`”h]”hŒioctl(2)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒioctl(2)”jŒioctl”jƒj„uh1jmhjeubhŒ/, las cuales pueden llevar a un API algo opaca.”…””}”(hjeh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K$hjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jńh³hģh“Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“Khjųubeh}”(h]”h ]”h"]”h$]”h&]”uh1jöhjóubj÷)”}”(hXį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. ”h]”h¼)”}”(hXą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.”h]”(hŒQSi sólo estĆ” exponiendo información del runtime, un nuevo nodo en sysfs (mire ”…””}”(hjÕh²hh³Nh“Nubj)”}”(hŒ'``Documentation/filesystems/sysfs.rst``”h]”hŒ#Documentation/filesystems/sysfs.rst”…””}”(hjŻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÕubhŒ) o el filesystem ”…””}”(hjÕh²hh³Nh“Nubj)”}”(hŒ ``/proc``”h]”hŒ/proc”…””}”(hjļh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÕubhXQ 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.”…””}”(hjÕh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K)hjŃubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjóubj÷)”}”(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 ”…””}”(hjh²hh³Nh“Nubjn)”}”(hŒ:manpage:`fcntl(2)`”h]”hŒfcntl(2)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒfcntl(2)”jŒfcntl”jƒj„uh1jmhjubhŒ* podrĆ­a ser mĆ”s apropiada. Sin embargo, ”…””}”(hjh²hh³Nh“Nubjn)”}”(hŒ:manpage:`fcntl(2)`”h]”hŒfcntl(2)”…””}”(hj-h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒfcntl(2)”jŒfcntl”jƒj„uh1jmhjubhŒ³ 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 ”…””}”(hjh²hh³Nh“Nubjn)”}”(hŒ:manpage:`fcntl(2)`”h]”hŒfcntl(2)”…””}”(hjAh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒfcntl(2)”jŒfcntl”jƒj„uh1jmhjubhŒ~, o la nueva funcionalidad es muy simple (por ejemplo, definir/obtener un flag simple relacionado a un descriptor de archivo).”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K1hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjóubj÷)”}”(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 ”…””}”(hjeh²hh³Nh“Nubjn)”}”(hŒ:manpage:`prctl(2)`”h]”hŒprctl(2)”…””}”(hjmh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒprctl(2)”jŒprctl”jƒj„uh1jmhjeubhŒ* podrĆ­a ser mĆ”s apropiado. Tal como con ”…””}”(hjeh²hh³Nh“Nubjn)”}”(hŒ:manpage:`fcntl(2)`”h]”hŒfcntl(2)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒfcntl(2)”jŒfcntl”jƒj„uh1jmhjeubhŒƒ, esta llamada al sistema es un multiplexor complicado asĆ­ que estĆ” reservado para comandos anĆ”logamente cercanos del existente ”…””}”(hjeh²hh³Nh“Nubj)”}”(hŒ ``prctl()``”h]”hŒprctl()”…””}”(hj•h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjeubhŒ; u obtener/definir un flag simple relacionado a un proceso.”…””}”(hjeh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K:hjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjóubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“Khjķubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“KhjĢh²hubeh}”(h]”Œ#alternativas-a-llamadas-del-sistema”ah ]”h"]”Œ#alternativas a llamadas del sistema”ah$]”h&]”uh1j…hj‡h²hh³hģh“Kubj†)”}”(hhh]”(j‹)”}”(hŒ-DiseƱando el API: Planeando para extensiones”h]”hŒ-DiseƱando el API: Planeando para extensiones”…””}”(hjŹh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjĒh²hh³hģh“KBubh¼)”}”(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.”…””}”(hjŲh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KDhjĒh²hubh¼)”}”(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 -- ”…””}”(hjęh²hh³Nh“Nubj)”}”(hŒ ``eventfd``”h]”hŒeventfd”…””}”(hjīh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ/”…””}”(hjęh²hh³Nh“Nubj)”}”(hŒ ``eventfd2``”h]”hŒeventfd2”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ, ”…””}”(hjęh²hh³Nh“Nubj)”}”(hŒ``dup2``”h]”hŒdup2”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ/”…””}”hjęsbj)”}”(hŒ``dup3``”h]”hŒdup3”…””}”(hj$h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ, ”…””}”hjęsbj)”}”(hŒ``inotify_init``”h]”hŒ inotify_init”…””}”(hj6h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ/”…””}”hjęsbj)”}”(hŒ``inotify_init1``”h]”hŒ inotify_init1”…””}”(hjHh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ, ”…””}”(hjęh²hh³Nh“Nubj)”}”(hŒ``pipe``”h]”hŒpipe”…””}”(hjZh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ/”…””}”hjęsbj)”}”(hŒ ``pipe2``”h]”hŒpipe2”…””}”(hjlh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ, ”…””}”hjęsbj)”}”(hŒ ``renameat``”h]”hŒrenameat”…””}”(hj~h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒ/”…””}”hjęsbj)”}”(hŒ ``renameat2``”h]”hŒ renameat2”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjęubhŒU -- asĆ­ que aprenda de la historia del kernel y planee extensiones desde el inicio.)”…””}”(hjęh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KIhjĒh²hubh¼)”}”(hXPara 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 ”…””}”(hjØh²hh³Nh“Nubj)”}”(hŒ ``EINVAL``”h]”hŒEINVAL”…””}”(hj°h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjØubhŒ ) si ocurre:”…””}”(hjØh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KOhjĒh²hubhŒ literal_block”“”)”}”(hŒJif (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) return -EINVAL;”h]”hŒJif (flags & ~(THING_FLAG1 | THINGFLAG2 | THING_FLAG3)) return -EINVAL;”…””}”hjŹsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“KVhjĒh²hubh¼)”}”(hŒW(Si no hay valores de flags usados aĆŗn, revise que los argumentos del flag sean cero.)”h]”hŒW(Si no hay valores de flags usados aĆŗn, revise que los argumentos del flag sean cero.)”…””}”(hjŲh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KYhjĒh²hubh¼)”}”(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:”…””}”(hjęh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K\hjĒh²hubjÉ)”}”(hŒ–struct xyzzy_params { u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };”h]”hŒ–struct xyzzy_params { u32 size; /* userspace define p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };”…””}”hjōsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“KbhjĒh²hubh¼)”}”(hŒÕSiempre 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 ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ ``param_4``”h]”hŒparam_4”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ, sea diseƱado de forma tal que un valor cero, devuelva el comportamiento previo, entonces permite versiones no coincidentes en ambos sentidos:”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KihjĒh²hubjģ)”}”(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]”(hŒń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 ”…””}”(hj-h²hh³Nh“Nubj)”}”(hŒ``param_4 == 0``”h]”hŒ param_4 == 0”…””}”(hj5h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj-ubhŒ).”…””}”(hj-h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kmhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj&ubj÷)”}”(hŒé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]”h¼)”}”(hŒč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]”(hŒÖ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 ”…””}”(hjWh²hh³Nh“Nubj)”}”(hŒ``param_4 == 0``”h]”hŒ param_4 == 0”…””}”(hj_h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWubhŒ).”…””}”(hjWh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KqhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj&ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“Kmhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“KmhjĒh²hubh¼)”}”(hŒŒRevise :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]”(hŒRevise ”…””}”(hj‰h²hh³Nh“Nubjn)”}”(hŒ:manpage:`perf_event_open(2)`”h]”hŒperf_event_open(2)”…””}”(hj‘h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒperf_event_open(2)”jŒperf_event_open”jƒj„uh1jmhj‰ubhŒ y la función ”…””}”(hj‰h²hh³Nh“Nubj)”}”(hŒ``perf_copy_attr()``”h]”hŒperf_copy_attr()”…””}”(hj„h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ubhŒ (en ”…””}”(hj‰h²hh³Nh“Nubj)”}”(hŒ``kernel/events/code.c``”h]”hŒkernel/events/code.c”…””}”(hj·h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ubhŒ() para un ejemplo de esta aproximación.”…””}”(hj‰h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KvhjĒh²hubeh}”(h]”Œ+disenando-el-api-planeando-para-extensiones”ah ]”h"]”Œ-diseƱando el api: planeando para extensiones”ah$]”h&]”uh1j…hj‡h²hh³hģh“KBubj†)”}”(hhh]”(j‹)”}”(hŒ(DiseƱando el API: Otras consideraciones”h]”hŒ(DiseƱando el API: Otras consideraciones”…””}”(hjŚh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj×h²hh³hģh“K{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.”…””}”(hjčh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K}hj×h²hubh¼)”}”(hX€Si su nueva llamada a sistema 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]”(hŒžSi su nueva llamada a sistema xyzzy(2) retorna un nuevo descriptor de archivo, entonces el argumento flag debe incluir un valor que sea equivalente a definir ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ ``O_CLOEXEC``”h]”hŒ O_CLOEXEC”…””}”(hjžh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒR en el nuevo FD. Esto hace posible al userspace acortar la brecha de tiempo entre ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ ``xyzzy()``”h]”hŒxyzzy()”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ y la llamada a ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ"``fcntl(fd, F_SETFD, FD_CLOEXEC)``”h]”hŒfcntl(fd, F_SETFD, FD_CLOEXEC)”…””}”(hj"h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ , donde un ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ ``fork()``”h]”hŒfork()”…””}”(hj4h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ inesperado y ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ ``execve()``”h]”hŒexecve()”…””}”(hjFh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ’ 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 ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ ``O_CLOEXEC``”h]”hŒ O_CLOEXEC”…””}”(hjXh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒV, ya que es especĆ­fica de la arquitectura y es parte de un espacio numerado de flags ”…””}”(hjöh²hh³Nh“Nubj)”}”(hŒ``O_*``”h]”hŒO_*”…””}”(hjjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöubhŒ que estĆ” bastante lleno.)”…””}”(hjöh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kƒhj×h²hubh¼)”}”(hX„Si 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]”(hŒ“Si su llamada de sistema retorna un nuevo descriptor de archivo, deberĆ­a considerar tambiĆ©n que significa usar la familia de llamadas de sistema ”…””}”(hj‚h²hh³Nh“Nubjn)”}”(hŒ:manpage:`poll(2)`”h]”hŒpoll(2)”…””}”(hjŠh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒpoll(2)”jŒpoll”jƒj„uh1jmhj‚ubhŒß 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.”…””}”(hj‚h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Khj×h²hubh¼)”}”(hŒ[Si su nueva llamada de sistema xyzzy(2) involucra algĆŗn nombre de archivo como argumento::”h]”hŒZSi su nueva llamada de sistema xyzzy(2) involucra algĆŗn nombre de archivo como argumento:”…””}”(hj¤h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K”hj×h²hubjÉ)”}”(hŒ@int sys_xyzzy(const char __user *path, ..., unsigned int flags);”h]”hŒ@int sys_xyzzy(const char __user *path, ..., unsigned int flags);”…””}”hj²sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“K—hj×h²hubh¼)”}”(hŒJdeberĆ­a considerar tambiĆ©n si una versión xyzzyat(2) es mas apropiada::”h]”hŒIdeberĆ­a considerar tambiĆ©n si una versión xyzzyat(2) es mas apropiada:”…””}”(hjĄh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K™hj×h²hubjÉ)”}”(hŒKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);”h]”hŒKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);”…””}”hjĪsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“Kœhj×h²hubh¼)”}”(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 fxyzzy(3) gratis::”h]”(hŒĢEsto 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 ”…””}”(hjÜh²hh³Nh“Nubj)”}”(hŒ``AT_EMPTY_PATH``”h]”hŒ AT_EMPTY_PATH”…””}”(hjäh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜubhŒ6, efectivamente dando una operación fxyzzy(3) gratis:”…””}”(hjÜh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kžhj×h²hubjÉ)”}”(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, ...)”…””}”hjüsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“K£hj×h²hubh¼)”}”(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 ”…””}”(hj h²hh³Nh“Nubjn)”}”(hŒ:manpage:`openat(2)`”h]”hŒ openat(2)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒ openat(2)”jŒopenat”jƒj„uh1jmhj ubhŒ5; para un ejemplo de AT_EMPTY_PATH, mire el man page ”…””}”(hj h²hh³Nh“Nubjn)”}”(hŒ:manpage:`fstatat(2)`”h]”hŒ fstatat(2)”…””}”(hj&h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒ fstatat(2)”jŒfstatat”jƒj„uh1jmhj ubhŒ manpage.)”…””}”(hj h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K¦hj×h²hubh¼)”}”(hŒņSi su nueva llamada de sistema 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]”(hŒSi su nueva llamada de sistema xyzzy(2) involucra un parĆ”metro describiendo un describiendo un movimiento dentro de un archivo, ponga de tipo ”…””}”(hj@h²hh³Nh“Nubj)”}”(hŒ ``loff_t``”h]”hŒloff_t”…””}”(hjHh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj@ubhŒY para que movimientos de 64-bit puedan ser soportados incluso en arquitecturas de 32-bit.”…””}”(hj@h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KŖhj×h²hubh¼)”}”(hX‡Si su nueva llamada de sistema xyzzy(2) 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 xyzzy(2) involucra una funcionalidad privilegiada, esta necesita ser gobernada por la capability bit linux apropiada (revisado con una llamada a ”…””}”(hj`h²hh³Nh“Nubj)”}”(hŒ ``capable()``”h]”hŒ capable()”…””}”(hjhh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`ubhŒ#), como se describe en el man page ”…””}”(hj`h²hh³Nh“Nubjn)”}”(hŒ:manpage:`capabilities(7)`”h]”hŒcapabilities(7)”…””}”(hjzh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒcapabilities(7)”jŒ capabilities”jƒŒ7”uh1jmhj`ubhX{. 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 ”…””}”(hj`h²hh³Nh“Nubj)”}”(hŒ``CAP_SYS_ADMIN``”h]”hŒ CAP_SYS_ADMIN”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`ubhŒ.”…””}”(hj`h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KÆhj×h²hubh¼)”}”(hXLSi su nueva llamada de sistema 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]”(hŒSi su nueva llamada de sistema xyzzy(2) manipula un proceso que no es el proceso invocado, este deberĆ­a ser restringido (usando una llamada a ”…””}”(hj§h²hh³Nh“Nubj)”}”(hŒ``ptrace_may_access()``”h]”hŒptrace_may_access()”…””}”(hjÆh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj§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§h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K¹hj×h²hubh¼)”}”(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.)”…””}”(hjĒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kæhj×h²hubeh}”(h]”Œ&disenando-el-api-otras-consideraciones”ah ]”h"]”Œ(diseƱando el api: otras consideraciones”ah$]”h&]”uh1j…hj‡h²hh³hģh“K{ubj†)”}”(hhh]”(j‹)”}”(hŒProponiendo el API”h]”hŒProponiendo el API”…””}”(hjąh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjŻh²hh³hģh“KĒubh¼)”}”(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):”…””}”(hjīh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KÉhjŻh²hubjģ)”}”(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÷)”}”(hŒ«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)”h]”h¼)”}”(hŒ«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)”h]”hŒ«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)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KĪhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubj÷)”}”(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).”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KŃhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubj÷)”}”(hŒxUna demostración del use de la nueva llamada a sistema en el userspace vĆ­a un selftest en ``tools/testing/selftest/``.”h]”h¼)”}”(hŒxUna 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 ”…””}”(hj7h²hh³Nh“Nubj)”}”(hŒ``tools/testing/selftest/``”h]”hŒtools/testing/selftest/”…””}”(hj?h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7ubhŒ.”…””}”(hj7h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KÓhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubj÷)”}”(hŒŖ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]”h¼)”}”(hŒ©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]”hŒ©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.”…””}”(hjah²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KÕhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“KĪhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“KĪhjŻh²hubh¼)”}”(hŒŒNuevas propuestas de llamadas de sistema, como cualquier cambio al API del kernel, deberĆ­a siempre ser copiado a linux-api@vger.kernel.org.”h]”(hŒrNuevas propuestas de llamadas de sistema, como cualquier cambio al API del kernel, deberĆ­a siempre ser copiado a ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒlinux-api@vger.kernel.org”h]”hŒlinux-api@vger.kernel.org”…””}”(hj‰h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:linux-api@vger.kernel.org”uh1jIhjubhŒ.”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“KŁhjŻh²hubeh}”(h]”Œproponiendo-el-api”ah ]”h"]”Œproponiendo el api”ah$]”h&]”uh1j…hj‡h²hh³hģh“KĒubj†)”}”(hhh]”(j‹)”}”(hŒ-Implementation de Llamada de Sistema Generica”h]”hŒ-Implementation de Llamada de Sistema Generica”…””}”(hj®h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj«h²hh³hģh“KŽubh¼)”}”(hXīLa entrada principal a su nueva llamada de sistema 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]”(hŒJLa entrada principal a su nueva llamada de sistema xyzzy(2) serĆ” llamada ”…””}”(hj¼h²hh³Nh“Nubj)”}”(hŒ``sys_xyzzy()``”h]”hŒ sys_xyzzy()”…””}”(hjÄh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼ubhŒ2, pero incluya este punto de entrada con la macro ”…””}”(hj¼h²hh³Nh“Nubj)”}”(hŒ``SYSCALL_DEFINEn()``”h]”hŒSYSCALL_DEFINEn()”…””}”(hjÖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼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.”…””}”(hj¼h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kąhj«h²hubh¼)”}”(hŒÖEl 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]”(hŒXEl nuevo punto de entrada tambiĆ©n necesita un prototipo de función correspondiente en ”…””}”(hjīh²hh³Nh“Nubj)”}”(hŒ``include/linux/syscalls.h``”h]”hŒinclude/linux/syscalls.h”…””}”(hjöh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjīubhŒa, marcado como asmlinkage para calzar en la manera en que las llamadas de sistema son invocadas:”…””}”(hjīh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kčhj«h²hubjÉ)”}”(hŒasmlinkage long sys_xyzzy(...);”h]”hŒasmlinkage long sys_xyzzy(...);”…””}”hj sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“Kģhj«h²hubh¼)”}”(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 h²hh³Nh“Nubj)”}”(hŒ%``include/uapi/asm-generic/unistd.h``”h]”hŒ!include/uapi/asm-generic/unistd.h”…””}”(hj$ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ:”…””}”(hj h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kīhj«h²hubjÉ)”}”(hŒ8#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy )”h]”hŒ8#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy )”…””}”hj< sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“Kōhj«h²hubh¼)”}”(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.”…””}”(hjJ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“K÷hj«h²hubh¼)”}”(hŒĘEl 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 ”…””}”(hjX h²hh³Nh“Nubj)”}”(hŒ``kernel/sys_ni.c``”h]”hŒkernel/sys_ni.c”…””}”(hj` h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjX ubhŒh provee una implementación fallback stub (rutina de respaldo) para cada llamada de sistema, retornando ”…””}”(hjX h²hh³Nh“Nubj)”}”(hŒ ``-ENOSYS``”h]”hŒ-ENOSYS”…””}”(hjr h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjX ubhŒ4. Incluya su nueva llamada a sistema aquĆ­ tambiĆ©n:”…””}”(hjX h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Kühj«h²hubjÉ)”}”(hŒCOND_SYSCALL(xyzzy);”h]”hŒCOND_SYSCALL(xyzzy);”…””}”hjŠ sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“Mhj«h²hubh¼)”}”(hŒņSu 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]”(hŒŒSu nueva funcionalidad del kernel, y la llamada de sistema que la controla, deberĆ­a normalmente ser opcional, asĆ­ que incluya una opción ”…””}”(hj˜ h²hh³Nh“Nubj)”}”(hŒ ``CONFIG``”h]”hŒCONFIG”…””}”(hj  h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜ ubhŒ (tipicamente en ”…””}”(hj˜ h²hh³Nh“Nubj)”}”(hŒ``init/Kconfig``”h]”hŒ init/Kconfig”…””}”(hj² h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜ ubhŒ)) para ella. Como es usual para opciones ”…””}”(hj˜ h²hh³Nh“Nubj)”}”(hŒ ``CONFIG``”h]”hŒCONFIG”…””}”(hjÄ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜ ubhŒ nuevas:”…””}”(hj˜ h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj«h²hubjģ)”}”(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÷)”}”(hŒdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.”h]”h¼)”}”(hŒdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.”h]”hŒdIncluya una descripción para la nueva funcionalidad y llamada al sistema controlada por la opción.”…””}”(hjē h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjć ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhją 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’ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M hjū ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhją ubj÷)”}”(hŒ”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``).”h]”h¼)”}”(hŒ”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``).”h]”(hŒuHaga que cualquier nuevo archivo fuente que implemente la función dependa de la opción CONFIG en el Makefile (e.g. ”…””}”(hj h²hh³Nh“Nubj)”}”(hŒ*``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``”h]”hŒ&obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ).”…””}”(hj h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhją ubj÷)”}”(hŒWRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada. ”h]”h¼)”}”(hŒVRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada.”h]”hŒVRevise dos veces que el kernel se siga compilando con la nueva opción CONFIG apagada.”…””}”(hjA h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj= ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhją ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“MhjÜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“Mhj«h²hubh¼)”}”(hŒ-Para resumir, necesita un commit que incluya:”h]”hŒ-Para resumir, necesita un commit que incluya:”…””}”(hja h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj«h²hubjģ)”}”(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÷)”}”(hŒNuna opción ``CONFIG`` para la nueva función, normalmente en ``init/Kconfig``”h]”h¼)”}”(hjx h]”(hŒ una opción ”…””}”(hjz h²hh³Nh“Nubj)”}”(hŒ ``CONFIG``”h]”hŒCONFIG”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjz ubhŒ( para la nueva función, normalmente en ”…””}”(hjz h²hh³Nh“Nubj)”}”(hŒ``init/Kconfig``”h]”hŒ init/Kconfig”…””}”(hj“ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjz ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjv ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjs ubj÷)”}”(hŒ8``SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada”h]”h¼)”}”(hjÆ h]”(j)”}”(hŒ``SYSCALL_DEFINEn(xyzzy, ...)``”h]”hŒSYSCALL_DEFINEn(xyzzy, ...)”…””}”(hj“ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj± ubhŒ para el punto de entrada”…””}”(hj± h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj­ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjs ubj÷)”}”(hŒUna entrada genĆ©rica en ``include/uapi/asm-generic/unistd.h``”h]”h¼)”}”(hjł h]”(hŒUna entrada genĆ©rica en ”…””}”(hjū h²hh³Nh“Nubj)”}”(hŒ%``include/uapi/asm-generic/unistd.h``”h]”hŒ!include/uapi/asm-generic/unistd.h”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjū ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj÷ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjs ubj÷)”}”(hŒ&fallback stub en ``kernel/sys_ni.c`` ”h]”h¼)”}”(hŒ$fallback stub en ``kernel/sys_ni.c``”h]”(hŒfallback stub en ”…””}”(hj h²hh³Nh“Nubj)”}”(hŒ``kernel/sys_ni.c``”h]”hŒkernel/sys_ni.c”…””}”(hj( h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjs ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“Mhjo ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“Mhj«h²hubeh}”(h]”Œ-implementation-de-llamada-de-sistema-generica”ah ]”h"]”Œ-implementation de llamada de sistema generica”ah$]”h&]”uh1j…hj‡h²hh³hģh“KŽubj†)”}”(hhh]”(j‹)”}”(hŒ)Implementación de Llamada de Sistema x86”h]”hŒ)Implementación de Llamada de Sistema x86”…””}”(hjY h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjV h²hh³hģh“Mubh¼)”}”(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:”…””}”(hjg h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MhjV h²hubjÉ)”}”(hŒ!333 common xyzz sys_xyzzy”h]”hŒ!333 common xyzz sys_xyzzy”…””}”hju sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M#hjV h²hubh¼)”}”(hŒDy una entrada "i386" en ``arch/x86/entry/syscalls/syscall_32.tbl``::”h]”(hŒy una entrada ā€œi386ā€ en ”…””}”(hjƒ h²hh³Nh“Nubj)”}”(hŒ*``arch/x86/entry/syscalls/syscall_32.tbl``”h]”hŒ&arch/x86/entry/syscalls/syscall_32.tbl”…””}”(hj‹ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjƒ ubhŒ:”…””}”(hjƒ h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M%hjV h²hubjÉ)”}”(hŒ!380 i386 xyzz sys_xyzzy”h]”hŒ!380 i386 xyzz sys_xyzzy”…””}”hj£ sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M'hjV h²hubh¼)”}”(hŒqDe nuevo, estos nĆŗmero son propensos de ser cambiados si hay conflictos en la ventana de integración relevante.”h]”hŒqDe nuevo, estos nĆŗmero son propensos de ser cambiados si hay conflictos en la ventana de integración relevante.”…””}”(hj± h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M)hjV h²hubeh}”(h]”Œ(implementacion-de-llamada-de-sistema-x86”ah ]”h"]”Œ)implementación de llamada de sistema x86”ah$]”h&]”uh1j…hj‡h²hh³hģh“Mubj†)”}”(hhh]”(j‹)”}”(hŒ1Compatibilidad de Llamadas de Sistema (GenĆ©rica)”h]”hŒ1Compatibilidad de Llamadas de Sistema (GenĆ©rica)”…””}”(hjŹ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjĒ h²hh³hģh“M.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.”…””}”(hjŲ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M0hjĒ h²hubh¼)”}”(hŒ˜Sin 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]”hŒ˜Sin 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.”…””}”(hję h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M5hjĒ h²hubh¼)”}”(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]”(hŒŠLa 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ō h²hh³Nh“Nubj)”}”(hŒ ``__user``”h]”hŒ__user”…””}”(hjü h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjō 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ō h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M9hjĒ h²hubjģ)”}”(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÷)”}”(hŒun puntero a un puntero”h]”h¼)”}”(hj h]”hŒun puntero a un puntero”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M>hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj ubj÷)”}”(hŒTun puntero a un struc conteniendo un puntero (por ejemplo ``struct iovec __user *``)”h]”h¼)”}”(hŒTun puntero a un struc conteniendo un puntero (por ejemplo ``struct iovec __user *``)”h]”(hŒ:un puntero a un struc conteniendo un puntero (por ejemplo ”…””}”(hj6 h²hh³Nh“Nubj)”}”(hŒ``struct iovec __user *``”h]”hŒstruct iovec __user *”…””}”(hj> h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6 ubhŒ)”…””}”(hj6 h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M?hj2 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj 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]”(hŒ8un puntero a un type entero de tamaƱo entero variable (”…””}”(hj` h²hh³Nh“Nubj)”}”(hŒ ``time_t``”h]”hŒtime_t”…””}”(hjh h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj` ubhŒ, ”…””}”(hj` h²hh³Nh“Nubj)”}”(hŒ ``off_t``”h]”hŒoff_t”…””}”(hjz h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj` ubhŒ, ”…””}”(hj` h²hh³Nh“Nubj)”}”(hŒ``long``”h]”hŒlong”…””}”(hjŒ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj` ubhŒ, ...)”…””}”(hj` h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MAhj\ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj ubj÷)”}”(hŒGun puntero a un struct conteniendo un type entero de tamaƱo variable. ”h]”h¼)”}”(hŒFun puntero a un struct conteniendo un type entero de tamaƱo variable.”h]”hŒFun puntero a un struct conteniendo un type entero de tamaƱo variable.”…””}”(hj® h²hh³N•wöh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MChjŖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“M>hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“M>hjĒ h²hubh¼)”}”(hX°La 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]”(hŒÖLa 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Ī h²hh³Nh“Nubj)”}”(hŒ ``loff_t``”h]”hŒloff_t”…””}”(hjÖ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjĪ ubhŒ o ”…””}”(hjĪ h²hh³Nh“Nubj)”}”(hŒ ``__u64``”h]”hŒ__u64”…””}”(hjč h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjĪ 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Ī h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MEhjĒ h²hubh¼)”}”(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]”(hŒf(Note que un argumento de una llamada a sistema que sea un puntero a un type explicitamente de 64-bit ”…””}”(hj h²hh³Nh“NubhŒstrong”“”)”}”(hŒ**no**”h]”hŒno”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubhŒE necesita una capa de compatibilidad; por ejemplo, los argumentos de ”…””}”(hj h²hh³Nh“Nubjn)”}”(hŒ:manpage:`splice(2)`”h]”hŒ splice(2)”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒ splice(2)”jŒsplice”jƒj„uh1jmhj ubhŒ ) del tipo ”…””}”(hj h²hh³Nh“Nubj)”}”(hŒ``loff_t __user *``”h]”hŒloff_t __user *”…””}”(hj0 h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ5 no significan la necesidad de una llamada a sistema ”…””}”(hj h²hh³Nh“Nubj)”}”(hŒ ``compat_``”h]”hŒcompat_”…””}”(hjB h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ.)”…””}”(hj h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MLhjĒ h²hubh¼)”}”(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]”(hŒ9La versión compatible de la llamada de sistema se llama ”…””}”(hjZ h²hh³Nh“Nubj)”}”(hŒ``compat_sys_xyzzy()``”h]”hŒcompat_sys_xyzzy()”…””}”(hjb h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ ubhŒ, y se agrega con la macro ”…””}”(hjZ h²hh³Nh“Nubj)”}”(hŒ``COMPAT_SYSCALL_DEFINEn``”h]”hŒCOMPAT_SYSCALL_DEFINEn”…””}”(hjt h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ 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 ”…””}”(hjZ h²hh³Nh“Nubj)”}”(hŒ``compat_sys_``”h]”hŒ compat_sys_”…””}”(hj† h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ ubhŒD convierte los valores a versiones de 64 bits y llama a la versión ”…””}”(hjZ h²hh³Nh“Nubj)”}”(hŒ``sys_``”h]”hŒsys_”…””}”(hj˜ h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ ubhŒB o ambas llaman a una función de implementación interna comĆŗn.)”…””}”(hjZ h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MRhjĒ h²hubh¼)”}”(hŒŅEl 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]”(hŒZEl punto de entrada compat tambiĆ©n necesita un prototipo de función correspondiente, en ”…””}”(hj° h²hh³Nh“Nubj)”}”(hŒ``include/linux/compat.h``”h]”hŒinclude/linux/compat.h”…””}”(hjø h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj° ubhŒ], marcado como asmlinkage para igualar la forma en que las llamadas al sistema son invocadas:”…””}”(hj° h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M[hjĒ h²hubjÉ)”}”(hŒ&asmlinkage long compat_sys_xyzzy(...);”h]”hŒ&asmlinkage long compat_sys_xyzzy(...);”…””}”hjŠ sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M_hjĒ h²hubh¼)”}”(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]”(hŒ„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 ”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ``struct xyzzy_args``”h]”hŒstruct xyzzy_args”…””}”(hję h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ}, entonces el archivo de cabecera include/linux/compat.h tambiĆ©n deberĆ­a incluir una versión compatible de la estructura (”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ``struct compat_xyzzy_args``”h]”hŒstruct compat_xyzzy_args”…””}”(hjų h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ5) donde cada campo de tamaƱo variable tiene el tipo ”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ ``compat_``”h]”hŒcompat_”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ& apropiado que corresponde al tipo en ”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ``struct xyzzy_args``”h]”hŒstruct xyzzy_args”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ . La rutina ”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ``compat_sys_xyzzy()``”h]”hŒcompat_sys_xyzzy()”…””}”(hj.h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ% puede entonces usar esta estructura ”…””}”(hjŽ h²hh³Nh“Nubj)”}”(hŒ ``compat_``”h]”hŒcompat_”…””}”(hj@h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ ubhŒ; para analizar los argumentos de una invocación de 32-bit.”…””}”(hjŽ h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MahjĒ h²hubh¼)”}”(hŒPor ejemplo, si hay campos::”h]”hŒPor ejemplo, si hay campos:”…””}”(hjXh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MkhjĒ h²hubjÉ)”}”(hŒlstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };”h]”hŒlstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };”…””}”hjfsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“MmhjĒ h²hubh¼)”}”(hŒDen struct xyzzy_args, entonces struct compat_xyzzy_args debe tener::”h]”hŒCen struct xyzzy_args, entonces struct compat_xyzzy_args debe tener:”…””}”(hjth²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MthjĒ h²hubjÉ)”}”(hŒlstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };”h]”hŒlstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };”…””}”hj‚sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“MvhjĒ h²hubh¼)”}”(hŒĻla 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]”(hŒtla lista genĆ©rica de llamadas al sistema tambiĆ©n necesita ajustes para permitir la versión compat; la entrada en ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ%``include/uapi/asm-generic/unistd.h``”h]”hŒ!include/uapi/asm-generic/unistd.h”…””}”(hj˜h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ deberĆ­a usar ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ ``__SC_COMP``”h]”hŒ __SC_COMP”…””}”(hjŖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ en vez de ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ ``__SYSCALL``”h]”hŒ __SYSCALL”…””}”(hj¼h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ:”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M}hjĒ h²hubjÉ)”}”(hŒI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)”h]”hŒI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)”…””}”hjŌsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M‚hjĒ h²hubh¼)”}”(hŒPara resumir, necesita:”h]”hŒPara resumir, necesita:”…””}”(hjāh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M…hjĒ h²hubjģ)”}”(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÷)”}”(hŒNuna ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` para el punto de entrada de compat.”h]”h¼)”}”(hjłh]”(hŒuna ”…””}”(hjūh²hh³Nh“Nubj)”}”(hŒ&``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)``”h]”hŒ"COMPAT_SYSCALL_DEFINEn(xyzzy, ...)”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjūubhŒ$ para el punto de entrada de compat.”…””}”(hjūh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M‡hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjōubj÷)”}”(hŒ:el prototipo correspondiente en ``include/linux/compat.h``”h]”h¼)”}”(hj"h]”(hŒ el prototipo correspondiente en ”…””}”(hj$h²hh³Nh“Nubj)”}”(hŒ``include/linux/compat.h``”h]”hŒinclude/linux/compat.h”…””}”(hj+h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mˆhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjōubj÷)”}”(hŒU(en caso de ser necesario) un struct de mapeo de 32-bit en ``include/linux/compat.h``”h]”h¼)”}”(hjGh]”(hŒ;(en caso de ser necesario) un struct de mapeo de 32-bit en ”…””}”(hjIh²hh³Nh“Nubj)”}”(hŒ``include/linux/compat.h``”h]”hŒinclude/linux/compat.h”…””}”(hjPh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M‰hjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjōubj÷)”}”(hŒYuna instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h`` ”h]”h¼)”}”(hŒXuna instancia de ``__SC_COMP`` no ``__SYSCALL`` en ``include/uapi/asm-generic/unistd.h``”h]”(hŒuna instancia de ”…””}”(hjnh²hh³Nh“Nubj)”}”(hŒ ``__SC_COMP``”h]”hŒ __SC_COMP”…””}”(hjvh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjnubhŒ no ”…””}”(hjnh²hh³Nh“Nubj)”}”(hŒ ``__SYSCALL``”h]”hŒ __SYSCALL”…””}”(hjˆh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjnubhŒ en ”…””}”(hjnh²hh³Nh“Nubj)”}”(hŒ%``include/uapi/asm-generic/unistd.h``”h]”hŒ!include/uapi/asm-generic/unistd.h”…””}”(hjšh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjnubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MŠhjjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjōubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“M‡hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“M‡hjĒ h²hubeh}”(h]”Œ.compatibilidad-de-llamadas-de-sistema-generica”ah ]”h"]”Œ1compatibilidad de llamadas de sistema (genĆ©rica)”ah$]”h&]”uh1j…hj‡h²hh³hģh“M.ubj†)”}”(hhh]”(j‹)”}”(hŒ+Compatibilidad de Llamadas de Sistema (x86)”h]”hŒ+Compatibilidad de Llamadas de Sistema (x86)”…””}”(hjĖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjČh²hh³hģh“Mubh¼)”}”(hŒšPara 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]”hŒšPara 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.”…””}”(hjŁh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MhjČh²hubh¼)”}”(hŒŁPrimero, 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]”(hŒPrimero, la entrada en ”…””}”(hjēh²hh³Nh“Nubj)”}”(hŒ*``arch/x86/entry/syscalls/syscall_32.tbl``”h]”hŒ&arch/x86/entry/syscalls/syscall_32.tbl”…””}”(hjļh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjēubhŒ— 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:”…””}”(hjēh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M“hjČh²hubjÉ)”}”(hŒ=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy”h]”hŒ=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M—hjČh²hubh¼)”}”(hŒęSegundo, 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]”hŒęSegundo, 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.”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M™hjČh²hubh¼)”}”(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]”(hŒœSi 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 ”…””}”(hj#h²hh³Nh“Nubj)”}”(hŒ*``arch/x86/entry/syscalls/syscall_64.tbl``”h]”hŒ&arch/x86/entry/syscalls/syscall_64.tbl”…””}”(hj+h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj#ubhŒL se divide para que progamas 32-bit lleguen al envoltorio de compatibilidad:”…””}”(hj#h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MžhjČh²hubjÉ)”}”(hŒ\333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzy”h]”hŒ\333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzy”…””}”hjCsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“M£hjČh²hubh¼)”}”(hŒĮSi 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]”hŒĮSi 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).”…””}”(hjQh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M§hjČh²hubh¼)”}”(hŒ®En 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]”hŒ®En 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).”…””}”(hj_h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M«hjČh²hubeh}”(h]”Œ)compatibilidad-de-llamadas-de-sistema-x86”ah ]”h"]”Œ+compatibilidad de llamadas de sistema (x86)”ah$]”h&]”uh1j…hj‡h²hh³hģh“Mubj†)”}”(hhh]”(j‹)”}”(hŒ.Llamadas de Sistema Retornando a Otros Lugares”h]”hŒ.Llamadas de Sistema Retornando a Otros Lugares”…””}”(hjxh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjuh²hh³hģh“M±ubh¼)”}”(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.”…””}”(hj†h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M³hjuh²hubh¼)”}”(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]”(hŒzSin embargo, unas pocas llamadas al sistema hacen las cosas diferente. Estas podrĆ­an retornar a una ubicación distinta (”…””}”(hj”h²hh³Nh“Nubj)”}”(hŒ``rt_sigreturn``”h]”hŒ rt_sigreturn”…””}”(hjœh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ#) o cambiar el espacio de memoria (”…””}”(hj”h²hh³Nh“Nubj)”}”(hŒ``fork``”h]”hŒfork”…””}”(hj®h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ/”…””}”(hj”h²hh³Nh“Nubj)”}”(hŒ ``vfork``”h]”hŒvfork”…””}”(hjĄh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ/”…””}”hj”sbj)”}”(hŒ ``clone``”h]”hŒclone”…””}”(hjŅh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ) o incluso de arquitectura (”…””}”(hj”h²hh³Nh“Nubj)”}”(hŒ ``execve``”h]”hŒexecve”…””}”(hjäh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ/”…””}”hj”sbj)”}”(hŒ ``execveat``”h]”hŒexecveat”…””}”(hjöh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubhŒ) del programa.”…””}”(hj”h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M¹hjuh²hubh¼)”}”(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.”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M¾hjuh²hubh¼)”}”(hŒ½Esto 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]”hŒ½Esto 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.”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MĆhjuh²hubh¼)”}”(hŒÓPara 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 ”…””}”(hj*h²hh³Nh“Nubj)”}”(hŒ``stub_xyzzy``”h]”hŒ stub_xyzzy”…””}”(hj2h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubhŒ en ”…””}”(hj*h²hh³Nh“Nubj)”}”(hŒ``arch/x86/entry/entry_64.S``”h]”hŒarch/x86/entry/entry_64.S”…””}”(hjDh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubhŒ$, y la entrada en la tabla syscall (”…””}”(hj*h²hh³Nh“Nubj)”}”(hŒ*``arch/x86/entry/syscalls/syscall_32.tbl``”h]”hŒ&arch/x86/entry/syscalls/syscall_32.tbl”…””}”(hjVh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubhŒ) es ajustada para calzar:”…””}”(hj*h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MĒhjuh²hubjÉ)”}”(hŒ"333 common xyzzy stub_xyzzy”h]”hŒ"333 common xyzzy stub_xyzzy”…””}”hjnsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“MĖhjuh²hubh¼)”}”(hŒžEl 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]”(hŒZEl equivalente para programas 32-bit corriendo en un kernel 64-bit es normalmente llamado ”…””}”(hj|h²hh³Nh“Nubj)”}”(hŒ``stub32_xyzzy``”h]”hŒ stub32_xyzzy”…””}”(hj„h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubhŒ e implementado en ”…””}”(hj|h²hh³Nh“Nubj)”}”(hŒ$``arch/x86/entry/entry_64_compat.S``”h]”hŒ arch/x86/entry/entry_64_compat.S”…””}”(hj–h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubhŒ7, con el correspondiente ajuste en la tabla syscall en ”…””}”(hj|h²hh³Nh“Nubj)”}”(hŒ$``arch/x86/syscalls/syscall_32.tbl``”h]”hŒ arch/x86/syscalls/syscall_32.tbl”…””}”(hjØh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubhŒ:”…””}”(hj|h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MĶhjuh²hubjÉ)”}”(hŒ6380 i386 xyzzy sys_xyzzy stub32_xyzzy”h]”hŒ6380 i386 xyzzy sys_xyzzy stub32_xyzzy”…””}”hjĄsbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“MŅhjuh²hubh¼)”}”(hX¬Si 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]”(hŒpSi la llamada a sistema necesita una capa de compatibilidad (como en la sección anterior) entonces la versión ”…””}”(hjĪh²hh³Nh“Nubj)”}”(hŒ ``stub32_``”h]”hŒstub32_”…””}”(hjÖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjĪubhŒ necesita llamar a la versión ”…””}”(hjĪh²hh³Nh“Nubj)”}”(hŒ``compat_sys_``”h]”hŒ compat_sys_”…””}”(hjčh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjĪ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Īh²hh³Nh“Nubj)”}”(hŒ``compat_sys_``”h]”hŒ compat_sys_”…””}”(hjśh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjĪubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MŌhjuh²hubh¼)”}”(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]”(hŒĻPara 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 ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``arch/x86/entry/entry_64.S``”h]”hŒarch/x86/entry/entry_64.S”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ8. Arreglar esto es tan simple como agregar un #define a ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ#``arch/x86/um/sys_call_table_64.c``”h]”hŒarch/x86/um/sys_call_table_64.c”…””}”(hj(h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ:”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MŪhjuh²hubjÉ)”}”(hŒ#define stub_xyzzy sys_xyzzy”h]”hŒ#define stub_xyzzy sys_xyzzy”…””}”hj@sbah}”(h]”h ]”h"]”h$]”h&]”j}j~uh1jČh³hģh“Mįhjuh²hubeh}”(h]”Œ.llamadas-de-sistema-retornando-a-otros-lugares”ah ]”h"]”Œ.llamadas de sistema retornando a otros lugares”ah$]”h&]”uh1j…hj‡h²hh³hģh“M±ubj†)”}”(hhh]”(j‹)”}”(hŒOtros detalles”h]”hŒOtros detalles”…””}”(hjYh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjVh²hh³hģh“Måubh¼)”}”(hŒ³La 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]”hŒ³La 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.”…””}”(hjgh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MēhjVh²hubh¼)”}”(hX El 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]”(hŒ¶El 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 (”…””}”(hjuh²hh³Nh“Nubj)”}”(hŒ``open``”h]”hŒopen”…””}”(hj}h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjuubhŒ/”…””}”(hjuh²hh³Nh“Nubj)”}”(hŒ ``openat``”h]”hŒopenat”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjuubhŒ), program execution (”…””}”(hjuh²hh³Nh“Nubj)”}”(hŒ ``execve``”h]”hŒexecve”…””}”(hj”h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjuubhŒ /”…””}”(hjuh²hh³Nh“Nubj)”}”(hŒ ``execveat``”h]”hŒexecveat”…””}”(hj³h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjuubhŒ)) o operaciones multiplexores de socket (”…””}”(hjuh²hh³Nh“Nubj)”}”(hŒ``socketcall``”h]”hŒ socketcall”…””}”(hjÅh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjuubhŒr). Si su nueva llamada de sistema es anĆ”loga a alguna de estas, entonces el sistema auditor debe ser actualizado.”…””}”(hjuh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MėhjVh²hubh¼)”}”(hŒźMĆ”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]”hŒźMĆ”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.”…””}”(hjŻh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MņhjVh²hubeh}”(h]”Œotros-detalles”ah ]”h"]”Œotros detalles”ah$]”h&]”uh1j…hj‡h²hh³hģh“Måubj†)”}”(hhh]”(j‹)”}”(hŒTesting”h]”hŒTesting”…””}”(hjöh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjóh²hh³hģh“Młubh¼)”}”(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 ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``tools/testing/selftests/``”h]”hŒtools/testing/selftests/”…””}”(hj h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ.”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mūhjóh²hubh¼)”}”(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]”(hŒˆPara una nueva llamada al sistema, obviamente no habrĆ” una función envoltorio libc por lo que el test necesitarĆ” ser invocado usando ”…””}”(hj$h²hh³Nh“Nubj)”}”(hŒ ``syscall()``”h]”hŒ syscall()”…””}”(hj,h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$ubhŒ„; tambiĆ©n, si la llamada al sistema involucra una nueva estructura userspace-visible, el encabezado correspondiente necesitarĆ” ser instalado para compilar el test.”…””}”(hj$h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjóh²hubh¼)”}”(hŒÉAsegure 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]”hŒÉAsegure 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.”…””}”(hjDh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjóh²hubh¼)”}”(hŒŗPara 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”h]”hŒŗPara 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”…””}”(hjRh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M hjóh²hubjģ)”}”(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¼)”}”(hjih]”jJ)”}”(hjih]”hŒ%https://linux-test-project.github.io/”…””}”(hjnh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jiuh1jIhjkubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjdubj÷)”}”(hŒ6git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git ”h]”h¼)”}”(hŒ4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git”h]”hŒ4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git”…””}”(hjŒh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjdubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“Mhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“Mhjóh²hubeh}”(h]”Œtesting”ah ]”h"]”Œtesting”ah$]”h&]”uh1j…hj‡h²hh³hģh“Młubj†)”}”(hhh]”(j‹)”}”(hŒMan Page”h]”hŒMan Page”…””}”(hj·h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj“h²hh³hģh“Mubh¼)”}”(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.”…””}”(hjÅh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj“h²hubh¼)”}”(hŒƒEl 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.html”h]”(hŒEl man page debe ser cc’do a ”…””}”(hjÓh²hh³Nh“NubjJ)”}”(hŒlinux-man@vger.kernel.org”h]”hŒlinux-man@vger.kernel.org”…””}”(hjŪh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ mailto:linux-man@vger.kernel.org”uh1jIhjÓubhŒ Para mĆ”s detalles, revise ”…””}”(hjÓh²hh³Nh“NubjJ)”}”(hŒ1https://www.kernel.org/doc/man-pages/patches.html”h]”hŒ1https://www.kernel.org/doc/man-pages/patches.html”…””}”(hjļh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jńuh1jIhjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mhj“h²hubeh}”(h]”Œman-page”ah ]”h"]”Œman page”ah$]”h&]”uh1j…hj‡h²hh³hģh“Mubj†)”}”(hhh]”(j‹)”}”(hŒ0No invoque las llamadas de sistemas en el kernel”h]”hŒ0No invoque las llamadas de sistemas en el kernel”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhj h²hh³hģh“M!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]”(hŒŖLas 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 ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``sys_xyzzy()``”h]”hŒ sys_xyzzy()”…””}”(hj%h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ o ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``compat_sys_xyzzy()``”h]”hŒcompat_sys_xyzzy()”…””}”(hj7h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhX… 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 ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``ksys_xyzzy()``”h]”hŒ ksys_xyzzy()”…””}”(hjIh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒM). Esta función del kernel puede ahora ser llamada dentro del syscall stub (”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``sys_xyzzy()``”h]”hŒ sys_xyzzy()”…””}”(hj[h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ&), la syscall stub de compatibilidad (”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ``compat_sys_xyzzy()``”h]”hŒcompat_sys_xyzzy()”…””}”(hjmh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ), y/o otro código del kernel.”…””}”(hjh²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M#hj h²hubh¼)”}”(hXšAl 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]”(hŒćAl 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 ”…””}”(hj…h²hh³Nh“Nubj)”}”(hŒ``struct pt_regs``”h]”hŒstruct pt_regs”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj…ubhX„ 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).”…””}”(hj…h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M/hj h²hubh¼)”}”(hŒŃMĆ”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]”(hŒ£MĆ”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 ”…””}”(hj„h²hh³Nh“Nubj)”}”(hŒ``sys_xyzzy()``”h]”hŒ sys_xyzzy()”…””}”(hj­h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj„ubhŒ es generalmente una mala idea.”…””}”(hj„h²hh³Nh“Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M:hj h²hubh¼)”}”(hŒ“Excepciones 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]”hŒ“Excepciones 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/.”…””}”(hjÅh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M>hj h²hubeh}”(h]”Œ0no-invoque-las-llamadas-de-sistemas-en-el-kernel”ah ]”h"]”Œ0no invoque las llamadas de sistemas en el kernel”ah$]”h&]”uh1j…hj‡h²hh³hģh“M!ubj†)”}”(hhh]”(j‹)”}”(hŒReferencias y fuentes”h]”hŒReferencias y fuentes”…””}”(hjŽh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŠhjŪh²hh³hģh“MDubjģ)”}”(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.com”h]”jņ)”}”(hhh]”(j÷)”}”(hŒzArtĆ­culo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: https://lwn.net/Articles/585415/”h]”h¼)”}”(hŒzArtĆ­culo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: https://lwn.net/Articles/585415/”h]”(hŒZArtĆ­culo LWN de Michael Kerrisk sobre el uso de argumentos flags en llamadas al sistema: ”…””}”(hj÷h²hh³Nh“NubjJ)”}”(hŒ https://lwn.net/Articles/585415/”h]”hŒ https://lwn.net/Articles/585415/”…””}”(hj’h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jIhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MFhjóubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒƒArtĆ­culo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: https://lwn.net/Articles/588444/”h]”h¼)”}”(hŒƒArtĆ­culo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: https://lwn.net/Articles/588444/”h]”(hŒcArtĆ­culo LWN de Michael Kerrisk sobre cómo manejar flags desconocidos en una llamada al sistema: ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒ https://lwn.net/Articles/588444/”h]”hŒ https://lwn.net/Articles/588444/”…””}”(hj&h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j(uh1jIhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MIhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjš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: ”…””}”(hjEh²hh³Nh“NubjJ)”}”(hŒ https://lwn.net/Articles/311630/”h]”hŒ https://lwn.net/Articles/311630/”…””}”(hjMh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jOuh1jIhjEubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MKhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(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: - 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:”…””}”(hjlh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MMhjhubjģ)”}”(hŒF- https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ ”h]”jņ)”}”(hhh]”(j÷)”}”(hŒ https://lwn.net/Articles/604287/”h]”h¼)”}”(hjƒh]”jJ)”}”(hjƒh]”hŒ https://lwn.net/Articles/604287/”…””}”(hjˆh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jƒuh1jIhj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MPhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj~ubj÷)”}”(hŒ!https://lwn.net/Articles/604515/ ”h]”h¼)”}”(hŒ https://lwn.net/Articles/604515/”h]”jJ)”}”(hjØh]”hŒ https://lwn.net/Articles/604515/”…””}”(hjŖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jØuh1jIhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MQhj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj~ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“MPhjzubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“MPhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒ°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”h]”h¼)”}”(hŒ°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”h]”(hŒWRequerimientos arquitectura-especĆ­ficos para llamadas al sistema son discutidos en el ”…””}”(hjŚh²hh³Nh“Nubjn)”}”(hŒ:manpage:`syscall(2)`”h]”hŒ syscall(2)”…””}”(hjāh²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒ syscall(2)”jŒsyscall”jƒj„uh1jmhjŚubhŒ man-page: ”…””}”(hjŚh²hh³Nh“NubjJ)”}”(hŒ9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES”h]”hŒ9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES”…””}”(hjöh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jųuh1jIhjŚubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MShjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒ{Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: https://yarchive.net/comp/linux/ioctl.html”h]”h¼)”}”(hŒ{Recopilación de emails de Linus Torvalds discutiendo problemas con ``ioctl()``: https://yarchive.net/comp/linux/ioctl.html”h]”(hŒDRecopilación de emails de Linus Torvalds discutiendo problemas con ”…””}”(hjh²hh³Nh“Nubj)”}”(hŒ ``ioctl()``”h]”hŒioctl()”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ: ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒ*https://yarchive.net/comp/linux/ioctl.html”h]”hŒ*https://yarchive.net/comp/linux/ioctl.html”…””}”(hj/h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j1uh1jIhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MVhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒu"How to not invent kernel interfaces", Arnd Bergmann, https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf”h]”h¼)”}”(hŒu"How to not invent kernel interfaces", Arnd Bergmann, https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf”h]”(hŒ:ā€œHow to not invent kernel interfacesā€, Arnd Bergmann, ”…””}”(hjNh²hh³Nh“NubjJ)”}”(hŒ?https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf”h]”hŒ?https://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf”…””}”(hjVh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jXuh1jIhjNubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MXhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒlArtĆ­culo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: https://lwn.net/Articles/486306/”h]”h¼)”}”(hŒlArtĆ­culo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: https://lwn.net/Articles/486306/”h]”(hŒLArtĆ­culo LWN de Michael Kerrisk sobre evitar nuevos usos de CAP_SYS_ADMIN: ”…””}”(hjuh²hh³Nh“NubjJ)”}”(hŒ https://lwn.net/Articles/486306/”h]”hŒ https://lwn.net/Articles/486306/”…””}”(hj}h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jIhjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MZhjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒć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”h]”h¼)”}”(hŒć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”h]”(hŒRecomendaciones de Andrew Morton que toda la información relacionada a una nueva llamada al sistema debe venir en el mismo hilo de correos: ”…””}”(hjœh²hh³Nh“NubjJ)”}”(hŒVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org”h]”hŒVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org”…””}”(hj¤h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j¦uh1jIhjœubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M\hj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒ¼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”h]”h¼)”}”(hŒ¼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”h]”(hŒ`Recomendaciones de Michael Kerrisk que una nueva llamada al sistema debe venir con un man-page: ”…””}”(hjĆh²hh³Nh“NubjJ)”}”(hŒ\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com”h]”hŒ\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com”…””}”(hjĖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jĶuh1jIhjĆubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“M_hjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒ“Sugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos”h]”h¼)”}”(hŒ“Sugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos”h]”(hŒQSugerencias de Thomas Gleixner que conexiones x86 deben ir en commits separados: ”…””}”(hjźh²hh³Nh“NubjJ)”}”(hŒBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos”h]”hŒBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos”…””}”(hjņh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jōuh1jIhjźubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mahjęubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒ°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”h]”h¼)”}”(hŒ°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”h]”(hŒvSugerencias de Greg Kroah-Hartman que es bueno para las nueva llamadas al sistema que vengan con man-page y selftest: ”…””}”(hjh²hh³Nh“NubjJ)”}”(hŒ:https://lore.kernel.org/r/20140320025530.GA25469@kroah.com”h]”hŒ:https://lore.kernel.org/r/20140320025530.GA25469@kroah.com”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jIhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mchj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒµ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”h]”h¼)”}”(hŒµ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”h]”(hŒDDiscusión de Michael Kerrisk de nuevas system call vs. extensiones ”…””}”(hj8h²hh³Nh“Nubjn)”}”(hŒ:manpage:`prctl(2)`”h]”hŒprctl(2)”…””}”(hj@h²hh³Nh“Nubah}”(h]”h ]”jmah"]”h$]”h&]”j}j~jŒprctl(2)”jŒprctl”jƒj„uh1jmhj8ubhŒ: ”…””}”(hj8h²hh³Nh“NubjJ)”}”(hŒ\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com”h]”hŒ\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com”…””}”(hjTh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jVuh1jIhj8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mehj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjš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.com”h]”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.com”h]”(hŒĶ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: ”…””}”(hjsh²hh³Nh“NubjJ)”}”(hŒ:https://lore.kernel.org/r/20150730083831.GA22182@gmail.com”h]”hŒ:https://lore.kernel.org/r/20150730083831.GA22182@gmail.com”…””}”(hj{h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j}uh1jIhjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mghjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjš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¼)”}”(hŒIEnumerando rarezas por la (re-)utilización de O_* numbering space flags:”h]”hŒIEnumerando rarezas por la (re-)utilización de O_* numbering space flags:”…””}”(hjšh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mjhj–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÷)”}”(hŒPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")”h]”h¼)”}”(hŒPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")”h]”hŒTcommit 75069f2b5bfb (ā€œvfs: renumber FMODE_NONOTIFY and add to uniqueness checkā€)”…””}”(hj³h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MlhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj¬ubj÷)”}”(hŒOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")”h]”h¼)”}”(hŒOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")”h]”hŒScommit 12ed2e36c98a (ā€œfanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflictā€)”…””}”(hjĖh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MnhjĒubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj¬ubj÷)”}”(hŒ0commit bb458c644a59 ("Safer ABI for O_TMPFILE") ”h]”h¼)”}”(hŒ/commit bb458c644a59 ("Safer ABI for O_TMPFILE")”h]”hŒ3commit bb458c644a59 (ā€œSafer ABI for O_TMPFILEā€)”…””}”(hjćh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mphjßubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“MlhjØubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“Mlhj–ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒŒDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org”h]”h¼)”}”(hŒŒDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org”h]”(hŒKDiscusión de Matthew Wilcox sobre las restricciones en argumentos 64-bit: ”…””}”(hj h²hh³Nh“NubjJ)”}”(hŒAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org”h]”hŒAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org”…””}”(hjh²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jIhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mrhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com”h]”h¼)”}”(hŒRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com”h]”(hŒTRecomendaciones de Greg Kroah-Hartman sobre flags desconocidos deben ser vigilados: ”…””}”(hj4h²hh³Nh“NubjJ)”}”(hŒ9https://lore.kernel.org/r/20140717193330.GB4703@kroah.com”h]”hŒ9https://lore.kernel.org/r/20140717193330.GB4703@kroah.com”…””}”(hj<h²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j>uh1jIhj4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“Mthj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubj÷)”}”(hŒź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.com”h]”h¼)”}”(hŒź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.com”h]”(hŒŽRecomendaciones de Linus Torvalds que las llamadas al sistema x32 deben favorecer compatibilidad con versiones 64-bit sobre versiones 32-bit: ”…””}”(hj[h²hh³Nh“NubjJ)”}”(hŒ\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com”h]”hŒ\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com”…””}”(hjch²hh³Nh“Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jeuh1jIhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hģh“MvhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjšubeh}”(h]”h ]”h"]”h$]”h&]”jĆjÄuh1jńh³hģh“MFhjģubah}”(h]”h ]”h"]”h$]”h&]”uh1jėh³hģh“MFhjŪh²hubeh}”(h]”Œreferencias-y-fuentes”ah ]”h"]”Œreferencias y fuentes”ah$]”h&]”uh1j…hj‡h²hh³hģh“MDubeh}”(h]”(Œ'agregando-una-nueva-llamada-del-sistema”j„eh ]”h"]”(Œ'agregando una nueva llamada del sistema”Œsp_addsyscalls”eh$]”h&]”uh1j…hhh²hh³hģh“K Œexpect_referenced_by_name”}”j˜jysŒexpect_referenced_by_id”}”j„jysubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hģuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jŠNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jĀŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hģŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”j„]”jyasŒnameids”}”(j˜j„j—j”jÄjĮjŌjŃjŚj×jØj„jS jP jÄ jĮ jÅjĀjrjojSjPjšjķj±j®j jjŲjÕjjŒuŒ nametypes”}”(j˜ˆj—‰jĉjŌ‰jډj؉jS ‰jÄ ‰jʼnjr‰jS‰jš‰j±‰j ‰jŲ‰j‰uh}”(j„j‡j”j‡jĮjĢjŃjĒj×j×j„jŻjP j«jĮ jV jĀjĒ jojČjPjujķjVj®jójj“jÕj jŒjŪuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”h¼)”}”(hhh]”hŒ4Hyperlink target "sp-addsyscalls" is not referenced.”…””}”hj,sbah}”(h]”h ]”h"]”h$]”h&]”uh1h»hj)ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hģŒline”Kuh1j'ubaŒ transformer”NŒ include_log”]”Œ