Você está na página 1de 123

Kernel do Linux

Autores
Eduardo Miranda Peloso da Silva
Franklin Rodriguez Tellez
Henrique Carvalho de Almeida Soares
Jos Luiz Machado Morais
William Wallace de Siqueira Ribeiro
Wilson Francisco Moreira de Souza Seron

Roteiro

O Kernel
Tipos de ncleo
Kernel do Linux
Sistemas de arquivo
Processos no kernel
Gerenciamento de Processos
o Prioridades
o Scheduler
Preemptividade
Gerenciamento de memria
Multiprocessamento
GRUB
Compilao e instalao do Kernel
Criao de uma System Call
Mdulos
Device drivers
Tempo Real
Consideraes Finais
Referncias

Definio de Kernel
O kernel o componente central, isto , o ncleo
da maioria dos sistemas operacionais
a ligao entre as aplicaes e o
processamento efetivo dos dados no nvel de
hardware
O desenvolvimento de um kernel considerado
uma das atividades mais complexas na rea de
programao
4

Definio de Kernel

Viso da arquitetura de um computador como camada de


abstrao: hardware, firmware, assembler, kernel, sistema
operacional e aplicaes

Responsabilidades do Kernel
Gerenciar recursos de sistema
o Escalonamento de processos
o Gerenciamento de memria (paginao,
memria virtual)
o Gerenciamento de dispositivos (principalmente
drivers de perifricos, e E/S)
o Encapsular todo o acesso ao hardware

Como isto feito?


Para o trabalho ser feito, necessrio que um
processo acesse os servios oferecidos pelo
kernel
Isto feito usando System Calls. Cada kernel
apresenta uma abordagem diferente para lidar
com o oferecimento de servios

Tipos de Kernel
Existem vrios tipos de kernel:
o
o
o
o
o

Monoltico
Microkernel
Hbridos
Nanokernels
Entre outros

Entretanto, os mais usados so os monolticos e


microkernel

Kernel Monoltico

Diagrama de um kernel monoltico


9

Kernel Monoltico
Projetados para ter todo o seu cdigo no mesmo
espao de endereos
Define uma interface de alto nvel sobre o
hardware
Grupo de System Calls primitivas que
implementam todos os servios do sistema
operacional

10

Kernel Monoltico
Todos os servios do sistema rodam junto
thread principal do kernel
Isto prov um acesso rico e poderoso ao
hardware

11

Kernel Monoltico
Entretanto, h uma forte dependncia entre
componentes do sistema
o Um bug num driver de dispositivo, por exemplo, pode derrubar o
sistema inteiro

Exemplos de kernels monolticos:


o Unix e Unix-like kernels (Linux, BSD, Solaris)
o Mac OS at o 8.6
o DOS e Windows at a srie 9x (95, 98, Me)

12

Microkernel

Diagrama de um microkernel
13

Microkernel
Consiste em definir uma abstrao simples do
hardware
Foco em desenvolvimento minimalista, resultando
em kernels menores
Devido a isto, normalmente implementam
somente as funes mais bsicas, separando-as
em mdulos
Alguns outros servios, como networking, so
implementados em espao de usurio

14

Microkernel
Permite, portanto, que o restante do kernel seja
implementado como uma aplicao comum, em
linguagem de alto nvel
Mais fceis de manter que os monolticos
O alto nmero de System Calls e de trocas de
contexto fazem com que o sistema seja mais
lento, pois geram grande overhead

15

Kernel Hbrido
uma combinao entre o monoltico e o
microkernel
Roda servios como o networking e o sistema de
arquivos no espao de kernel
Apenas mdulos menores, como drivers de
dispositivos, so rodados como servers

16

O Kernel do Linux
Em 03/Dez/2009, verso 2.6.32:
o
o
o
o

14.000 arquivos escritos em linguagem C e assembly


12,606,910 linhas de cdigo
1000 diretrios e subdiretrios
230 Megabytes

Site: www.kernel.org

17

O Kernel do Linux
Unix-like
Monoltico modularizado (possui suporte a
mdulos)
Threading (clone() system call)
Preemptivo
o O kernel define o tempo de processamento de cada processo e
pode alterar essa estratgia a fim de maximizar o desempenho
do sistema

18

O Kernel do Linux
No permite acesso direto ao hardware
Dois modos de execuo
o User e Kernel Mode

Sistema multiusurio
Suporte a multiprocessamento

19

Vantagens do Kernel do Linux

Gratuito
Customizvel
Roda em mquinas antigas
Estvel
Eficiente, mesmo em mquinas robustas
Alta compatibilidade:
o Alpha, arm, i386, mips etc
o HTC, iPhone etc

20

Mapa do Kernel

21

Sistema de Arquivos

Conjunto de estruturas lgicas e rotinas que permitem


ao sistema operacional controlar o acesso ao disco
rgido

Em UNIX, os sistemas de arquivos mais utilizados so:


o Ext2
o Ext3
o ReiserFS
o XFS
o JFS

22

Journaling

Journaling uma caracterstica do sistema de arquivos


