Você está na página 1de 13

UNIVERSIDADE FEDERAL DE ITAJUB - CAMPUS ITABIRA

Atilla Graciano
Igor Siguinolfi
Tamiris Fonseca
Tiago Paixao
Vincius Souza

Introduzindo uma chamada de Sistema no


Kernel do Linux

Itabira
09/04/16

Resumo
O Kernel do Linux nada mais do que seu ncleo, sua base, seu crebro, o qual pode
promover o desenvolvimento e a execuo de vrios softwares, alm disso gerencia processos,
o hardware e distribui os recursos para o sistema. Com base nesses dados, foi criado o
trabalho pratico, que constitui em criar uma nova chamada de sistema para o Kernel, que
dispara a mensagem Hello world.
Palavras chave: Chamada de sistema, Kernel, Linux.

Sumrio
1

INTRODUO

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

MTODOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CONCLUSO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

REFERNCIAS

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1 Introduo
Para que no ocorram problemas nos quais uma determinada aplicao interfira
em uma rea da memria que est designada para outra aplicao ou do prprio ncleo do
sistema. Mas tal proteo acaba gerando um novo tipo de problema, que se resume a como
permitir que uma aplicao chame rotinas as quais no tem privilgio de acesso? Este
problema foi facilmente resolvido com a utilizao de interrupes. Uma instruo especial
foi criada para permitir o acionamento de uma interrupo de forma a no depender de
eventos de qualquer origem. Assim que executada a instruo comuta o processador para
um nvel que possui o privilgio e a partir da o processo ocorre de forma semelhante ao
tratamento de interrupo. Atualmente existem instrues mais especficas que permitem
essa comutao entre estados privilegiados ou no, mas junto com elas so implementados
nos atuais processadores de forma juntamente com registradores especficos para tais
determinadas operaes. Este tipo de procedimento denominado como chamada de
sistema .As chamadas de sistema so utilizadas para toda e qualquer chamadas de sistema
para todas as operaes que necessitam de acesso a recursos de baixo nvel, ou abstraes
lgicas. A API de um determinado sistema definida diretamente pelo grupo de chamadas
oferecidas por um determinado ncleo. Para aplicaes em modo usurio as chamadas de
sistema so oferecidas atravs de uma system library que executa a preparao de todos
os parmetros, invocao e interrupo de software e retorno aplicao dos resultados
obtidos. essencial para o entendimento do funcionamento de sistemas operacionais o
estudo e anlise das chamadas de sistema, e esta oportunidade oferecida diretamente
por este projeto em si.

2 Mtodos
Primeiramente foi feita a instalao de dependncias com o seguinte comando no
terminal:
sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev
asciidocbinutils-dev linux-source qt3-dev-tools libqt3-mt-dev
libncurses5 libncurses5-dev fakeroot build-essential crash kexec-tools
makedumpfile kernel-wedge kernel-package
Logo aps foi feito o download do kernel do Linux pelo link:
http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.17.tar.bz2.
O arquivo foi extrado.
tar -xjvf linux-3.2.17.tar.bz2
cd linux-3.2.17/
J no diretrio do kernel foi criado um diretrio com o nome hello e os arquivos
hello.c e Makefile.
mkdir hello
gedit hello.c
gedit Makefile
O seguinte cdigo foi adicionado ao arquivo hello.c:
#include <linux/kernel.h>
asmlinkage longsys_hello(void)
{
printk("Hello world\n");
return0;
}
O arquivo foi adicionado no Makefile
obj-y := hello.o
Logo aps foi adicionada na tabela de chamadas, a chama de sistema. Para isso o
arquivo arch/x86/kernel/syscall_table_32.S foi aberto e foi adicionada a seguinte linha:
.longsys_hello

Captulo 2. Mtodos

Com o trmino da adio de chamada na tabela de chamadas, definiu-se as macros


associadas a nova chamada de sistema. Para isso, foi-se em arch/x86/kernel/syscall_table_32.S
e adicionou-se as seguintes linhas:
#define __NR_hello 349
#define NR_syscalls 350
e ir em include/linux/syscalls.h e adicionar a seguinte linha:
long sys_hello(void);
O prxmo passo foi modificar o Makefile da pasta Kernel para que o compilador
saiba que os novos arquivos da chamada de sistema esto no diretrio hello.
Aps modificar o Makefile, foi-se em linux-3.2.17/: e utilizou-se o comando
gedit Makefile
Depois, adicionar hello/ no final de:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
Os cdigos abaixo foram utilizados para instalar os mdulos no novo kernel:
makeoldconfig
makemenuconfig
make -j5
sudomakebzImage
sudomakemodules_install (instalao dos mdulos dinmicos do kernel)
-j5 compila o kernel paralelizando o processo para que possa ocorrer mais rpido.
Depois, foi feita a instalao do kernel com o seguinte comando:
sudomakeinstall
Aps a instalao do kernel necessrio ento que o testes sejam feitos para verificao de
resultados. Para esta tarefa inicialmente foi criado um arquivo teste1.c no desktop, no qual
poderia se utilizar um cdigo j obtido como exemplo nos materiais de estudo (Figura 1).
#include
#include
#include
#include

