Instituto de Computação - UNICAMP

MC504/MC514 - Sistemas Operacionais

Implementação de um Null Driver

Islene Calciolari Garcia

Ambiente de testes

QEMU

O QEMU é um virtualizador e emulador de processadores. Podemos fazer um teste bem simples com o QEMU utilizando a imagem disponível em Testing QEMU .
  qemu-system-i386 -hda linux-0.2.img

Teste com o kernel 3.14.4

Atenção: como estes arquivos são muito grandes, deveremos fazer nossos testes no /tmp das máquinas do laboratório.
  1. Precisaremos do arquivo mc504-linux.tar.xz. Se estivermos na rede do IC-03 podemos executar o seguinte comando:
    $  cp /home/staff/islene/public_html/mc504-linux.tar.xz .
    
  2. Após obtermos o arquivo, devemos executar:
    $ tar xJvf mc504-linux.tar.xz
    
    Surgirá um diretório contendo a versão 3.14.4 do kernel Linux compilada com o arquivo de configuração config-3.14.4 e uma imagem mc504.img que foi criada por Glauber de Oliveira Costa para a turma do 1s2008 de sistemas operacionais.

  3. Teste o kernel com a imagem utilizando o QEMU:
      qemu-system-i386 -hda mc504.img -kernel linux-3.14.4/arch/i386/boot/bzImage -append "ro root=/dev/hda" 
    

  4. Quando o sistema entrar poderemos fazer login com
        usuário: root
        senha:   root
      
Problemas com o teclado no ambiente do QEMU? Tente o seguinte:

Teste de drivers

Antes de implementar os nossos drivers, vamos testar os exemplos disponibilizados na série Linux Device Drivers do site Open Source forU. No arquivo ofd.tar.xz você encontrará um diretório ofd com arquivos retirados do site citado e um Makefile simplificado.

Devemos mover o diretório ofd para linux-3.14.4/drivers e alterar o Makefile do diretório drivers acrescentando a linha

obj-y += ofd/
A seguir, você deverá deverá executar make no diretório linux-3.14.4 que é a raiz dos fontes do kernel. Se estiver rodando nas máquinas do IC, para não ter problemas com a quota, configure o diretório CCACHE utilizando o comando abaixo antes do make:
 $ export CCACHE_DIR="/tmp/.ccache"export CCACHE_DIR="/tmp/.ccache"  
 $ make -j 5 ARCH=i386

Precisaremos incluir os arquivos .ko no ambiente do QEMU. Para isso, criaremos um novo sistema de arquivos ext2 com os seguintes comandos:

 $ dd if=/dev/zero of=drivers.img bs=4k count=20
 $ mkfs.ext2 drivers.img
Depois, vamos copiar os arquivos .ko na imagem drivers.img com o debugfs.
 $ debugfs -w drivers.img
   debugfs: write linux-3.14.4/drivers/ofd/ofd.ko ofd.ko
   debugfs: write linux-3.14.4/drivers/ofd/ofcd.ko ofcd.ko
   debugfs: write linux-3.14.4/drivers/ofd/ofcd-null.ko ofcd-null.ko
No próximo teste com o QEMU, teremos de acrescentar esta imagem como um novo disco:
  qemu-system-i386 -hda mc504.img -kernel linux-3.14.4/arch/i386/boot/bzImage -append "ro root=/dev/hda" -hdb drivers.img
No QEMU, a imagem drivers.img deverá ser montada com o seguinte comando:
$ mkdir drivers
$ mount -t ext2 /dev/hdb drivers/

ofd: primeiro driver

Neste teste, o driver tem apenas as função init e exit. Vocé pode testar se o driver foi incluído dinamicamente. No QEMU, execute os comandos
  $ insmod drivers/ofd.ko
  $ lsmod
   ...
  $ rmmod drivers/ofd.ko
  $ dmesg | grep ofd

ofcd: primeiro driver de caracteres

Os drivers são identificados por números major e um minor. O driver ofcd requisita dinamicamente um número major para o sistema e reserva três números minors. Você pode conferir isso com os comandos:
  $ insmod drivers/ofcd.ko
  $ lsmod
   ...
  $ dmesg | tail
  $ cat /proc/devices
   ...
   252 ofcd
É possível criar as entradas em /dev explicitamente:
  $ mknod /dev/ofcd0 c 252 0
  $ mknod /dev/ofcd1 c 252 1
  $ mknod /dev/ofcd2 c 252 2
  $ ls /dev
No entanto, ainda não conseguimos utilizar estes arquivos.
  $ cat /dev/ofcd0

ofcd-null

O arquivo ofcd-null.c tem o código que permitirá estas operações, com a instalação automática do arquivo em /dev.
  $ insmod drivers/ofcd-null.ko
  $ ls /dev/
  $ cat /dev/ofcd-null
  $ echo "teste" > /dev/ofcd-null

Fazendo alterações

Em Decoding Character Device File Operations, o autor ensina como manter o último caractere escrito. Como você faria para manter o buffer completo da última escrita?

Ao alterar um dos drivers, vocé deve reexecutar make no diretório linux-3.14.4.