que permite ao SO manter um log de todas as
mudanas no sistema antes de escrever os dados no
disco, tornando-o assim mais seguro

23

JFS e XFS

JFS
o Sistema rpido com suporte a journaling e
redimensionamento de parties
o

Perdeu muita credibilidade devido a inmeros bugs

XFS
o Sistema rpido na gravao, otimizado para escalabilidade
e que faz uso de journaling
o

Sistema de alto custo em termos de recursos e de


gerenciamento complexo

24

Ext2 - Prs

Sistema de arquivos rpido (no tem suporte para


journaling)

Pr-alocao de blocos, com o intuito de diminuir a


fragmentao externa

O uso de grupos de blocos diminui o nmero de buscas


em disco quando realizada a leitura de uma grande
quantidade de dados subsequentes

25

Ext2 - Contras

No tem suporte para journaling, sendo assim pouco


confivel

Pode causar fragmentao devido ao uso de blocos

Apesar de possuir tticas para contornar o problema de


fragmentao, as mesmas podem causar perda de
desempenho no sistema, devido ao grande nmero de
blocos para gerenciar

26

Ext3 - Prs

Utilizao da rvore de diretrios para recuperao de


arquivos

Permite atualizao direta do Ext2, sem a necessidade


de realizar backup

Baixo consumo de processamento

Faz uso de journaling

27

Ext3 - Contras

No possui alocao dinmica

No possui sistema de blocos de tamanhos variveis

No permite a checagem do sistema enquanto ocorre


uma montagem para a escrita de um arquivo

Dificuldade para a realizao de desfragmentao

No possui um suporte compresso transparente

28

ReiserFS - Prs

Primeiro sistema de arquivos com suporte para


journaling

Utiliza rvores balanceadas para otimizar as buscas de


arquivos

Utiliza blocos de tamanhos variveis para alocao

Sistema capaz de recuperar a consistncia


rapidamente aps uma eventual finalizao incorreta

Suporte para arquivos maiores que 2GB

29

ReiserFS - Contras

Consumo de CPU elevado

No funciona muito bem com softwares de RAID

Exige algoritmos complexos devido ao modelo de


organizao em rvores balanceadas

No possui bom desempenho em sistemas multicore

30

Quadro Comparativo
Prs

Contras

ReiserFS

- Journaling
- Utiliza rvores balanceadas
- Blocos de tamanhos
variveis
- Recuperao da consistncia
- Suporte para arquivos
maiores que 2GB

- Consumo de CPU elevado


- No funciona muito bem com
softwares de RAID
- Exige algoritmos complexos
- No possui bom desempenho
em sistemas multicore

Ext2

- Rapidez
- Pr alocao de blocos

- No possui journaling
- Fragmentao de disco

Ext3

- Permite atualizao direta


do Ext2
- Baixo consumo de
processamento
- Faz uso de journaling

- No possui alocao dinmica


- No possui sistema de blocos
de tamanhos variveis
- Desfragmentao difcil
- No possui um suporte
compresso transparente

JFS

- Journaling
- Parties redimensionveis

- Perdeu muita credibilidade


devido a inmeros bugs

XFS

- Journaling
- Escalabilidade

- Sistema de alto custo e de


gerenciamento complexo

31

Sistemas de Arquivos - Exerccios

Considerando o quesito confiabilidade, qual sistema de


arquivos o mais apropriado?

Considerando o quesito velocidade, qual sistema de


arquivos o mais indicado?

32

Processos no Kernel

Cada programa executado definido como um processo

Cada um desses processos recebe um nmero de identificao


chamado PID (Process ID)

Alm do PID, cada processo tem um conjunto de informaes


como: nome, uso da memria, usurio e grupo que o executou,
estado, entre outros

33

Estados de um Processo

TASK_RUNNING
Em execuo

TASK_INTERRUPTIBLE
Suspenso at que uma condio se torne verdadeira

TASK_UNINTERRUPTIBLE
Como o estado anterior, exceto pelo fato de que o seu estado
no ser modificado quando receber um sinal. importante para
os processos que necessitam executar determinada tarefa sem
serem interrompidos

34

Estados de um Processo

TASK_STOPPED
Execuo do processo foi parada

TASK_ZOMBIE
O processo est terminado, mas o processo pai ainda no
executou uma chamada de sistema para retornar informaes
sobre o processo morto - "wait'', as informaes no so
descartadas pois ainda podem ser utilizadas

35

Gerenciamento de Processos

Qualquer sistema operacional tem muitos processos rodando


"simultaneamente"

So necessrios meios para manipular e controlar a execuo dos


diversos processos

Os meios de realizar esse gerenciamento so:


o System Calls
o Scheduling e Prioridades

36

Gerenciamento de Processos

System Calls especficas para manipulao de processos no kernel


Linux:
o fork()
o vfork()
o exit()
o clone()
o exec()

Existem tambm alguns comandos para monitorar os processos em


execuo:
o top
o ps

37

Gerenciamento de Processos

A System Call fork():


o cria um novo processo a partir do orginal e idntico a
ele
processo original: pai
processo(s) gerados por chamada(s) ao fork:
filho(s)
o ao ser chamada, no processo pai, retorna o PID do
processo filho
o ao ser chamada no filho, retorna 0

