Kernel Linux
O Linux
19761969
UNICS
1971
UNIX V1
UNIX V6
1979
UNIX V7
81
Xenix
197879 1BSD
19881981
System III
1982
System V
1984
SVR2
1986
SVR3
SVR4
1992
SVR4.2 Xenix
Minix AIX Chorus SCO Unix
Linux
UnixWare
19861979
2BSD
1980 3BSD
4BSD
1981
4.1BSD
1983
4.2BSD
4.3BSD
1993
4.4BSD
Ultrix
SunOS
Mach
Irix
FreeBSD OpenBSD OSF/ 1
Solaris
Fonte: Arquitetura de Sistemas Operacionais – Machado e Maia
Arquitetura do Linux
Fonte: Linux Kernel Devlopment – Robert Love
Tamanho
Ano Versão SLOC
(Milhões)
2001 Linux kernel 2.4.2 2.4
2003 Linux kernel 2.6.0 5.9
2009 Linux kernel 2.6.29 11.0
2009 Linux kernel 2.6.32 12.6
2010 Linux kernel 2.6.35 13.5
2012 Linux kernel 3.6 15.9
Tamanho
Ano Versão SLOC
(Milhões)
2012 Debian 7.0 419
2009 OpenSolaris 9.7
2005 Mac OS X 10.4 86
1996 Windows NT 4.0 11–12
2000 Windows 2000 29
2001 Windows XP 45
Licença
• O Kernel Linux é gratuito, em todos os sentidos da palavra.
• Licenciado sob GPLv2 (GNU General Public License).
• A GPL requer que trabalhos derivados sejam licenciados sob a mesma
• A GPL requer que trabalhos derivados sejam licenciados sob a mesma
licença, ou seja, sob a GPL.
Licença
Em termos gerais, a GPL baseia-se em 4 liberdades:
• A liberdade de executar o programa, para qualquer propósito
• A liberdade de estudar como o programa funciona e adaptá-lo para as suas necessidades.
• A liberdade de redistribuir cópias de modo que você possa ajudar ao seu próximo.
• A liberdade de aperfeiçoar o programa, e liberar os seus
aperfeiçoamentos, de modo que toda a comunidade se beneficie deles.
O acesso ao código-fonte é um pré-requisito para as liberdades 2 e 4.
Licença
Embora qualquer pessoa possa modificar uma cópia do programa é obrigatório que:
• Exista um aviso, em destaque, em cada arquivo modificado, de que os dados originais foram alterados.
• Exista um aviso de que o trabalho distribuído ou publicado deriva
• Exista um aviso de que o trabalho distribuído ou publicado deriva totalmente ou em parte do programa original.
• Caso o programa seja executado de forma interativa, no início de sua
execução deve ser apresentada informação de copyright e de ausência de
garantias (ou de que a garantia corre por conta de terceiros).
Distribuições
• São composta do núcleo Linux e um conjunto variável de software, dependendo de seus propósitos.
• Essa coleção de software livre e não-livre, é criada e mantida por
indivíduos, grupos e organizações de todo o mundo, incluindo o grupo
Linux.
Versão do kernel
3.2.1.1-RC02
Características do kernel
• O kernel não tem acesso nem a biblioteca C nem os cabeçalhos C padrão.
• O kernel é codificado em GNU C.
• O kernel não tem as proteções de memória oferecidas em espaço de usuário.
• A memória do kernel não paginável.
• O kernel não pode (facilmente) executar operações de ponto flutuante.
• O kernel não pode (facilmente) executar operações de ponto flutuante.
• O kernel tem uma pequena pilha de tamanho fixo por processo.
• O Kernel Linux é preemptivo.
• Tem suporte do multiprocessador simétrico (SMP).
• Sincronização e simultaneidade são as principais preocupações dentro do kernel.
• O kernel linux deve ser portável.
POSIX
• O Padrão POSIX é constituído por uma série de regras que determinam como o programador deve escrever o código-fonte de seu sistema de
modo que ele possa ser portável entre os sistemas operacionais baseados no Unix.
• O POSIX define as APIs, juntamente com shells de linha e comando e
interfaces utilitárias, para compatibilidade de software com variantes
de Unix e outros sistemas operacionais.
Shell
• O shell é um interpretador de comandos que atua como interface entre o kernel e o usuário através do terminal.
• Mais rápida e poderosa que o sistema GUI.
• Os aplicativos são programas que podem ser invocados pelo shell para realizar diversas tarefas.
realizar diversas tarefas.
• O shell é um programa encarregado de interpretar os comandos, transmití-los ao sistema e retornar o resultado.
• O shell mais utilizado nas distribuições Linux é o Bash (Bourne again shell);
Kernel Modules
• O Linux suporta o carregamento dinâmico dos módulos do kernel.
• Módulos do kernel são seções de código do kernel que podem ser
compiladas, carregadas e descarregadas independentemente do resto do kernel.
• O Kernel Linux não tem drivers no user space. Todos os drivers estão no
• O Kernel Linux não tem drivers no user space. Todos os drivers estão no espaço do kernel e são comumente chamados de Kernel Loadable
Modules .
• No Linux, apenas parte dos drivers é carregada na memória durante a
inicialização. A maioria pode ser carregada dinamicamente quando
necessário.
Kernel Modules
Fonte: Operating System Concepts - Silberschatz
Kernel Modules
• A interface de módulos permite que terceiros (third parties) escrevam e distribuam seus módulos de forma proprietárias, sem seguir a licença GPL.
• Módulos do kernel tipicamente podem implementar um device driver, um
filesytem ou um procolo de rede.
Kernel Modules
O Linux possui quatro componentes para o suporte de módulos:
• O sistema de gestão de módulos
• O carregador/descarregador de módulos
• O sistema de registro de driver
• O mecanismo de resolução de conflito
• O mecanismo de resolução de conflito
Drivers
Classificados como:
• Driver de dispositivo de caracteres
• Driver de dispositivo de bloco
Subsistemas do Kernel
Fonte: Arquitetura do kernel Linux - Mello
Kernel
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Syscalls
As chamadas de sistemas são comumente chamadas de Syscalls no Linux.
As Syscalls fornecem uma camada entre o kernel e as aplicações de usuários.
São importantes porque:
• Primeiro, elas fonecem uma abstração da interface com o hardware, pois quando esse está lendo ou escrevendo um arquivo, ele não se preocupa quando esse está lendo ou escrevendo um arquivo, ele não se preocupa com o tipo de disco ou mesmo o tipo de filesystem em qual o arquivo reside.
• Segundo, garantem a segurança e a estabilidade do sistemas.
Syscalls
A figura ilustra a relação entre a aplicação, a biblioteca C e o kernel com uma chamada a função printf().
Fonte: Linux Kernel Development - Love
Syscalls
eax = NR_read()
Interrupção (0x80) system_call_table[eax]
Fonte: Linux Kernel Development – Love (adaptado)
resume_userspace return
return
Gerenciamento de processos
• O Linux não diferencia threads de processos. Para o Kernel Linux todos os processos são iguais e apenas compartilham recursos
• O Kernel Linux executa operações em segundo plano através das threads que existem unicamente no kernel space e não trocam de contexto no user space.
• Quando um processo ou uma tarefa termina, o Kernel Linux libera os
recursos e notifica os outros processos e tarefas que estavam associados a
eles.
Criação de processos
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Criação de processos
Fonte: Sistemas Operacionais Modernos - Tanenbaum
System calls de Processo
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Sinais relacionados com processos
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Copy on write
• Copiar toda o espaço de endereçamento de memória do processo pai para o processo filho é muito caro.
• O Linux entrega ao filho a tabela de páginas do pai, porém essas são
apenas links para as páginas dos pai marcados com permissão de leitura.
• Quando o filho tenta escrever em uma pagina, ele recebe um erro que é
• Quando o filho tenta escrever em uma pagina, ele recebe um erro que é tratado pelo kernel que trata de alocar uma cópia dessa página com
direito de escrita para o filho.
Copy on write
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Threads
• Threads no Linux são criadas por um mecanisno específico, a syscall clone().
pid = clone(function, stack_ptr, sharing_flags, arg)
Threads – sharing_flags
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Daemons
• Mesmo que o usuário esteja ausente da sua estação de trabalho, muitas tarefas (centenas ou até milhares) estão em execução.
• Essas tarefas são chamadas de Daemons.
Sincronização de processos
• Pipe
• Atomic integer
• Spinlock
• Semaforos (sleeping lock)
• Mutex
• Seqlock
• Seqlock
Escalonamento
O Linux usa dois tipos de algoritmos para escalonamento:
• Um algoritmo de tempo compartilhado para escalonamento preemptivo equitativo entre múltiplos processos
• Um algoritmo de tempo real para tarefas onde as prioridades absolutas
são mais importantes do que a equidade
Prioridades
Fonte: Operating System Concepts – Silberschatz (adaptado)
5 ms 800 ms
139
Fila de execução e dos vetores de prioridades
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Prioridade dinâmica
sleep_avg Bonus
>=0 but < 100 ms 0
>= 100 ms but < 200 ms 1
>=200 ms but < 300 ms 2
>=300 ms but < 400 ms 3
DP = max(100, min(SP − bonus + 5, 139))
>=300 ms but < 400 ms 3
>=400 ms but < 500 ms 4
>=500 ms but < 600 ms 5
>=600 ms but < 700 ms 6
>=700 ms but < 800 ms 7
>= 800 ms but < 900 ms 8
>=900 ms but < 1000 ms 9
1 s 10
Gerenciamento de memória
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Gerenciamento de memória
Fonte: Operating System Concepts - Silberschatz
Alocação de memória – Algoritmo companheiro
Fonte: Sistemas Operacionais Modernos - Tanenbaum
Alocação de memória – alocador de fatias (slab)
Fonte: Operating System Concepts - Silberschatz
Alocação de memória – alocador de fatias (slab)
Fonte: http://www.secretmango.com/jimb/Whitepapers/slabs/slab.html
Paginação
• No Linux a unidade básica de gerenciamento de memória é a página.
• Um processo não precisa estar inteiro na memória para ser executado.
• O processo de paginação ocorre sob demanda, não existe pré-paginação.
Algoritmo de recuperação de moldura de páginas
Fonte: Sistemas Operacionais Modernos – Tanenbaum (adaptado)
1
Swapping
Fonte: https://wiki.duke.edu/display/SCSC/Virtual+Memory+Issues
Out-of-Memory Killer
• Se não houver memória livre e não for possível recuperar espaço, o sistema está em apuros.
• O último recurso: Matar algum processo
• Critério:
– Deve ser grande (incluindo os filhos) – Deve ser grande (incluindo os filhos) – Não foi executado há muito tempo – Baixa-prioridade
– Não pode ser um processo do kernel (root)
Dispositivos E/S no Linux
• Simples: todos os dispositivos são tratados como arquivos
• Recebem o nome arquivos especiais e são associados ao um /dev
– Ex: /dev/hd1
• Não são necessários comandos especiais para acessar esses arquivos.
• São divididos em duas categorias:
• São divididos em duas categorias:
– Arquivos especiais de bloco
– Arquivos especiais de caracteres
• Cada dispositivo possui um número único, sendo formado por duas partes:
– Major number: identifica ao kernel o driver respectivo ao dispositivo.
– Minor number: identifica ao driver o dispositivo em questão (um mesmo
driver pode gerenciar múltiplos dispositivos).
Sistema de arquivos
• Arquivos são contêineres de dados relacionado a uma determinada região ou blocos de um disco composto geralmente com uma simples sequencia de bytes
• Sistema de arquivos é uma abstração utilizada pelo sistema operacional para gerenciar arquivos.
Responsável por:
–
Organizar dados
–
Controlar o espaço livre
–
Compartilhar arquivos entre usuários
–
Facilitar e controlar o acesso a informações
• No Linux diretórios também são arquivos.
• Existem também arquivos especiais (como Dispositivos de E/S e links
simbólicos).
Estrutura de um arquivo
• User data
– Dados do usuário dentro do arquivo
• Inode
– Armazena informações utilizadas pelo sistema operacional para gerenciar o arquivo
gerenciar o arquivo
• Tamanho, dono do arquivo, tempo de acesso, modificação,
localização dos dados, permissões
Organização Hierárquica
Fonte: Sistemas de arquivos no Linux - Maiolino
Representação de diretórios
Pontos de montagem
Fonte: Sistemas Operacionais Modernos – Tanenbaum (adaptado)
Chamadas de sistema para arquivos
Fonte: Sistemas Operacionais Modernos – Tanenbaum (adaptado)
Chamadas de sistema para diretórios
Fonte: Sistemas Operacionais Modernos – Tanenbaum (adaptado)
VFS (Virtual File System)
• Abstração de software responsável pelo suporte a utilização de diversos sistemas de arquivos diferentes no mesmo sistema operacional
• Provê uma série de estruturas genéricas a serem compartilhadas pelos demais sistemas de arquivos
–
Inodes, arquivos, funções genéricas, cache, etc.
Tais estruturas são mantidas somente em memória, cada sistema de
• Tais estruturas são mantidas somente em memória, cada sistema de
arquivos possui suas próprias estruturas que são armazenadas nos discos.
VFS - Estruturas
• superblock:
– responsável por armazenar informações como o tipo do sistema de arquivos, tamanho, dispositivo, lista de inodes e suas operações básicas, como criação e remoção de inodes.
• Inode
• Inode
– representa um objeto do sistema de arquivos (um arquivo ou um diretório), contendo informações como dono, grupo, permissões, blocos e operações (como leitura e escrita no arquivo).
• Dentry
– Representa uma entrada de diretório. As entradas de diretórios são
armazenadas em uma cache e pode conter, por exemplo, entradas
para /, /usr, /home etc.
VFS (Virtual File System)
Fonte: Sistemas de arquivos no Linux - Maiolino
Sistema de arquivos real
• O Linux suporta vários tipos de FS (File system) diferentes.
–
minix
–
ext, ext2, ext3, ext4
–XFS
–
ReiserFS
–JFS
–
JFS
–
FAT, FAT32, NTFS
–NFS
–
proc
–Btrfs
Journaling
Arquivos retirados do Journal
Fonte: http://www.howtogeek.com/howto/33552/htg-explains-which-linux-file-system- should-you-choose/ (adaptado)
Arquivos colocados no Journal
Arquivos escritos
no disco
Journaling
Fonte: http://sergioprado.org/sistemas-de-arquivo-em-linux-embarcado-parte-1/
Segurança
Cada usuário no linux possui:
• UID (Id de usuário)
–
O Linux registra
–
Varia de 0 a 65535 (16 bits)
• GID (Id de grupo)
–