<stdio.h>
<linux/kernel.h>
<sys/syscall.h>
<unistd.h>

#define __NR_hello 312 following my tutorial

Captulo 2. Mtodos

Figura 1 Cdigo padro de chamada helloworld teste1.c

longhello_syscall(void)
{
returnsyscall(__NR_hello);
}
intmain(intargc, char*argv[])
{
longinta = hello_syscall();
printf("System call returned %ld\n", a);
return0;
}

Este cdigo tem como objetivo realizar a chamada de sistema e retornar um


nmero positivo caso no tenha ocorrido problemas. O retorno da chamada de sistema
pode ser visto na Figura 2 Para compilar e rodar o cdigo foram utilizados os comandos
abaixo.

Captulo 2. Mtodos

Figura 2 Retorno da chamada de sistema para teste1.c. Retorno positivo


gcc teste1.c
./a.out
Aps este procedimento, seria necessrio somente a utilizao do comando dmesg para
verificar a ltima chamada do log do kernel, onde se esperaria a chamada hello world. Mas
neste projeto o cdigo foi modificado, sendo sua verso final demonstrada a seguir (Figura
3).
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#define __NR_hello 312
volatilesig_atomic_t flag = 0;
voidsigint(int sig)
{
flag = 1;

Captulo 2. Mtodos

Figura 3 teste2.c, sleep 3 segundos + contagem helloworld + CTRL+C interrompe


}
longhello_syscall(void)
{
returnsyscall(__NR_hello);
}
int main(intargc, char *argv[])

Captulo 2. Mtodos

{
int count = 0;
longint a = hello_syscall();
signal(SIGINT, sigint);
while(1){
printf("System call returned %ld\n", a);
count = count + 1;
sleep(3);
if(flag == 1){
printf("Hello World times: %d",count);
printf("\n");
return 0;
}
}
}

Figura 4 Comando dmesg para ver log kernel, chamada helloworld fim do log
Onde o termo signal(SIGINT,sigint) a chamada do comando CTRL+C para
finalizar o cdigo (Figura 5). Desse modo, com a utilizao do cdigo modificado a chamada
helloworld ser apresentada no log do kernel a cada 3 segundos devido a funo while que
possui dentro de sua estrutura de loop o comando sleep(3).Caso o comando CTRL+C
seja utilizado o programa iria terminar o loop e retornar com a contagem de helloworlds
apresentados no log do kernel, sendo necessrio a utilizao do comando dmesg para
verificar diretamente no log as chamadas hellworld.Para se efetuar o teste da insero sem
falhas do comando respectivo a chamada de sistema teste, o comando abaixo foi necessrio:
cat /proc/kallsyms | grephello.

Captulo 2. Mtodos

10

Figura 5 Teste2.c 4: chamadas de helloworld contadas


No caso de uma adio com sucesso, a seguinte mensagem era esperada (Figura 6):
0000000000000000 T sys_hello

Figura 6 Teste: chamada de sistema sys_hello

11

3 Concluso
Atravs do uso do Kernel do Linux para fazer chamadas no sistema, foi possvel
entender melhor como o ncleo do sistema operacional funciona, como funcionam suas
chamadas, seu gerenciamento de processos e os sinais. Alm disso, o trabalho propiciou
melhor interao com o LINUX descobrindo-se e aplicando-se novas ferramentas.

12

Referncias
ARCHLinux.Missing bz Image after kernel compilation. Disponvel em:
<https://bbs.archlinux.org/viewtopic.php?id=79851>. Acesso em: 02 abr. 2016.
MITCHELL, Michael J.. Compile Linux Kernel on Ubuntu. Disponvel em:
<http://mitchtech.net/compile-linux-kernel-on-ubuntu-12-04-lts-detailed/>. Acesso em:
02 abr. 2016.
RAJ, Arvind S.. Adding hello world system call to Linux. Disponvel em:
<httphttps://arvindsraj.wordpress.com/2012/10/05/adding-hello-world-system-call-tolinux/>. Acesso em: 02 abr. 2016.
StackOverflow. Adding new System Call to Linux Kernel 3.13 on 64 bit
system. Disponvel em: <http://mitchtech.net/compile-linux-kernel-on-ubuntu-12-04-ltsdetailed/>. Acesso em: 02 abr. 2016.
Ubuntu Documentation. Kernel/Compile. Disponvel em:
<https://help.ubuntu.com/community/Kernel/Compile>. Acesso em: 02 abr.
2016.

Você também pode gostar