# Dados gerais

Estudo de caso baseado em um driver de dispositivo que conta quantas vezes um processo tenta utilizar um arquivo de dispositivo. Código fonte utilizado no estudo de caso está disponível em.

## Autoria

João Paulo Ozório Leandro Pereira Freitas Paulo César Ferreira Melo

## Licenciamento

GPL

## Créditos
# Objetivo e descrição

O módulo escolhido pelo grupo foi um módulo que após ser inserido na tabela de processos do linux (diretório /proc), conta o número de vezes que algum processo ou arquivo tenta abrir o arquivo de dispositivo (driver). O driver colocará no arquivo o número de vezes que esse arquivo foi lido.
Debug usando Sistema de Arquivos /proc:
O /proc é basicamente um sistema de arquivos. Este diretório virtual é mantido pelo kernel e disponibiliza uma grande quantidade de informações com relação aos processos que estão rodando. Embora seja virtual e não represente nenhum dispositivo físico, ele pode ser montado e desmontado , e a cada vez que o seu Linux é reiniciado, um novo /proc é criado.
Dito de outra forma, os "arquivos" que você vê sob / proc não são realmente "arquivos", em vez disso, os seus conteúdos são tipicamente gerados dinamicamente sempre que você acessá-los. Logo, fica fácil debugar os módulos visto que o arquivo não é real, seu "conteúdo" é gerado por um código que implementa esse arquivo que é acessado (No caso do nosso módulo, gera-se o número de vezes que o arquivo foi lido), e por questões de fácil acesso: a qualquer momento, podemos listar os processos do \proc e examiná-los.
O que fizemos foi:
Criar um proc. ou seja, declarar: proc_create(DEVICE_NAME, 0, NULL, &fops). Tal declaração cria o arquivo proc com o nome de "chardev", o argumento "0" representa a permissão de arquivo padrão de 0444, o "NULL" significa que o arquivo deve ser criado sob o diretório /proc e o argumento final indica a estrutura de operações necessárias para associar o arquivo. Em outras palavras, a criação de arquivos proc e sua associação com a chamada a rotinas de entrada e saida é feito em uma única chamada.
Remover o arquivo proc: remove_proc_entry(DEVICE_NAME, NULL). No nosso caso, remove o arquivo /proc/chardev.

# Procedimentos para testes

Para executar o programa siga os passos à seguir:
* Compile o código utilizando o comando make
* Insira o módulo no sistema
* Crie um dispositivo no diretório /dev com o comando mknod /dev/chardev c 251 0
* Agora tente ler o arquivo deste dispositivo com o comando cat /dev/chardev, ou escrever algo nele echo "aaa" > /dev/chardev
Entradas de debug foram adicionadas em /proc/chardev
Tentativas:
Tentar criar uma rotina: (int *chardev_show(struct seq_file *m, void *v)) para imprimir na saída padrão quando nosso arquivo fosse listado através de uma chamada, exemplo: cat /proc/chardev, usando a chamada ao método: seq_printf(struct seq_file *, "%d\n", HZ). Onde HZ é a taxa de frequencia do timer. .
Usar a chamada ao método single_open(struct file *file,int *chardev_show ,void *data), a qual é uma interface que mostra como resultado no arquivo virtual o produzido pela função chardev_show.
Obs.: Código fonte do Makefile que deve ser utilizado

# Considerações finais

Inicialmente, aprendemos o funcionamento do módulo hello.c, o qual apenas mostrava na tela uma mensagem de boas vindas quando era iniciado e uma mensagem de despedida quando era finalizado. Após isso, veio a escolha pelo módulo "chardev" e o entendimento de seu funcionamento e os possíveis melhoramentos a serem realizados no código. A escolha do /proc como debug veio do fato do dinamismo ao acesso, visto que como este sempre gera novos resultados ao compilar módulos, poderíamos testar a persistência do nosso driver.

# Referências

[1] Linux Device Drivers, Third Edition: http://lwn.net/Kernel/LDD3/ [2] Linux.com: http://www.linux.com/learn/linux-training/39972-kernel-debugging-with-proc-qsequenceq-files-part-2-of-3 [3] The Linux Kernel Module Programming Guide: http://tldp.org/LDP/lkmpg/2.6/html/index.html