¿Cómo se invocan las llamadas al sistema de man 2?

Por llamadas al sistema, quiero decir funciones como man 2 brk , no la interrupción 0x80 .

Si entiendo este hilo correctamente, un progtwig C comstackdo nunca invoca llamadas al sistema DIRECTAMENTE . Solo puede invocar llamadas de biblioteca, que pueden vincularse dinámicamente desde glibc .

Sin embargo, man 3 brk returns No manual entry for brk in section 3 . Así que supongo que debe suceder una de las siguientes cosas para que el brk se ejecute correctamente:

  1. Mi comprensión anterior es incorrecta. Los progtwigs pueden invocar llamadas al sistema sin soporte glibc . Pero, entonces, ¿cómo se vincula brk al progtwig?
  2. De hecho, existe un contenedor glibc para la llamada al sistema brk . Entonces, ¿qué brk está incluido cuando #include <unistd.h> ? ¿El glibc one o el sistema llaman a uno? Si es el glibc , ¿por qué no está documentado en el man 3 ? ¿Dónde puedo encontrar una list completa de las llamadas a la biblioteca disponibles?

Para la mayoría de las llamadas al sistema con páginas man en la sección 2, las páginas man describen realmente las envolturas de la biblioteca C. Las excepciones suelen mencionarse explícitamente, como gettid que se refiere @Sergei Kurenkov en su respuesta:

NOTAS Glibc no proporciona un contenedor para esta llamada al sistema; llamarlo usando syscall (2).

De forma similar con pivot_root (que no es tan útil para aplicaciones generales), tgkill (que realiza la function de bajo nivel de pthread_kill ). Luego está readdir , donde la llamada al sistema real es algo diferente de la function de la biblioteca:

DESCRIPCIÓN Esta no es la function que le interesa. Mire readdir (3) para la interfaz de la biblioteca C conforme a POSIX. Esta página documenta la interfaz de llamada del sistema bare kernel, que es reemplazada por getdents (2).

Tenga en count que tiene que haber algún tipo de envoltorio. Las llamadas a funciones se realizan utilizando las convenciones de llamadas C, que es diferente de la convención de llamadas de la interfaz del kernel. Las llamadas a funciones habituales se realizan con la instrucción de ensamblaje de call (o similar), llamadas al kernel con syscall o int 0x80 (y eso sin contar cosas como gettimeofday o getpid en el vdso ). El comstackdor no necesita (necesita) saber qué function asigna el map a una llamada real al kernel.

Incluso con las llamadas al sistema "habitual", el contenedor de la biblioteca C actúa de forma ligeramente diferente a la llamada al sistema simple: las llamadas al sistema devuelven los códigos de error como valores negativos variables (si observa el código del kernel de Linux, verá una gran cantidad de devuelve como return -EPERM; ). El contenedor de la biblioteca C convierte a todos esos valores de retorno en -1 y mueve el código de error real a errno .

un progtwig C comstackdo nunca invoca llamadas al sistema DIRECTAMENTE.

no es cierto. Tome un gettid como ejemplo: http://man7.org/linux/man-pages/man2/gettid.2.html . No tiene un contenedor, por lo que necesita en su progtwig escribir algo parecido (desde el hombre: Glibc does not provide a wrapper for this system call; call it using syscall(2). ):

 #ifndef WIN32 #include <linux/unistd.h> #include <sys/syscall.h> #include <unistd.h> int thread_gettid(void) { return static_cast<int>(syscall(SYS_gettid)); } #else int thread_gettid(void) { return GetCurrentThreadId(); } #endif 

Mi comprensión anterior es incorrecta. Los progtwigs pueden invocar llamadas al sistema sin soporte glibc.

De hecho, puede. Utiliza syscall : http://man7.org/linux/man-pages/man2/syscall.2.html .

Pero, entonces, ¿cómo se vincula brk al progtwig?

Parece que brk tiene un envoltorio en glibc, ya que hay una línea en el hombre:

 The return value described above for brk() is the behavior provided by the glibc wrapper function for the Linux brk() system call. 

Si es el glibc, ¿por qué no está documentado en hombre 3?

Creo que es porque hay malloc para las asignaciones de memory que deben usarse:

Evite utilizar brk () y sbrk (): el package de asignación de memory malloc (3) es la forma portátil y cómoda de asignar memory.