Compilando o MINIX 3 para a Beaglebone Black
- por Sergio Prado
O MINIX tem uma longa história. Criado em 1987 por Andrew S. Tanenbaum quando ele publicou o livro Operating Systems: Design and Implementation, sua primeira versão foi voltada para o ensino e se tornou bastante popular. Tão popular que Linus Torvalds utilizou o MINIX e seus conceitos como base para desenvolver o Linux.
Uma segunda versão do MINIX foi lançada em 1997, mas ainda voltada ao ensino de sistemas operacionais. Foi só na terceira versão, lançada em 2006, que o foco do projeto mudou, de forma que o MINIX fosse também utilizado em aplicações comerciais, principalmente em sistemas embarcados. Esta versão ficou conhecida como MINIX 3. Algum tempo depois, ele recebeu suporte para plataformas ARM Cortex-A8, incluindo na lista de placas suportadas a Beagleboard-xM e a Beaglebone Black.
Diferentemente do Linux, que é um kernel monolítico, o MINIX é um microkernel. Isso significa que os diversos componentes do sistema operacional, incluindo drivers de dispositivo e pilhas de protocolo, são processos separados rodando em espaço de usuário e se comunicando através de um mecanismo de IPC. Apenas o núcleo do sistema operacional roda em espaço de kernel.
Isso torna o MINIX extremamente seguro, confiável e tolerante à falhas. Enquanto que um bug em um driver pode travar o Linux, no caso do MINIX basta matar o processo do driver e reiniciá-lo. Por outro lado, existe uma carga grande de comunicação entre processos em um microkernel, e por este motivo ele não escala muito bem em sistemas mais complexos.
Existe uma conversa bem interessante entre o Linus e o Tanenbaum sobre as diferenças entre um microkernel e um kernel monolĩtico que vale a pena ler.
O núcleo do MINIX 3 tem em torno de 12.000 linhas de código, e diferentemente do Linux, todo o código fonte do sistema operacional (kernel, bibliotecas e aplicações) é distribuído em um único repositório.
O código-fonte pode ser baixado com os comandos abaixo:
$ mkdir -p $HOME/minix && cd $HOME/minix $ git clone git://git.minix3.org/minix src $ cd src/ $ ls bin docs gnu LICENSE releasetools tests build.sh etc include Makefile sbin tools common external lib Makefile.inc share usr.bin distrib games libexec minix sys usr.sbin |
Antes de compilar, é necessário criar um arquivo chamado .settings com as configurações da plataforma que se deseja compilar. Os comandos abaixo criam este arquivo para a Beaglebone Black:
$ echo "U_BOOT_BIN_DIR=build/am335x_evm/" > .settings $ echo "CONSOLE=tty00" >> .settings |
Agora é só iniciar a compilação:
$ ./releasetools/arm_sdimage.sh |
O processo de compilação é rápido, e irá gerar uma imagem pronta para ser gravada no cartão SD:
$ ls -la minix_arm_sd.img -rw-rw-r-- 1 sprado sprado 2147483648 Jan 31 15:56 minix_arm_sd.img |
Depois é só usar o comando dd para gravar a imagem no cartão SD (substitua /dev/sdX no comando abaixo pelo nome do arquivo de dispositivo do cartão SD):
$ sudo dd if=minix_arm_sd.img of=/dev/sdX bs=1M && sync |
Então é só ligar a BBB e acessar a linha de comandos do terminal pela console serial. O usuário padrão é root e não tem senha.
## Starting application at 0x80200000 ... MINIX 3.3.0. Copyright 2014, Vrije Universiteit, Amsterdam, The Netherlands MINIX is open source software, see http://www.minix3.org Started VFS: 9 worker thread(s) Starting the mmc driver mmc_block(info)Initializing the MMC block device mmc_host_mmchs(info)Using instance number 0 mmc_block(info)System event framework fresh start Root device name is /dev/c0d0p1 mmc_host_mmchs(info)Enabling high speed mode /dev/c0d0p1: clean mmc_host_mmchs(info)Enabling high speed mode mmc_host_mmchs(info)Enabling high speed mode /dev/c0d0p1 is mounted on / none is mounted on /proc /dev/c0d0p2: clean /dev/c0d0p3: clean size on /dev/imgrd set to 0kB Multiuser startup in progress ... Starting hotplugging infrastructure... done. Starting services: random inet pty uds ipc log. Starting daemons: update cron syslogd. Starting i2c subsystem: i2c i2c i2c. Running on a BeagleBone Black Starting i2c device drivers: cat24c256 tps65217 tda19988Starting USBD USBD: Starting USBD USBD: Built: Jan 31 2015 15:55:15 USBD: Initializing usbdUSBD: Using AM335x driver USBD: MUSB revision (REVREG): 0x4EA2080D . Starting networking: nonamed. Local packages (start): done. Minix/arm (10.0.0.1) (console) login: |
Esta é a listagem de todos os processos em execução. Veja como cada componente do sistema operacional roda em um processo separado. Os processos com PID negativo são os únicos que estão rodando em espaço de kernel. Todo o restante dos processos rodam em espaço de usuário, e se comunicam com o kernel e com os outros processos através de um mecanismo de IPC (veja por exemplo o processo com PID 147, correspondente ao driver da E2PROM CAT24c256):
10.0.0.1# ps aeflx ST UID PID PPID PGRP SZ RECV TTY TIME CMD W 0 (-5) 0 0 0 ? 0:00 asyncm W 0 (-4) 0 0 0 ? 0:00 idle W 0 (-3) 0 0 0 ? 0:00 clock W 0 (-2) 0 0 0 ? 0:00 system W 0 (-1) 0 0 0 ? 0:00 kernel W 0 5 4 0 608 ANY ? 0:00 pm W 0 7 4 0 1224 ANY ? 0:04 vfs W 0 4 1 0 1020 ANY ? 0:00 rs W 0 8 4 0 128 ANY ? 0:00 memory W 0 6 4 0 60 ANY ? 0:00 sched W 0 9 4 0 460 ANY ? 0:00 tty W 0 3 4 0 432 ANY ? 0:00 ds W 0 11 4 0 9552 ANY ? 0:02 vm W 0 12 4 0 160 ANY ? 0:00 pfs S 0 1 0 1 432 (wait) pm ? 0:00 init W 12 17 4 0 160 ANY ? 1:00 /service/mmc R 0 19 4 0 1512 ? 0:00 /service/procfs W 12 28 4 0 7752 ANY ? 0:01 /service/mfs /dev/c0d0p1 / W 0 37 4 0 1480 tty ? 0:00 /service/is W 0 40 4 0 72 ANY ? 0:00 /service/readclock.drv W 12 51 4 0 24840 ANY ? 0:02 /service/mfs /dev/c0d0p2 /usr -o rw W 12 54 4 0 348 ANY ? 0:00 /service/mfs /dev/c0d0p3 /home -o rw W 0 57 4 0 276 ANY ? 0:00 /service/devman (null) /sys -o rw,rslabel=devman W 12 96 4 0 140 ANY ? 0:00 /service/random W 12 105 4 0 1156 ANY ? 0:00 /service/inet W 12 109 4 0 216 ANY ? 0:00 /service/pty W 0 113 4 0 556 ANY ? 0:00 /service/uds W 0 117 4 0 172 ANY ? 0:00 /service/ipc W 12 121 4 0 160 ANY ? 0:00 /service/log W 12 134 4 0 212 ANY ? 0:04 /service/i2c instance=1 W 12 138 4 0 212 ANY ? 0:00 /service/i2c instance=2 W 12 142 4 0 212 ANY ? 0:04 /service/i2c instance=3 W 12 147 4 0 132 ANY ? 0:00 /service/cat24c256 bus=1 address=0x50 W 0 151 4 0 64 ANY ? 0:00 /service/tps65217 bus=1 address=0x24 W 12 155 4 0 136 ANY ? 0:00 /service/tda19988 cec_bus=1 cec_address=0x34 hdmi_bus=1 hdmi_address=0x70 W 12 159 4 0 228 ANY ? 0:00 /service/usbd S 0 85 1 13 188 (select) vfs ? 0:04 devmand -d /etc/devmand -d /usr/pkg/etc/devmand S 0 124 1 13 68 (select) vfs ? 0:00 update S 0 126 1 13 312 (sigsusp) pm ? 0:00 cron S 0 132 1 132 304 (select) vfs ? 0:02 syslogd S 0 167 1 13 232 (select) vfs ? 0:00 nonamed -L S 0 172 1 172 536 (wait) pm co 0:00 -sh S 0 173 1 1 376 (select) vfs ? 0:00 /usr/libexec/getty default ttyc1 S 0 174 1 1 376 (select) vfs ? 0:00 /usr/libexec/getty default ttyc2 S 0 175 1 1 376 (select) vfs ? 0:00 /usr/libexec/getty default ttyc3 W 0 266 172 172 264 vfs co 0:00 ps aeflx |
Todas as informações sobre o MINIX 3, incluindo tutoriais, guias de usuário e documentação, estão disponíveis no site do projeto.
Divirta-se!
Sergio Prado
Sem Comentários
Nenhum comentário até agora... é a sua chance de ser o primeiro a comentar!