Vous êtes sur la page 1sur 56

UNIVERSIDADE FEDERAL DE ITAJUB III - SECOMP

Executando o Linux em processadores ARM utilizando o QEMU

Tiago Maluta

Copyright 2007: Tiago Maluta maluta@users.sourceforge.net

Voc livre para: 1 Para copiar, distribuir e apresentar este trabalho 2 Fazer trabalhos derivados 3 Fazer uso comercial deste trabalho Com as seguintes condies: Atribuio. Voc deve dar crdito ao autor

Compartilhamento igualitrio. Se voc alterar, transformar, fizer algum trabalho derivado deste, o resultado deve estar em uma licena idntica a esta.

http://creativecommons.org/licenses/by-sa/3.0/

Prembulo
Poder executar vrios sistemas em uma mesma mquina

Estatsticas...

Motivao
Conhecer outra tecnologia sem precisar investir em equipamentos (hardware). O cdigo aberto, pode-se aprender estudando ele.

Se der pau no estraga, no queima...

ARM
Advanced RISC Machines

Muito utilizado nas telecomunicaes. A maioria dos smartphones utilizam plataformas que possuem o processador ARM. Pr: Verstil, com o core do processador, os fabricantes tem facilidade em personalizar implementaes. Contra: Preo das ferramentas de desenvolvimento.

Filosofia

RISC

Especficos para sistemas embarcos, existe um set de instrues chamado Thumb que proporciona mais facilidade no desenvolvimento.

O que uma distribuio Linux?

Linux

Software GNU

Em sistemas embarcados dificilmente instala-se uma distruibio na forma tradicional em que conhecemos, geralmente so adaptaes bem especficas que adequam as limitaes de memria, interface com o usurio e conectividade.

Compilar o Kernel

#include <stdio.h>
teste.c

int main(int argc, char *argv[] ) { printf(SECOMP 2007 \n); return 0; }

$ gcc teste.c -o teste $ ./teste SECOMP 2007 $

Cdigo-fonte do kernel

printf(HelloSECOMP);

mutex.c printf(HelloSECOMP); ptrace.c fork.c (...) time.c

gcc mutex.c -o mutex gcc ptrace.c -o ptrace gcc fork.c -o fork

Foi desenvolvido um programa chamado make para facilitar o processo de compilao. Agora toda receita de como compilar fica em um arquivo chamado Makefile $ make

O resultado desse cdigo-fonte compilado a imagem do kernel. Ou seja, nada mais que um programa. A diferena que este programa o responsvel por alocar e gerenciar os recursos do dispositivo.

Instalando o QEMU
Verso utilizada: QEMU PC emulator version 0.9.0, Copyright (c) 2003-2007 Download: http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
M)

