manip kernel linux
DESCRIPTION
comados de linuxTRANSCRIPT
Manipulação de Kernel LinuxDavid Jourdain - [email protected]
Conteúdo da apresentação● Kernel 3.X.XX
● Diretórios e Arquivos
● Arquitetura Monolítica
● Estrutura da Kernel Linux
– Gerenciamento de Tarefas● Modelos de Interrupção● Estados de Tarefas
– Gerenciamento de Memória● Paginação
– Gerenciamento de Entrada e Saída
● 2a. Parte – Manipulação da Kernel
● Requisitos de Manipulação
● Manipulação da Kernel
● menuconfig
● O quê tem lá dentro?
● Compilar Kernel e gerar Pacotes
● Arquivo initrd
● Instalação da Kernel
● Mapa da Kernel Linux
● Referências
Kernel 3.X - Diretórios e Arquivos
● A Kernel usada como base é a Kernel 3.X.XX, do repositório do Github
● O diretório padrão para manipulação da Kernel é o /usr/src. Neste diretório, descompactamos o pacote do código fonte da Kernel
● Nosso foco será no diretório usr/src/linux-source-3.X.XX/, de onde partiremos para analisar diversos outros diretórios, como o acpi/ e o staging/
Kernel 3.X - Diretórios e Arquivos
● No caso do diretório acpi/, temos os arquivos para uso do Advanced Configuration and Power Interface ● Arquivos: ac.c (gerencia o uso compartilhado da energia),
battery.c (gerencia o consumo da bateria) e o fan.c (gerencia o cooler do notebook), entre outros
● O Advanced Configuration and Power Interface tem como objetivo consolidar e melhorar a alimentação de energia existentes e os padrões de configuração para os dispositivos de hardware.
Kernel 3.X - Diretórios e Arquivos
● No caso do diretório staging/, temos um diretório para testes de novas funcionalidades ● Arquivos: diversos, divididos em sub-diretórios.
● O Staging Driver tem como objetivo unir em um único diretório, para permitir que patchs para hardwares ainda em fase de testes, possam ser avaliados, testados, corrigidos e compilados, como módulo interno ou externo da Kernel.
Kernel 3.X - Diretórios e Arquivos
● Citamos até o momento o diretório de manipulação da Kernel. Contudo, este diretório /usr/src faz parte de um contexto maior, mais amplo, onde temos a organização de toda uma gama de diretórios e arquivos, acessíveis ao usuário com nível pleno, ou normalmente chamado como 'usuário com poderes de root'.
● Esta estrutura de diretórios e arquivos segue a Filesystem Hierarchy Standard (FHS), padrão de organização de diretórios recomendado para sistemas clones-unix, como o Linux.
Kernel 3.X - Diretórios e Arquivos
Esta organização para diretórios e arquivos, utilizada no Linux, segue o padrão proposto pelo Filesystem Hierarchy Standard (FHS).
Algumas distribuições Linux agregam outros diretórios a esta estrutura padrão. Outros, alteram a estrutura padrão, e não seguem a FHS.
Debian GNU/Linux é uma das distribuições Linux que segue a FHS.
Kernel 3.X – Arquitetura Monolítica
● No Linux, todos os serviços centrais residem em uma kernel central, que é o núcleo do sistema operacional.
● Esta kernel mantém todos os componentes básicos juntos e elimina a espera por mudanças de operação e/ou contexto.
● Apesar de ter arquitetura monolítica, a estrutura da Kernel Linux é integralmente modular, permitindo adicionar ou remover componentes (ou módulos) conforme necessidade e/ou demanda.
Kernel 3.X – Estrutura da Kernel Linux
Camada de Aplicativos
Interface para Chamadas do Sistema
Gerenciamento de Entrada e SaídaGerenciamento
de MemóriaGerenciamento
de Tarefas
Driver de Dispositivos
EspaçoDo Usuário
Kernel
PCI IDE I2C USB SCSI BLOCK CHAR . . . . . .
Camada do Usuário
Camada da BIOS
Monitoria dos Sinais de Identificação de Hardware
VFS
Sistema de Arquivos
EXT2 EXT3
EXT4
btrfs
iso9660
PROC
NTFS
TMPFS
SYS
REDEAgendamento
De I/O
criptografia
SOM
V4L
Kernel
Hardware
Energia
Timekeeping
Agendamento multicore
Agendamento singlecore
Inicialização
CPUSET
SLAB
Buddysystem
ASLR
Paginação Nivel 2 e 3
SWAP
DEP
Gerenciamento de Tarefas
● É responsável pelo processamento simultâneo de vários programas (multitarefa), pela compatibilidade com múltiplos núcleos (processadores) e pelo agendamento de serviços.
● Agendamento de serviços é o gerenciamento de qual tarefa é executada e quanto tempo em cada núcleo. O agendamento de serviços é dividido em duas etapas:
Gerenciamento de Tarefas
● Agendamento de serviços:● Etapa 1: O agendador de múltiplos núcleos agrupa
processadores individuais ou os núcleos de uma máquina multicore. Nestes grupos, as tarefas são designadas para as CPUs.
● Etapa 2: Cada processador gerencia as tarefas que serão executadas por ele, conforme agendamento de serviços. O Stack Pointer de cada núcleo fornece o endereçamento da cada bloco de dados a ser analisado.
Gerenciamento de Tarefas
● Modelo de Interrupção● A Kernel Linux distingue em 4 níveis distintos para processar código.
Usuários está restritos ao nível do usuário e ao nível dos aplicativos; Em computadores com múltiplos núcleos, as funções podem executar múltiplas tarefas em paralelo.
● Chamadas de sistema e threads da Kernel: tem prioridade similares e ficam no 'espaço da Kernel'. Podem trabalhar com modo de preempção (interrupções bloqueadas).
● O nível mais inferior é ocupado pelas rotinas de interrupção de serviços, que podem interromper toda e qualquer operação nas camadas superiores. É onde temos os 'as monitorias dos sinais de identificação de hardware'.
Gerenciamento de Tarefas● Modelo de Interrupção
EspaçoDo Usuário
Kernel
Kernel
Hardware
Aplicativo Aplicativo
Função da Kernel Função da Kernel
Soft IRQ
Hard IRQSA_SHIRQ
Hard IRQ
Instância de driverProcesso da Kernel
Fila de Tabalho
Soft IRQTasklet
Timer
ISR
Obs.: Programadores de Kernel precisam conhecer o modelo de interrupção para identificar áreas críticas e desenvolver código de forma a protegê-las corretamente.
Arquivo 01 Arquivo 02
Gerenciamento de Tarefas● Modelo de Interrupção
● Chamadas de sistema e threads da Kernel (Tarefas):
Atual
Executando
Hibernação
Ocioso
Parado
Traçado
Wakekill
Interrompível
N/Interropível
AcordandoExecutável
Ativo
SIGSTOP
Traçar
Dormir
Dormir
Dormir
SIGCONT
SIGCONT
Acordar, Sinal
Acordar, Sinal
Acordar
Estados de Repouso
AgendadorWait ()
Fork ()Clone ()
Aplicativos e threads da Kernel passam por diversos estados.
Compreender os diversos estados dos serviços da Kernel permite saber 'como' e 'porquê' fazer um patch para a Kernel, bem como permite ter a compreensão sobre o funcionamento da Kernel.
Gerenciamento de Tarefas
● Modelo de Interrupção● Estados de Tarefas: 'Tarefas' podem ter diversos estados (gráfico
anterior). Uma nova tarefa sempre é criada por uma chamada de sistema clone() como uma cópia exata de seu processo-mãe. A nova tarefa tem o estado TASK_RUNING. O agendador escolhe a próxima tarefa a ser processada, considerando as tarefas disponíveis. Uma mudança de contexto ativa a 'tarefa', que muda o estado para ativo.
Gerenciamento de Memória
● É o segundo maior componente da Kernel.
● Responsável por implementar o endereçamento e a paginação.
● Garante que todo e qualquer conjunto de código tenha acesso a memória principal.
● O registro do endereçamento utilizado pelos conjuntos de códigos (aplicativos, libs, módulos, a própria kernel, etc...) é SEMPRE aleatório, considerando os registros heap, stack e as bibliotecas compartilhadas. Este processo de endereçamento aleatório de instruções de código é chamado de Address Space Layout Randomization, ou ASLR e é um dos fatores que garante a segurança de acesso exclusivo da Kernel, bem como determina o processo hierárquico de acesso aos códigos em processamento.
Gerenciamento de Memória
● Ciclo de vida dos objetos da Kernel na memória (via 'Paginação')● Este 'ciclo' impede ataques maliciosos, vindos de fora da Kernel
Usar Conjunto de Código – CC
Liberar CC
Finalizar CC
Memória Livre
Reservar CC
Pré-inicializar CC
Alocar Memória
Paginação
Aplicativo/Componenteda Kernel
Alocador 'SLAB'
Sistema Parceiro
Objeto (CC)
Página(Blocos de Conjunto de Código)
A Kernel depende destes CC's tipificados e se beneficia da reciclagem destes CC's graças ao alocador SLAB. A Kernel fornece diversos CC's pré-inicializados.
Essa abordagem tem benefícios para o desempenho: A inicialização simultânea de diversos CC's otimiza o uso do cache do processador.
Podemos visualizar este tipo de dados com o comando cat /proc/slabinfo
Gerenciamento de Memória
● Paginação● O gerenciamento de memória converte os endereços lógicos
usados pelos aplicativos para manipulação de dados em endereços físicos. O método utilizado para isso é conhecido como 'paginação'. A paginação divide a memória principal em 'páginas' do mesmo tamanho. Neste contexto, uma 'pagina' tipicamente tem 4KB. Em outras palavras, 4GB de RAM são divididos em um milhão de páginas de memória.
Gerenciamento de Memória
● PaginaçãoO mapeamento da memória virtual para a memória física ocorre por meio de tabelas de página, implementadas no hardware subjacente.
O hardware fornece o mapeamento, mas é a kernel que gerencia as tabelas e sua configuração. Um processo pode ter um grande espaço de endereço, mas é esparso, ou seja, pequenas regiões (páginas) do espaço se referem à memória física através das tabelas de página.
Isso permite que um processo tenha um enorme espaço de endereço que é definido apenas para as páginas necessárias em um dado momento.
Tabelas de página fornecem o mapeamento de endereços virtuais para endereços físicos
Espaço deEndereço Físico
Arquivo 'SWAP' / PartiçãoPaginação no disco
(HD, PenDrive)
Espaço deEndereço
Virtual
Processo A Processo B
Paginação (Tabela de Páginas)
Gerenciamento de Memória
● Paginação A capacidade de definir memória para processos de forma esparsa significa que a memória física subjacente pode ser confirmada em excesso.
Por meio de um processo chamado paginação, páginas pouco usadas são movidas dinamicamente para um dispositivo de armazenamento mais lento (por exemplo, um disco) para acomodar outras páginas que precisam ser acessadas. Isso permite que a memória física do computador forneça páginas que um aplicativo precisa imediatamente, e migre páginas menos necessárias para o disco para melhor uso da memória física.
Observe que algumas páginas podem se referir a arquivos, outras a binários executáveis.
A troca permite melhor uso do espaço da memória física. ao migrar páginaspouco usadas para armazenamento mais lento e menos necessárias
MemóriaFísica
Mapeamentode Páginas
MemóriaVirtual
SWAPPER / Permutador
Paginação (Tabela de Páginas)
Arquivo SWAP / Partição DiscoPáginas em DiscoGarantidas/Protegidas
Gerenciamento de Memória
● Paginação (API's da Kernel para Manipulação de Memória)
● Manipulação de memória do usuário. Esta seção cobre a interface da Kernel e do espaço do usuário. As funções de acesso à memória do espaço do usuário estão listadas no próximo slide.
● Estas API's específicas (ou Interface de Programação de Aplicativo) são instruções da Kernel, que asseguram que toda e qualquer manipulação da memória sejam tratadas corretamente.
● Com isso, podemos avaliar os métodos de movimentação de dados entre a Kernel e o espaço do usuário (com a Kernel iniciando a operação e gerenciando todo o processo).
Gerenciamento de Memória
● Paginação (Funções de Manipulação de Memória do Usuário)
a implementação dessas funções depende da arquitetura. Em arquiteturas x86, é possível achar essas funções e símbolos definidos em:
./linux-source-3.X.XX/arch/x86/include/asm/uaccess.h, com origem em ./linux-source-3.X.XX/arch/x86/lib/usercopy_32.c e usercopy_64.c.
Gerenciamento de Entrada e Saída
● É responsável pelo acesso a arquivos e dispositivos periféricos. O ponto de distribuição central é o Virtual Filesystem Switch (VFS), que distribui o acesso e repassa as chamadas de disco para o agendador. Ele é responsável por organizar e otimizar as chamadas, para que a cabeça de leitura (no caso dos discos rígidos) faça o menor número possível de movimentos.
● O gerenciamento da cabeça de leitura é irrelevante para SSD's (memórias flash). Por isso, a Kernel passa os dados diretamente para o disco, se estiver configurada para este tipo de ação.
Gerenciamento de Entrada e Saída
● O VFS também utiliza o mesmo modelo hierárquico que a Kernel usa para gravar ou ler dados de um disco. Este modelo registra os meta-dados de cada arquivo. São estes os meta-dados: tamanho do arquivo, data de criação, último acesso, provilégios de acesso, propriedade, aplicativo que podem manipular o arquivo, etc... Este registro do meta-dado é associado a um inode (nó de índice de registro, que é um número identificador de cada arquivo e de seus meta-dados).
● Podemos listas os inodes e as demais informações associadas a ele e ao arquivos, a partir do comando ls -lai.
Gerenciamento de Entrada e Saída
● Exemplo de execução e resultado do 'ls -lai'
brlix@brlix$ ls -lai
1321328 drwxr-xr-x 4 brlix brlix 4096 Dez 17 21:11 .
1319023 drwxr-xr-x 59 brlix brlix 4096 Dez 18 11:28 ..
1311518 -rw-r—r-- 1 brlix brlix 61996 Dez 8 13:46 CV-en.odt
1332258 -rw------- 1 brlix brlix 56 Set 24 14:48 .directory
1853167 drwxr-xr-x 2 brlix brlix 4096 Set 19 10:29 Epidemus
1349300 drwxr-xr-x 2 brlix brlix 4096 Dez 6 16:31 impressos
1321712 -rw-r--r-- 1 brlix brlix 36889 Dez 17 21:11 notes.txt
1337519 -rw-r—r-- 1 brlix brlix 280 Set 27 15:17 patrocinio-latinoware.txt
1341827 -rw-r—r-- 1 brlix brlix 2801 Set 20 13:31 sources.list-model
1339328 -rwxr-xr-x 1 brlix brlix 191 Set 25 20:10 wireless-lan-up
Gerenciamento de Entrada e Saída
● Ainda sobre o VFS, ele possui um conjunto de interfaces padrão para aplicativos, que se destina a reconhecer e executar E/S de arquivo, por meio de um conjunto de sistemas de arquivos que estiverem disponíveis na Kernel e combina isso com o suporte a um ou mais dispositivos.
● Os sistemas de arquivos não são estáticos. Estes sistemas de arquivos podem ir e vir conforme a natureza transitória dos dispositivos de armazenamento.
Gerenciamento de Entrada e Saída
● Um desktop Linux tem suporte ao sistema de arquivos ext3 no disco rígido e ao sistema de arquivos ISO 9660, em um CD-ROM/DVD-ROM, com o CDFS. Conforme mídias são inseridas e removidas, a Kernel Linux se adapta a esses novos sistemas de arquivos com diferentes conteúdos e estrutura. Um sistema de arquivo remoto é acessado através do Network File System (NFS). Ao mesmo tempo, o Linux 'monta' uma partição NT File System (NTFS) com Windows e a utiliza para leituras e gravações.
● Paralelamente, uma USB flash drive (UFD) removível é conectada, fornecendo outro sistema de arquivos, bem como o mesmo conjunto de interfaces de E/S de arquivo pode ser usado por todo esses dispositivos, permitindo que o sistema de arquivos subjacente e o dispositivo físico sejam removidos pelo usuário.
● O VFS cria uma 'camada de abstração uniforme', que permite a interação transparente entre as camadas manipuláveis pelo usuário ('aplicativos' e 'usuário') e a camada da BIOS e os dispositivos (hardware).
Gerenciamento de Entrada e Saída
Camada de Aplicativos Espaçodo Usuário
Kernel
Camada do Usuário
Camada da BIOS
Monitoria dos Sinais de Identificação de Hardware
Kernel
Hardware
Camada de Abstração
VFS
Sistema de Arquivos
ISO 9660 EXT3
EXT4
btrfs
CDFS
PROC
NTFS
NFS
USBFS
REDEAgendamento
De I/O
criptografia
SOM
V4L
Camada de Blocos / Controladores de Dispositivos
A 'Camada de Abstração' oferece uma interface uniforme, por meio de distintos sistemas de arquivos, para estabelecer o vínculo entre os arquivos manipulados pelo usuário e os locais de armazenamento.
Este processo é considerado para a primeira gravação ou para simplesmente 'salvar' o arquivo, atualizando os dados, onde ele já se encontrava.
2a. Parte – Manipulação da Kernel
● A partir deste ponto, iniciamos o processo de instalação dos pacotes mínimos necessários para manipulação da Kernel, que pode ser feita diretamente, arquivo por arquivo, ou através de configuradores que integrem todos os módulos da Kernel em uma única interface de configuração, permitindo visualização de todos os itens disponíveis para uso.
● Um dos fatores indispensáveis para a manipulação da Kernel é conhecer os dispositivos do computador utilizado. Para isso, usamos os comandos lspci, lsusb e lshw.
Requisitos para Manipulação
● LIBNCURSES5-DEV● Conjunto de bibliotecas de funções da família ncurses (new curses), que
gerenciam programas, extensões, lib's e manuais para programação, sob GNU/GPL. Oferece um método independente para atualizar caracteres na tela.
● MAKE● O MAKE pode ser usado para descrever qualquer tarefa em que alguns arquivos
possam ser atualizados automaticamente com os outros, sempre que os outros mudarem. Para usar o MAKE, é necessário escrever um arquivo chamado "makefile", que descreve as relações entre os arquivos em seu programa, e o estado dos comandos para atualizar cada arquivo.
Requisitos para Manipulação
● GCC● O GCC é o compilador padrão para C, C++, Objective-C, Objective-C++, Ada,
Fortran 95, e Java em todas as arquiteturas. O pacote do GCC também provê libgcc1, libgcc2 (m68k) e libgcc4 (hppa) que contêm as GCC intrinsics e libstdc++6.
● KERNEL-PACKAGE● Um pacote Debian de utilitários para construir uma Kernel Linux. Possui arquivos
“.config” pré-configurados para diversas arquiteturas. O comando para compilação e empacotamento “make-kpkg” está dentro deste pacote.
Requisitos para Manipulação
● BUILD-ESSENTIAL● Referencia todos os pacotes essenciais para efetuar a
construção/manipulação/edição de pacotes para Debian's-Like
● INITRAMFS-TOOLS● Pacote de scripts que facilita a criação de arquivos initrd. O initrd é um arquivo
que é responsável pelo processo de inicialização da Kernel, usado para preparar as tarefas a serem inicializadas antes de execução do sistema de arquivos
● GIT (para usarmos a kernel do Ubuntu)● Git é um sistema de controle de versão distribuído com ênfase em velocidade. O
Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do kernel Linux.
Requisitos para Manipulação
● KERNEL SOURCE● Código fonte da kernel a ser utilizada no processo de manipulação
Podemos utilizar um “Linux Source” de qualquer origem, desde que o “source” possua os módulos que sejam compatíveis com o ambiente em uso. Exemplo:
- Ambiente Debian-Like
- Podemos usar “Linux Source” da kernel.org
- Podemos usar “Linux Source” do Ubuntu, via 'git'
# git clone git://kernel.ubuntu.com/ubuntu/ubuntu-precise.git source
- Podemos usar “Linux Source” do Debian
- Entre outras fontes... (procure fontes confiáveis!!)
Manipulação da Kernel
● Via “make menuconfig”, podemos manipular a partir de uma ferramenta, a habilitação e/ou desabilitação de módulos para suporte a hardware e sistemas de arquivos
● Além do “menuconfig”, temos o “xconfig” e o “gconfig”, que são ferramentas gráficas que também permitem a manipulação do configurador para a Kernel
● Outro caminho (mais complexo) é a manipulação do arquivo “.config”, utilizado para determinar quais módulos serão compilados e se serão internos ou externos
Manipulação da Kernel - menuconfig
O quê tem lá dentro?
● Bom,.... só usando o menuconfig para descobrir!● Vamos executar
● ~$ cd /usr/src/linux-source-3.X.XX/● ~$ sudo su● ~# make menuconfig
Compilar Kernel e gerar Pacotes
● Após todo o processo de edição, podemos executar o comando abaixo, para compilar e gerar pacotes de instalação do “fonte” editado (linux-source), da “imagem” (linux-image) da Kernel e dos “cabeçalhos” (linux-headers) de interação com a Kernel.
# make-kpkg kernel_image kernel_source kernel_headers
Arquivo initrd
● O arquivo initrd é um bloco de dispositivos somente de leitura. Também é uma memória RAM virtual que é inicializada pelo gerenciador de boot (grub ou lilo) antes que a kernel seja inicializada. A kernel então pode usar o conteúdo do initrd para iniciar o sistema em duas etapas.
● Na primeira etapa da inicialização, a kernel inicia-se e monta um sistema de arquivos raiz inicial, a partir do conteúdo do initrd. Na segunda etapa, os drivers adicionais e outros módulos são carregados. Depois de carregar os módulos adicionais, um novo sistema de arquivos root é disponibilizado.
Instalação da Kernel
● Com os arquivos gerados, podemos instalar a imagem da kernel e os cabeçalhos, com o seguinte comando:
# dpkg -i kernel*.deb
● Criar o arquivo initrd (caso não seja criado na compilação)
# mkinitramfs -o /boot/initrd.img-3.X.XX /lib/modules/3.X.XX
● Atualizar o gerenciador de boot (no caso, o grub)
# update-grub
Instalação da Kernel
● Após atualizar, podemos verificar o arquivo de gerenciamento de boot do grub, para verificar todas as kernels disponíveis.
# nano /boot/grub/grub.cfg (para grub 2)
● Obs.: devemos verificar a presença das linhas de inicialização da kernel, bem como a linha de inicialização do initrd correspondente a cada kernel.
Mapa da Kernel Linux
Referências
● Kernel GitHub● https://github.com/torvalds/linux
● Thorsten Leemhuis “Kernel Log – Coming in 3.1” Articles● http://www.h-online.com/open/features/Kernel-Log-Coming-in-3-1-Part-1-Networking-1323463.html?page=1
● http://www.h-online.com/open/features/Kernel-Log-Coming-in-3-1-Part-2-Storage-and-filesystems-1338160.html
● http://www.h-online.com/open/features/Kernel-Log-Coming-in-3-1-Part-3-Architecture-infrastructure-virtualisation-1345178.html
● http://www.h-online.com/open/features/Kernel-Log-Coming-in-3-1-Part-4-Drivers-1346605.html
● Microsoft contributes a lot of changes to Linux kernel 3.0 ● http://www.h-online.com/open/news/item/Microsoft-contributes-a-lot-of-changes-to-Linux-kernel-3-0-1280528.html
● Security breach at kernel.org● http://www.h-online.com/open/news/item/Security-breach-at-kernel-org-1334642.html
Referências
● Advanced Configuration and Power Interface - ACPI● http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface
● Virtual Filesystem Switch (VFS)● http://www.ibm.com/developerworks/linux/library/l-virtual-filesystem-switch/
● Debian Package Tracking System - Kernel 3.X.XX● http://packages.qa.debian.org/l/linux-2.6.html
● Ubuntu Packages Search System - Kernel 3.X.XX● http://packages.ubuntu.com/precise/linux-source-3.2.0
● Linux Kernel Map● http://www.makelinux.net/kernel_map/
● Demais referências: Arquivos PDF disponíveis no mini-curso
معنا تحدث