Pode ser utilizada no contexto de programas com


tolerncia a falhas
38

Gerenciamento de Processos

A System Call vfork():


o tem a mesma funcionalidade da fork()
difere por bloquear o processo pai enquanto no h
uma chamada de _exit() ou da famlia exec()
o criada como uma verso com overhead menor do que a
fork(), onde pai e o(s) filho(s) compartilhavam tabela de
pginas
a fork() fazia a cpia na criao do processo filho,
atualmente feito o Copy-on-Write (somente quando
filho modifica algum valor)
o segundo a man page, seu uso desencorajado, exceto
em situaes especficas
39

Gerenciamento de Processos

A System Call clone():


o funciona similarmente a fork(), criando um novo
processo filho
o

este novo processo na verdade uma thread do


programa original

recebe ao menos dois parmetros, fn e arg


fn a funo a ser executada na thread
arg so os parmetros a serem passados para a
funo
40

Gerenciamento de Processos

A System Call exec():


o cria e executa um novo processo
o

recebe ao menos um parmetro, o caminho do arquivo


a ser executado

pode tambm receber uma lista de argumentos a serem


passados como parmetros na execuo do arquivo

normalmente no retorna nenhum valor


caso tenha ocorrido algum erro, retorna -1
41

Gerenciamento de Processos

A System Call exit():


o encerra o processo, com o cdigo de status informado
como parmetro
o

aps a sada, o cdigo de status passado para o


processo pai

a chamada a exit() realiza uma srie de etapas, antes de


chamar de fato a _exit(), que simplesmente termina o
processo

42

Gerenciamento de Processos

Em qualquer sistema, processos tem prioridades


diferentes para execuo
o quanto maior a prioridade, maior o tempo de
processamento que vai ser dedicado a ele

No kernel Linux existe uma escala de nmeros cada um


correspondendo a um maior ou menor nvel de prioridade
o valores vo de -20 a 20, sendo que quanto menor o
valor, maior a prioridade
o processos do usurio tem prioridades de 0 a 20
o apenas processos do kernel podem ter o valor de
prioridade negativo
43

Gerenciamento de Processos

Processos podem ter suas prioridades definidas no


momento da criao e tambm modificadas durante a
execuo

Existem dois comandos para isso:


o nice -n ## comando
executa comando com prioridade ##
o

renice ## -p PID
modifica a prioridade do processo que tem id PID
para o valor ##
44

Gerenciamento de Processos

Comandos nice e renice devem ser utilizados com


cuidado
o colocar processos demais em prioridade alta (nice
menor que 0) pode tornar o sistema lento
0 o valor utilizado por padro
o apenas o root pode colocar processo em nice menor
que 0
evita que processos de usurios, principalmente em
modo multi-usurio, interfiram na execuo de
processos do sistema
processos usualmente com nice menor que 0 (-5 ou
mais) incluem comunicao com hardware (E/S...)
45

Gerenciamento de Processos
Controle de execuo de acordo com a prioridade tarefa
do kernel, especificamente do Scheduler (Escalonador)
No Linux, esse Escalonador preemptivo, ou seja, destina
pequenas fatias de tempo para cada processo, trocandoos de acordo com as prioridades definidas pelo usurio
'dono'
O algoritmo atual de escalonamento passou a ser utilizado
apenas a partir da verso 2.6
o executada em tempo O(1), antiga implementao tinha
tempo O(n) em relao ao nmero de processos
o cada processador ou core tem uma fila independente de
processos

46

Gerenciamento de Processos

Como funciona a poltica de escalonamento:


o tempo de processamento dividido em fatias de
tamanho fixo (quantum)
o cada nvel de prioridade tem uma fila de processos que
pertencem a ela
processos tem suas prioridades modificadas
dinamicamente
o a cada processo que selecionado associado
um quantum de tempo para execuo
quando o seu quantum acaba, ele enviado para o
fim da fila de sua atual prioridade
47

Gerenciamento de Processos

Como funciona a poltica de escalonamento (cont.):


o quando um processo colocado no estado
TASK_RUNNING, o Kernel verifica as prioridades dinmicas
do mesmo e do processo sendo executado
caso a prioridade do novo processo seja maior, feita a
troca
o processo que saiu mantm-se no estado
TASK_RUNNING
o processos que interagem com o usurio tem prioridades
maiores
ficam sem processamento enquanto aguardam ao do
usurio, so escalonados rapidamente de volta quando
ela ocorre
o um processo batch tem baixa prioridade
48
executa usualmente enquanto um interativo aguarda

Gerenciamento de Processos

Observaes:
o apenas processos de usurio, no do kernel, so
preemptivos
complexidade de implementao, evita problemas de
sincronizao no uso de estruturas de dados do
Kernel
o Kernel no diferencia de fato processo interativos
e batch, mas sim os que utilizam mais E/S ou mais CPU
algoritmos de escalonamento favorecem
implicitamente os de E/S - melhor tempo de resposta
de processos interativos
apenas processos de tempo-real so reconhecidos
como tal, tendo prioridade fixa na escala de 1 a 99 e
no tem execuo interrompida por escalonamento

