Sei sulla pagina 1di 11

Universidade Federal de São Paulo – UNIFESP

Disciplina: Sistemas Operacionais 2 - 2º Semestre de 2009 – Noturno

Professor Doutor Arlindo Conceição

Toni Pimentel

http://tonipimentel.blogspot.com/

EP - Crie uma System Call


Objetivo

Alterar o kernel e criar uma system call que recebe o PID de um processo e devolve o nível de
prioridade desse processo.

Fazer um programa que utiliza essa nova system call.

Documentar o processo e entreguar um arquivo em pdf incluindo os códigos fonte.

Introdução
Uma System Call (chamada de sistema) é usado pela aplicação (usuário) programas para
solicitação de serviços do sistema operacional. Um sistema operacional pode acessar o
hardware de um sistema diretamente, mas um programa do usuário não tem acesso direto ao
hardware. Isto é feito para que o kernel possa manter o sistema seguro de programas de
usuário mal-intencionado. Mas, muitas vezes, um programa do usuário requer algumas
informações do hardware (por exemplo, de uma câmera web para mostrar-lhe a imagem), mas
não pode obter as informações diretamente. Assim, solicita ao sistema operacional para
fornecer-lhe a informação. Esta solicitação é feita usando uma chamada de sistema adequada.

A chamada de sistema executa no modo kernel. Cada chamada de sistema tem um número
associado a ele. Este número é passado para o kernel e é assim que o kernel sabe qual a
System Call foi feita. Quando um programa de usuário emite uma chamada de sistema, na
realidade, é chamada uma rotina da biblioteca.
Criando uma System Call

O processo de criar uma system call é bem simples e será explicada passo a passo abaixo:

1) Baixar os arquivos fonte do kernel de www.kernel.org


2) Descompactar e criar um diretório, aqui chamado de “ get_toni”, na raiz do fonte
(~/Desktop/linux-2.6.31.6)
3) Criar dois arquivos “get_toni.c”, que possuirá o código da system call e
“Makefile”.
4) Editar a sua system call como abaixo

Código:
1) #include <linux/linkage.h>
2) #include <linux/security.h>
3)
4) asmlinkage long sys_get_toni (int i){
5)
6) int prioridade = 0;
7) struct task_struct *processo;
8)
9) processo = find_task_by_vpid(i);
10) prioridade = task_nice(processo);
11)
12) return prioridade;
13) }
5) O arquivo “Makefile” possui as instruções para compilação de “get_toni.c”.
6) Modificar o arquivo “syscall_table_32.S” que está localizado em “~/linux-
2.6.31.6/arch/x86/kernel”. Foi adicionado “.long sys_get_toni”.
7) Modificar o arquivo “unistd_32.h”. Foi adicionado “#define __NR_get_toni
337” na última linha das system calls (337 é o número da última system call +1).
8) Atualizar o arquivo “syscalls.h”. Foi adicionado “asmlinkage long
sys_get_toni(int i);” na linha 757
9) Adicionar a nova pasta ao Makefile principal do kernel (~/Desktop/Linux-
2.6.31.6). Linha 642.
Utilizar a nova system call
Para utilizar a sua nova system call é necessário criar um programa que a chame.

Exemplo:

Código:
14) //Arquivo callSysCall.c
15) //modelo como utilizar a system call criada
16)
17) #include <stdio.h>
18) #define __NR_get_toni 337
19)
20) int main(){
21)
22) int i = 0;
23) printf(“\nDigite o PID do processo: \n”);
24) scanf(“%d\n”, &i);
25) printf("O nível da prioridade deste processo eh:
%d\n", syscall(__NR_get_toni, i));
26) Return 0;
27)
28) }
Compilar o Kernel
1) Configurar o .config
a. $ make defconfig
b. $ make
c. $ make modules
d. $ sudo make modules_install
e. $ sudo make install
2) Instalar imagem do kernel compilado
a. $ cd /boot
b. $ sudo mkinitramfs -o initrd.img-2.6.31.6 2.6.31.6
3) Atualizar o Grub
a. $ sudo update-grub
4) Reiniciar a máquina

Resultados
Para testar a nova system call criada, foi utilizado o programa em C mencionado acima.
Infelizmente todos os níveis de prioridade dos processos em execução em minha máquina
eram 0.

Mas é entendido que o código está correto.

Referências
http://www.infowester.com/linprocessos.php
www.inf.ufrgs.br/~asc/livro/secao94.pdf
http://linux-digest.blogspot.com/2009/01/your-own-system-call-in-5-easy-steps.html
http://tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/#AEN19
http://pt.wikipedia.org/wiki/Kernel