Compilando o MINIX 3 para a Beaglebone Black

- por Sergio Prado

Categorias: Beaglebone Black, Unix Tags: ,

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.

MINIX_3_logo

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!

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.