49

Gerenciamento de Processos

Observaes (cont.):
o o tamanho do quantum um fator crtico para o
desempenho do sistema
se o quantum muito pequeno, o overhead de troca de
processos pode tomar grande parte do tempo de
processamento
do contrrio a responsividade comprometida
o a funo que implementa de fato o escalonador a
schedule(), que pode ser invocada de dois modos
direto: quando recurso que o processo precisa est
indisponvel, ele deve ser bloqueado
lazy: o valor do campo need_resched do processo foi
alterado para 1, em algum momento o kernel verifica
50
esse campo e escalona o processo

Gerenciamento de memria
O Linux realiza o gerenciamento de memria a partir da
utilizao de memria virtual. Funciona como uma camada
de abstrao onde os endereos reais em hardware no
correspondem diretamente aos endereos vistos pelas
aplicaes de usurio
A utilizao de memria virtual permite:
o Relocao: cada aplicao tem seu prprio espao de
endereamento
o Proteo e Compartilhamento: impede que um processo
utilize um endereo de memria que no lhe pertence
o Transparncia: no necessrio que uma aplicao
tenha informaes sobre o tamanho da memria, j que
ela no precisa limitar-se memria fsica disponvel 51

Gerenciamento de memria
Segmentao
A memria dividida em partes de tamanho varivel e com
diferentes tipos de permisso. O endereo correspondente a
cada parte calculado a partir de uma base e um limite
No Linux, a utilizao ocorre de forma limitada, permitindo
maior simplificao e portabilidade
So utilizados 6 segmentos, os quais definem proteo em
nvel de hardware para as determinadas reas:
cdigo do kernel
dados do kernel
cdigo de usurio
dados de usurio
52
TSS (segmento de estado da tarefa)
LDT (descritores locais)

Gerenciamento de memria
Paginao
A memria fsica dividida em blocos de tamanho fixo,
(frames). Divide-se a memria lgica em blocos do mesmo
tamanho, chamados pginas (pages). Os frames livres so
registrados. Existe uma tabela de pginas onde feita a
converso dos endereos lgicos em endereos fsicos
As pginas pouco utilizadas so movidas para o disco,
permitindo a utilizao de mais memria do que a disponvel
fisicamente
As pginas so divididas em tabelas hierrquicas, onde
podem ser acessadas a partir do page number (ndice na
tabela que corresponde ao endereo base na memria
fsica) e do offset

53

Gerenciamento de memria
O Linux utiliza quatro nveis de tabelas hierrquicas: Page
Global Directory, Page Upper Directory, Page Middle
Directory e Page Table Entry
Dependendo da arquitetura, alguns dos nveis intermedirios
so eliminados para obter maior eficincia
Cada processo possui suas prprias tabelas de pginas, as
quais contm apenas os endereos que o processo pode
utilizar
54

Gerenciamento de memria
O Linux utiliza tamanhos de pginas de acordo com a
arquitetura. Os processadores x86 utilizam pginas de 4
KiB (padro), 2 MiB (caso seja utilizado o recurso de PAE
Page Address Extension da Intel) ou de 4 MiB. Nas
arquiteturas RISC o tamanho padro de 8 KiB, mas no
o nico
O uso de 32 bits permite o endereamento de at 4GB,
sendo que o kernel divide esse espao virtual em espao
de usurio e espao de kernel (usualmente 3GB e 1GB,
respectivamente)
55

Multiprocessamento

Capacidade de um sistema operacional executar simultaneamente


dois ou mais processos

Pressupe a existncia de dois ou mais ncleos de processamento

A principal razo executar multiprocessos de modo simultneo

56

Multiprocessamento
Tipos de Sistemas Operacionais:

Sistemas Simtricos (SMP Symmetric MultiProcessing): cada


processador executa uma cpia idntica do sistema operacional, que
comunicam-se entre si quando necessrio e tm tempo uniforme de
acesso memria

Sistemas Assimtricos: cada processador recebe uma tarefa


especfica. Um processador mestre controla o sistema e os outros,
escravos, recebem instrues dele. A distino pode ser
implementada em hardware ou software

57

Multiprocessamento

Objetivos no Linux:
o

Ser eficiente em mquinas SMP

Distribuir de maneira justa o tempo da CPU

Possuir suporte para tempo real

Apresentar boa performance em programas interativos,


mesmo com carga elevada

58

Multiprocessamento

Problema nas verses anteriores a 2.6


o

O escalonador usava uma ready list global em mquinas


SMP

A necessidade de acesso mutuamente exclusivo ready list


por parte dos processadores

Se um processador est acessando a ready list, os


demais necessitam esperar at que a mesma seja
liberada
Para um nmero elevado de processadores este bloqueio
dos processadores pode ocasionar uma queda
59
considervel no desempenho do sistema

Multiprocessamento
o

Considere um processo bloqueado esperando uma


operao de E/S; quando termina a E/S, o processo
recolocado na ready list global

pode ser executado por um processador diferente


