Como acessar a chamada do sistema do espaço do usuário?

Eu li alguns parágrafos em LKD1 e eu simplesmente não consigo entender o conteúdo abaixo:

Acessando a chamada do sistema do espaço do usuário

Geralmente, a biblioteca C fornece suporte para chamadas do sistema. Os aplicativos do usuário podem extrair protótipos de função dos cabeçalhos padrão e vincular-se à biblioteca C para usar sua chamada de sistema (ou a rotina de biblioteca que, por sua vez, usa sua chamada syscall). Se você acabou de escrever a chamada do sistema, é duvidoso que a glibc já a apóie!

Felizmente, o Linux fornece um conjunto de macros para agrupar o acesso às chamadas do sistema. Configura o conteúdo do registro e emite as instruções da armadilha. Essas macros são nomeadas_syscalln(), Onden está entre zero e seis. O número corresponde ao número de parâmetros passados ​​no syscall porque a macro precisa saber quantos parâmetros esperar e, conseqüentemente, inserir em registros. Por exemplo, considere a chamada do sistemaopen(), definido como

long open(const char *filename, int flags, int mode)

A macro syscall para usar esta chamada de sistema sem suporte explícito à biblioteca seria

#define __NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode)

Então, o aplicativo pode simplesmente chamaropen().

Para cada macro, existem 2 + 2 x n parâmetros. O primeiro parâmetro corresponde ao tipo de retorno do syscall. O segundo é o nome da chamada do sistema. Em seguida, segue o tipo e o nome de cada parâmetro na ordem da chamada do sistema. o__NR_open define está em<asm/unistd.h>; é o número da chamada do sistema. o_syscall3 macro expande em uma função C com assembly in-line; a montagem executa as etapas discutidas na seção anterior para enviar o número de chamada do sistema e os parâmetros para os registros corretos e emitir a interrupção de software para interceptar o kernel. Colocar essa macro em um aplicativo é tudo o que é necessário para usar oopen() chamada do sistema.

Vamos escrever a macro para usar nosso novo esplêndidofoo() chamada do sistema e, em seguida, escrever algum código de teste para mostrar nossos esforços.

#define __NR_foo 283
__syscall0(long, foo)

int main ()
{
        long stack_size;

        stack_size = foo ();
        printf ("The kernel stack size is %ld\n", stack_size);
        return 0;
}

O queo aplicativo pode simplesmente chamaropen() significar?

Além disso, para o último pedaço de código, onde está a declaração defoo()? E como posso tornar este pedaço de código compilável e executável? Quais são os arquivos de cabeçalho que eu preciso incluir?

__________
1 Desenvolvimento de Kernel Linuxde Robert Love.Arquivo PDF em wordpress.com (vá para a página 81);Resultado do Google Livros.

questionAnswers(3)

yourAnswerToTheQuestion