(< 2.0

Instalao (via codigo-fonte): $ $ $ $ $ tar zxvf qemu-0.9.0.tar.gz cd qemu-0.9.0 ./configure make make install

Ou pelos gerenciadores de pacotes das distribuies: yum,apt-get,emerge,etc.

Modos de operao
Machine Emulator

QEMU

User-space Simulator

Virtualizer

CPUs suportadas

Como no PC (x86) ?
ON / RESET Inicializao do Computador Estgio 1: bootloader Estgio 2: bootloader Kernel Init Operao BIOS MBR LILO, GRUB, etc Linux User-space

J nos sistemas embarcados...


ON / RESET Inicializao do Dispositivo bootloader Kernel Init Operao Circuito Prprio ROM Linux, Symbian... User-space

Lista de Material
Distribuio Linux: Gentoo Emulador: QEMU Compilador Cruzado

Download do Compilador Cruzado

Compilador Cruzado
Descompacte em uma pasta: /opt Atualize as variveis de ambiente: # export PATH=/opt/arm-2007q1/bin:$PATH No final, o acesso fica assim: # arm-none-linux-gnueabi-<APLICATIVO>
Exemplo:

# arm-none-linux-gnueabi-gcc # arm-none-linux-gnueabi-g++

Lista de Material
Distribuio Linux: Gentoo Emulador: QEMU Compilador Cruzado Cdigo-fonte do Linux

Cdigo-fonte do Kernel

Cdigo-fonte do Kernel

Compilador Cruzado

Binrio (ARM)

Descompactando

Editando o Makefile: $ vi Makefile

# make menuconfig

# make help
Configuraes padro, para alguns tipos plataformas ARM.

Plataformas suportadas. integratorcp926 integratorcp1026 versatilepb versatileab realview

Como que eu vejo isso ? $ qemu-system-arm -M ?

Imagem do Kernel (z)Image


Revisando os passos: $ make menuconfig $ make A imagem gerada chama Image
(mas vamos usar verso compactada zImage, tambm gerada):

$ cp arch/arm/boot/zImage \ /path/to/directory/

Exemplo: init
Suponha o codigo:

#include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { printf("Ol SECOMP!\n"); sleep(999999999); }

Prvia
arm-none-linux-eabi-gcc -static hello.c -o init echo init | cpio -o -H newc | gzip > test.cpio.gz # testando no qemu qemu-system-arm -kernel zImage.integrator -initrd test.cpio.gz

O que o cpio ?
GNU cpio is a tool for creating and extracting archives, or copying files from one place to another. It handles a number of cpio formats as well as reading and writing tar files. This is the first edition of the GNU cpio documentation and is consistant with GNU cpio 2.5.

O qu importante saber? - Funcionamento semelhante ao gnu tar - um formato simples e limpo - cpio um padro

Parmetros
`newc' The new (SVR4) portable format, which supports file systems having more than 65536 i-nodes.

SVR4 System V Release 4.0 was announced on October 18, 1988 and was released in 1990. A joint project of Unix System Laboratories and Sun Microsystens, it combined technology from Release 3 as well as 4.3BSD, Xenix and SunOS. http://en.wikipedia.org/wiki/SVR4#SVR4

tar is ugly as hell and not going to be supported on the kernel side
(Al Viro, desenvolvedor do kernel)

Lista de Material
Distribuio Linux: Gentoo Emulador: QEMU Cdigo-fonte do Linux Compilador Cruzado BusyBox

Busybox
Um monte de programas num arquivo s

Download http://www.busybox.net/downloads/ make menuconfig Opes interessantes: BusyBox Settings -> Build Options -> BuildBox as a static binary (no shared libs) Edite o Makefile

Linux Initial RAM disk (initrd)


um sistema de arquivos que montando quando o sistema inicializado. Ele contm diversos drivers e executveis que permitem montar a verdadeira partio do sistema.

Nos sistemas embarcados o sistema de arquivos final.

Estrutura de diretrios
Pasta raiz

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

$ mkdir root $ mkdir root/{etc,tmp,sbin,usr,root,bin,lib}

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Contm as configuraes do sistema: Exemplo: echo root:x:0: > group echo root::0:0:root:/root:/bin/sh > passwd echo SECOMP 2007 > issue

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Comentrio: Informaes temporrias quando o sistema estiver em execuo

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Contm alguns dos executveis bsicos do sistema: mdev, ifconfig, halt, reboot, etc; Comentrio: Se o busybox for utilizado, esses comandos so apenas links simblicos.

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Contm outros aplicativos, bibliotecas do usurio, bibliotecas de terceiros, etc;

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Contm os documentos, programas, arquivos; do usurio root

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Contm alguns dos executveis bsicos do sistema: cat, chmod, chown, cp, mkdir, mknod, ping, dd, df, sh, vi, touch, rmdir, kill, etc; Aqui fica o nico executrio de verdade, o busybox, os outros programas so links simblicos para o busybox. Exemplo: cp -> busybox

/
etc/ tmp/ sbin/ usr/ root/ bin/ lib/

Bibliotecas compartilhadas do sistema.

Dentre outros, a uCLibc umas das principais bibliotecas nessa pasta.

E as pastas criadas em tempo de execuo?


Shell Script na hora que o sistema inicalizado

Arquivo: /etc/init.d/rcS

#! /bin/sh mkdir -p /proc mount -t proc proc /proc mkdir -p /sys mount -t sysfs sysfs /sys mkdir -p /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s hostname qemu

Finalizando a Imagem
cd root/ ; find . | cpio -o -H newc | gzip > root.img

O que este comando faz: 1 2 3 4 5 Entre na pasta root Busca todo mundo (recursivo) Gera o arquivo cpio no padro newc Comprime com o gzip Grava tudo isso no arquivo root.img

# qemu-system-arm -kernel zImage -initrd root.img

Optimizaes

Scripts para automatizar o processo de construo do sistema. http://www.linuxfromscratch.org/alfs/

FAQ #1
What are some key differences between the ARM port and the main x86 branch? Russell King: We have around 120 machine types, many of them quite different. It isn't possible to build one kernel for everything, although we try to allow a kernel to run on as many similar machines as possible.

Quais so algumas das principais diferenas no kernel do ARM e do x86? Russell King: Ns temos por volta de 120 tipos de mquinas, muitas delas bem diferentes. No possvel contruir um kernel nico para todas, embora ns tentemos permitir um kernel, na medida do possvel, executar em muitas dessas mquinas.

FAQ #2
Onde eu posso encontrar informaes?

Documentao do Kernel
* baixe o cdigo-fonte e acesse a pasta Documentation/

www.kernel.org www.arm.linux.org.uk

Outros Links
Em ingls: Site do projeto GNU - www.gnu.org Compilador cruzado - www.codesourcery.com BusyBox - www.busybox.org LinuxDevices - www.linuxdevices.com

Em Portugus: Linux A Bordo - www.linuxabordo.com.br

OBRIGADO! Dvidas ou Comentrios?


Tiago Maluta maluta@users.sf.net

Vous aimerez peut-être aussi