daquele no qual estava rodando previamente.
Acontecendo isto, dados do processo porventura
existentes em caches no ficaro
inutilizados, influenciando negativamente a performance

60

Grub
GRand Unified Bootloader
um multi-carregador de Sistemas
Operacionais (multi boot boot-loader)
o Boot Loader: o primeiro software executado quando um
computador iniciado

Compatvel com diversos sistemas de


arquivos e formatos de kernel

61

Processo de Boot
1.BIOS (Basic Input/Output System)
o Executa uma srie de testes para localizar os dispositivos
presentes e verificar seu correto funcionamento
o Inicializa os dispositivos de hardware
o Busca um sistema operacional para dar o boot
Em geral no primeiro setor do HD ou drive de CD/DVD
o Copia o contedo do primeiro setor para a RAM e executa o
cdigo carregado

62

Processo de Boot
2. Boot Loader Grub
Estgio 1: Cerca de 512 bytes, presente no
Master Boot Record (MBR)
o Apenas carrega o estgio 1.5 ou 2

Estgio 1.5: Primeiros 30kB aps MBR


o Carrega o estgio 2

Estgio 2: Mostra a lista de sistemas


operacionais
o Carrega o kernel do S.O.

63

Grub
Instalao
oEm geral instalado automaticamente
oCaso no esteja presente:
sudo apt-get install grub

Configurao Padro
o update-grub
o Cria o arquivo menu.lst (em alguns sistemas menu.grub ou
menu.conf)

64

Grub
Exemplo de arquivo menu.lst:
default 1
timeout 10
title Microsoft Windows XP Professional
root (hd0,1)
savedefault
makeactive
chainloader +1
title Ubuntu, kernel 2.6.17-10-generic
root (hd0,4)
kernel /boot/vmlinuz-2.6.17-10-generic root=/dev/sda5 ro quiet splash
initrd /boot/initrd.img-2.6.17-10-generic
quiet
savedefault
boot

65

Grub - Opes
default n: Sistema padro (0 o primeiro)
timeout t: tempo dado ao usurio para
escolher o sistema operacional. Aps
esse tempo, o sistema default escolhido
title: nome mostrado no menu
root: local aonde o sistema est instalado
kernel e initrd: indica o kernel e possveis
parmetros
66

Grub Exerccio Proposto


Analisar o arquivo menu.lst, e modificar o
tempo de timeout e o sistema operacional
padro

67

Compilar o Kernel do Linux

Mas por que compilar o Kernel?


o A atualizao apresenta novos mdulos, o que garante suporte a
novos dispositivos
o

Tempo de inicializao mais rpido: possvel deixar somente


mdulos que seu hardware utiliza

Suporte a hardware adicional: permite a adio de suporte a


dispositivos, tais como placas de som, que no esto presentes
no kernel GENERIC

68

Passos para compilar o Kernel


1 - Baixar os fontes do kernel em www.kernel.org
2 - Definir uma configurao padro
Descompatar o arquivo na pasta exemplo:
$cd linux2.6.30
(Neste exemplo foi utilizada a verso 2.6.30 do kernel. Esta
numerao no fixa e ser diferente de acordo com a verso a
ser utilizada)
$make defconfig (criar um config padro)
Para escolher os itens que deseja habilitar/desabiltar, necessrio
usar menuconfig no lugar de defconfig
69

Passos para compilar o Kernel


3 - Compilar efetivamente o kernel
$make
Comando para a compilao do kernel. O tempo de execuo
vai depender do hardware utilizado
$make modules
Comando para a compilao dos mdulos
$sudo make modules_install
Comando para instalao dos mdulos
$sudo make install
Comando para a instalao do kernel compilado
70

Passos para compilar o Kernel


4 - Instalar a imagem do kernel compilado
Entrar no diretrio /boot
$cd /boot
Gerar a imagem
$sudo mkinitramfs -o initrd.img-2.6.30.6 2.6.30.6
( preciso mudar o 2.6.30.6 para a verso personalizada do kernel)
5 - Aps a imagem criada preciso atualizar o grub (gerenciador de
boot)
$sudo update-grub
6 - Reiniciar o computador, escolhendo no grub a verso do kernel
desejada
71

Testando o Kernel compilado


1 - preciso procurar a verso compilada no GRUB. Se ela no
estiver l, aconteceu algo errado na instalao
2 - Escolher o kernel desejado no GRUB, teclando Enter
3 - Para verificar a verso, basta abrir o terminal e digitar:

$ uname -r

72

Compilando o Kernel - Exerccios


1 - Faa o download da verso mais nova do kernel e altere o nome
da verso da distribuio para: verso-seu-nome. Aps compilar,
confira o resultado com o comando uname
2 - Quais os arquivos gerados pela compilao do kernel?
3 - Cite uma vantagem de manter seu kernel atualizado

73

Criao de uma System Call


