System Call

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.

Transcript of System Call

Page 1: System Call

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.

Page 2: System Call

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”.

Page 3: System Call

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) }

Page 4: System Call

5) O arquivo “Makefile” possui as instruções para compilação de “get_toni.c”.

Page 5: System Call

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”.

Page 6: System Call

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).

Page 7: System Call

8) Atualizar o arquivo “syscalls.h”. Foi adicionado “asmlinkage long

sys_get_toni(int i);” na linha 757

Page 8: System Call

9) Adicionar a nova pasta ao Makefile principal do kernel (~/Desktop/Linux-

2.6.31.6). Linha 642.

Page 9: System Call

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) }

Page 10: System Call

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.

Page 11: System Call

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