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.