O que so System Calls?
So funes bem definidas que o sistema operacional prov
para que aplicaes em nvel de usurio solicitem servios
do Kernel
Lista de arquivos a serem criados/modificados
Assumindo que o cdigo fonte do Kernel se encontra no
diretrio /home/user/linux
Arquivos do Kernel que sero modificados:
1. /home/user/linux/arch/x86/kernel/syscall_table.S
2. /home/user/linux/arch/x86/include/asm/unistd_32.h
3. /home/user/linux/include/linux/syscalls.h
4. /home/user/linux/Makefile

74

Criao de uma System Call


Novos arquivos/diretrios do Kernel que sero criados
(considerando que o nome da nova System Call mycall):
1. /home/user/linux/mycall Diretrio que conter a nova
System Call, que deve ser criado manualmente
2. /home/user/linux/mycall/mycall.c Cdigo fonte da
System Call criada
3. /home/user/linux/mycall/Makefile
Novo arquivo em espao de usurio criado para testar a
System Call:
1. testmycall.c Cdigo que chama a nova System Call

75

Criao de uma System Call


syscall_table.S
um arquivo assembly que contm os nomes das System
Calls
1. Adicionar uma linha no final do arquivo, no exemplo trata-se
da linha 337
2. Adicionar .long sys_mycall no final da lista de System Calls

76

Exemplo de modificao do arquivo syscall_table.S

Criao de uma System Call


unistd_32.h
Este arquivo contm o nmero da System Call que
passado ao Kernel atravs do registrador (EAX) quando a
System Call chamada
1. Adicionar #define __NR_mycall
<Nmero_ltima_System_Call + 1> ao final da lista

77

Exemplo de modificao do arquivo unistd_32.h

Criao de uma System Call


syscalls.h
Este arquivo contm as declaraes das System Calls
1. Adicionar a seguinte linha no final do arquivo:
asmlinkage long sys_mycall(int i);

Exemplo de modificao do arquivo syscalls.h

78

Criao de uma System Call


Makefile
1. Adicionar mycall/ ao core-y. Estar incluindo no Makefile
geral o diretrio onde se encontram o cdigo fonte da nova
System Call e o Makefile especfico

Exemplo de modificao do arquivo Makefile


79

Criao de uma System Call


mycall.c
1. Criar o arquivo fonte mycall.c no diretrio mycall.
mycall.c conter o cdigo da nova System Call. A definio
da System Call no cdigo fonte ser asmlinkage long
sys_mycall(...){...} e deve incluir o arquivo linux/linkage.h.
Asmlinkage usado para procurar os argumentos na pilha do
kernel

80

Exemplo de cdigo fonte da nova System Call criada

Criao de uma System Call


Makefile
1. O Makefile no diretrio mycall conter uma linha:
#####Makefile Start#####
obj-y := mycall.o
#####Makefile End#######

Compilao e instalao do Kernel


Aps esse ponto, necessrio compilar e instalar a nova
verso modificada do Kernel
81

Criao de uma System Call


testmycall.c
1. testmycall.c um arquivo que ser utilizado como teste
da nova System Call criada. necessria a incluso da linha
#define __NR_mycall XX, onde XX o nmero atribudo
nova System Call. Em caso de erro, a chamada da System
Call retorna o valor -1

82

Exemplo de arquivo de teste da System Call criada

Criao de uma System Call


Exerccios propostos
1. Crie uma System Call que recebe o PID de um processo
e retorna a prioridade do mesmo
2. Crie uma System Call que recebe dois PIDs de
processos diferentes e retorna qual dos dois processos
possui a maior prioridade
3. Crie uma System Call que recebe dois PIDs de
processos diferentes e troca a prioridade dos mesmos. Ou
seja, se o processo 1 tinha prioridade 10 e o processo 2
prioridade 15, ao final teremos 1 com prioridade 15 e 2
83
com prioridade 10

Mdulos
Linux permite adicionar ou remover
funcionalidades enquanto o sistema est
rodando
Cada trecho de cdigo que pode ser
adicionado ou removido chamado mdulo
Os mdulos podem ser ligados dinamicamente
ao kernel via comando insmod
Podem ser desligados via comando rmmod

84

Mdulo Hello World

85

Mdulos: Makefile

Para Compilar:
omake
Para instalar:
osudo insmod hello.ko
Para desinstalar:
osudo rmmod hello.ko
86

Mdulo Hello World


Mensagens geradas pela funo printk
ficam armazenadas geralmente em
/var/log/messages.
o Outros logs do Kernel: /var/log/kern.log e /var/log/syslog

printk(): verso simplificada do printf


o No imprime floats/doubles:
Troca de contexto padro no salva o estado da FPU
possvel salvar o contexto da FPU com os comandos
kernel_fpu_begin() e kernel_fpu_end() porm essas funes
chamam preempt_disable() e preempt_enable(), o que
paralisa a preemptividade do kernel.
87

Passagem de Parmetros
Parmetros podem ser passados para os
mdulos no momento do carregamento:
Trecho adicionado ao mdulo:

88

Ex.: insmod modulo.ko num=2 str=abc

Mdulos - Funes teis


Carga e descarga de mdulos:
o insmod
o modprobe
o rmmod

Inicializao (init) e trmino (exit):


o #include <linux/init.h>
o module_init(init_function);
o module_exit(cleanup_function)

89

Mdulos - Funes teis


Informaes do processo atual:
o #include <linux/sched.h>
o struct task_struct *current;
current->pid : process id
current->comm: command name

Header necessrio:
o #include <linux/module.h>

90

Mdulos - Funes teis


Passagem de parmetros:
o #include <linux/moduleparam.h>
o module_param(varivel, tipo, permisses);
Permisses:
S_IRUGO: pode ser lido mas no modificado
S_IWUSR: pode ser alterado pelo root

Log:
o #include <linux/kernel.h>
o int printk(const char *fmt, );
Mesmos parmetros do printf, exceto ponto
flutuante
91

Mdulos Exerccio Proposto


Modificar o mdulo Hello World de
maneira que esse aceite um parmetro N
do tipo int e um parmetro S do tipo
String. Fazer com que o mdulo ao ser
carregado mostre os parmetros
recebidos, e na descarga repita N vezes a
String S
92

Device Drivers
Permitem a interao do Kernel com
dispositivos de entrada e sada
Consistem de estruturas de dados de
funes que controlam um ou mais
dispositivos
o Discos rgidos, teclados, mouses, monitores,
interfaces de rede
93

Device Drivers
Cada driver interage com o kernel e com
outros drivers atravs de uma interface
especfica:
o Cdigo especfico a um dispositivo pode ser encapsulado em
um mdulo especfico
o Novos dispositivos no precisam conhecer o cdigo fonte do
kernel, apenas as interfaces
o O kernel acessa todos os dispositivos atravs da mesma
interface
o possvel escrever um driver como um mdulo
dinamicamente carregvel
94

Device Drivers
Conjunto de rotinas que fazem um
dispositivo de hardware responder
interface de programao definida pelas
operaes cannicas:
o open, read, lseek, ioctl etc.

Em geral so divididos em 3 classes:


o Caractere
o Bloco
o Interfaces de rede

95

Device Drivers
Dispositivos podem ser conectados a
portas de Entrada/Sada ou terem suas
portas mapeadas em memria
Portas de E/S:
o Kernel disponibiliza funes para acesso
inb(), inw(), inl()
outb(), outw(), outl()
o Funes request_resource(), allocate_resource()
e release_resource()
Garantem acesso s portas do dispositivo
96

Device Drivers
E/S mapeado em memria
o Dispositivos so mapeados em endereos fsicos
de 32 bits
o necessrio traduzir o endereo fsico para um
endereo linear
Funes: ioremap() e ioremap_nocache()
o Acesso: readb(), readw(), readl(), writeb(),
writew(), writel(), memcpy_fromio(),
memcpy_toio()
97

Device Drivers - Exemplo

98

Device Drivers - Exemplo

99

Device Drivers - Exemplo

100

Device Drivers - Exemplo

101

Device Drivers - Exemplo

102

Device Drivers - Exemplo


Compilao igual a um mdulo
Passos adicionais:
o mknod /dev/memory c 60 0
o chmod 666 /dev/memory
Para iniciar:
o insmod memory.ko
Exemplo de uso:
o echo -n abcdef >/dev/memory
o cat /dev/memory
103

Device Drivers - Exerccio


Modificar o cdigo do driver, adicionando
as seguintes funcionalidades:
o O tamanho do buffer deve ser definido via parmetro
o O driver deve conseguir retornar o buffer completo, e
no somente o ltimo caractere, como acontece no
exemplo
Artigo original em:
http://www.freesoftwaremagazine.com/articles/drivers_linux
Ateno: o cdigo original mostrado no artigo foi
desenvolvido para verses antigas do kernel. Por isso o
cdigo mostrado nos slides anteriores foi alterado para
possibilitar seu uso com um kernel atualizado

104

Tempo Real

O que um sistema em tempo real?


o

Um sistema computacional em tempo real um sistema cuja


correo depende no somente do resultado lgico dos
processamentos, mas tambm do instante em que os resultados
so produzidos

O sistema deve ter a habilidade de executar um comando ou


instruo e disponibilizar a resposta em um tempo relativamente
previsvel

105

Tempo Real

Sistema:
o

Um escalonador em tempo real substitui o escalonador original

Executa qualquer cdigo em tempo real, associado ao


escalonador em tempo real

Executa todos os processos normais de tempo restante

106

Tempo Real

Quando uma aplicao executada em modo usurio, a mesma no


tem privilgios do modo kernel

Qualquer grande aplicao executada em tempo real desejar obter


acesso privilegiado

Os recursos so divididos em duas categorias


o Tempo Real
o Tempo no Real

A comunicao entre esses duas categorias pode ser realizada das


seguintes formas:
o Memria compartilhada
o Lgica FIFO
107

Tempo Real

Vantagem e desvantagem:
o

No Linux, h uma diviso entre aplicaes de Tempo Real


e de Tempo no Real

Essa diviso torna as aplicaes de Tempo Real mais


rpidas

Contudo, ela dificulta a programao da aplicao em si se


for feito um comparativo com outros Sistemas Operacionais
que tratam todas aplicaes como Tempo Real
108

Tempo Real

O Kernel do Linux interage com trs relgios de hardware diferentes:


o Real Time Clock (RTC)
o Time Stamp Counter (TSC)
o Programmable Interval Time (PIT)

Os dois primeiros auxiliam o Kernel a obter a data e a hora atuais do


sistema, enquanto o ltimo programado para gerar interrupes
fixas em frequncias determinadas pelo kernel

109

Tempo Real

Utilizao da Hora:
o

Existem trs chamadas de sistema, em nvel de programao,


disponveis para obteno de horas no Linux:

time(), ftime() e gettimeofday()

Alm de funes de formatao das unidades de tempo, tais


como:

ctime(), asctime(), gmtime(), localtime(), mktime() e


strftime()

110

Tempo Real

time(): retorna o nmero de segundos passados desde a primeira


hora do dia primeiro de janeiro de 1970

Operaes que exigem preciso no podero ser feitas com a


funo time(). A melhor resoluo que consegue-se com ela de
um segundo, com erro de meio segundo

111

Tempo Real
Exemplo de utilizao da funo time():

112

Tempo Real

ftime(): Possui uma estrutura de dados interna que fornece mais


informaes sobre a hora atual. Bastante precisa, suas operaes
internas demoram na ordem de centenas de nanosegundos o que
mil vezes menor que sua menor unidade de medio
struct timeb {
time_t time;
short unsigned millitm;
short timezone;
short dstflag;
}

113

Tempo Real

Modos de retorno de ftime():


o

time - tem a mesma funo do retorno da funo time()

millitm - d os milisegundos trancorridos do mesmo momento

timezone - o valor em minutos a oeste do meridiano de Greenwich


em que nos encontramos

dstflag - ser setado em 1 se estivermos no horrio de vero ou 0


se no

Biblioteca sys/timeb.h
114

Tempo Real
Exemplo de utilizao da funo ftime():

115

Tempo Real

gettimeofday(): a funo mais utilizada para a obteno da hora


atual. Sua principal diferena em relao s anteriores que possui
duas estruturas de dados internas:
struct timeval {
long tv_sec;
long tv_usec;
}
struct timezone {
int tz_minuteswest;
int tz_dsttime;
}
116

Tempo Real

Modos de retorno de gettimeofday():


o

tv_sec - guardar o valor em segundos que se passou desde a


primeira hora de primeiro de janeiro de 1970

tv_usec - retorna o nmero de microssegundos transcorridos


aps o ltimo segundo

tz_minuteswest - tem a mesma funo que timezone de ftime()

tz_dsttime - est em desuso (retorna erro no linux)

Biblioteca sys/time.h
117

Tempo Real
Exemplo de utilizao da funo gettimeofday():

118

Consideraes Finais

O desenvolvimento do kernel no uma tarefa simples

O Linux possui um kernel monoltico modularizado

A escolha de um Sistema de Arquivos deve ser feita levando em


considerao aspectos como confiabilidade e rapidez

O gerenciamento de memria do Linux utiliza memria virtual com


tcnicas como segmentao e paginao, propiciando transparncia,
proteo e relocao

119

Consideraes Finais

Por possuir um bom escalonador, o Kernel permite que um certo


nmero de tarefas funcione aparentemente de modo simultneo, de
acordo com suas prioridades

O Linux implementa multiprocessamento em diversos pontos do


kernel, visto que essa tecnologia traz vantagens com relao ao
desempenho

O Kernel oferece System Calls destinadas a manipulao de


processos, permitindo que as aplicaes tenham controle sobre
suas execues e de seus filhos

120

Consideraes Finais

Criar uma System Call com funcionalidades especficas que pode


interagir diretamente com o Kernel uma grande vantagem em
sistemas de cdigo aberto como o Linux

Sistemas de tempo real diferenciam-se pelo fato do tempo de


resposta exigido ser rigoroso no processamento das informaes, e
a no execuo de determinada tarefa nesse tempo de resposta
pode ser catastrfica para a aplicao

121

Referncias
BOVET, Daniel; CESATI, Marco. Understading the Linux
Kernel. 3. ed. 2006. OReilly.
MELLO, Alan Godoy S. Arquitetura do Kernel Linux. 7 mai.
2009. Instituto de Computao UNICAMP. Disponvel em:
http://www.ic.unicamp.br/~islene/mc514/Kernel_Linux.pdf.
Acesso em 06 dez. 2009.
Implementing a System Call on Linux 2.6 for i386.
Disponvel em:
http://www.linux.org/docs/ldp/howto/Implement-Sys-CallLinux-2.6-i386/index.html. Acesso em 05 dez. 2009.
122

Referncias
Linux Man Pages. Disponvel
em: http://www.linuxmanpages.com
O gerenciador de boot GRUB. Disponvel em:
http://www.infowester.com/lingrub.php
GNU GRUB Manual 0.97. Disponvel em:
http://www.gnu.org/software/grub/manual/grub.html
GRUB. Disponvel em: http://wiki.ubuntu-br.org/Grub
CORBET, Jonathan; RUBINI, Alessandro; KROAHHARTMAN, Greg. Linux Device Drivers. 3. ed. OReilly.
123