Introdução aos Sistemas Operacionais/Exemplo de técnica de Debug: Título 1
Dados gerais
[editar | editar código-fonte]Autoria
[editar | editar código-fonte]Adalberto R. Sampaio Junior; Everton L. Aleixo; Pedro Henrique Pires;
Licenciamento
[editar | editar código-fonte]GNU-GPL
Créditos
[editar | editar código-fonte]Objetivo e descrição
[editar | editar código-fonte]Este trabalho irá demonstrar algumas formas de debug apresentadas no capitulo 4 do livro Linux Device Drivers 3 (LDD3).
Proc
O diretório /proc é um exemplo do que é conhecido como um "pseudo" sistema de arquivos no Linux, algo que não é realmente um sistema em que não ocupam nenhum espaço no disco.
Os arquivos no diretório /proc atuam como interfaces para estruturas de dados internas do kernel, por exemplo que o acesso a entradas no / proc magicamente acessa o conteúdo de base no espaço do kernel. 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.
O /proc foi originalmete desenvolvido para fornecer informações sobre os processo em um sistema. Mas, dada a utilidade do sistema de arquivos, muitos dos elementos do kernel o usá tanto para fornecer informações e para permitir a configuração de execução dinâmica.
Este sistema de arquivos contém diretórios (como uma forma de organização da informação) e arquivos virtuais. Um arquivo virtual pode apresentar a informação do kernel para o usuário também servir como meio de enviar informações do usuário para o kernel.
Arquivo de Sequencia
Tecnicamente, um arquivo "proc" nada mais é que o arquivo que você pode ver sob o diretório / proc - ele tem um nome, e é um proprietário de grupo, um tamanho (tipicamente) zero e algumas permissões que ditam quais as operações são permitidas executar sobre ele.
Um arquivo proc por si só não faz absolutamente nada. É necessário implementar funções de ler e / ou escrever, que define como ler ou escrever neste arquivo. Um arquivo de seqüência é simplesmente uma das possíveis implementações você pode usar para definir as operações. Então o que há de tão especial sobre um arquivo de seqüência?
As implementações antigas e atuais de arquivos proc tem uma limitação estranha de não serem capaz de "imprimir" mais do que uma única página de saída (a página que está sendo definido pela definição da macro PAGE_SIZE kernel). Seqüência de arquivos resolve este problema, gerando a "saída" de um arquivo proc como uma seqüência de gravações, cada uma das quais pode ser até uma página de tamanho, sem nenhum limite no número de gravações.
Para enfatizar a diferença entre os arquivos proc e os arquivos de seqüência, dois pontos importantes:
Você pode criar arquivos proc que não usam a implementação subjacente seq_file e você pode criar arquivos com base na aplicação seq_file em outros lugares do que em /proc.
>>> exemplo jif.c
O ponteiro do tipo proc_dir_entry (definido no arquivo de cabeçalho do kernel include / linux / proc_fs.h, se você estiver interessado) é usado para rastrear o arquivo proc que é criado.
A sua rotina "show" (no nosso caso, jif_show ()) é o que define o que é exibido quando alguém lista o proc. Essa rotina leva sempre os mesmos dois tipos de argumento, mas, em casos simples como o nosso, você pode ignorar o segundo argumento. - Ela só é relevante quando você está realmente "seqüenciamento" através da saída.
Em resumo, você pode definir qualquer saída que você deseja imprimir com base em todas as rotinas do kernel ou estruturas de dados que você pode pensar, mas tenha em mente que, se este é um módulo carregável, você terá acesso apenas ao que os dados do kernel que são " exportados. "
O fato de que este é um arquivo de seqüência trivial que nem sequer precisa de seqüenciamento é representado pelo uso do "single_" variação das operações.
As rotinas de entrada e de saída devem ser razoavelmente auto-explicativas. A rotina de entrada do módulo cria o arquivo proc com o nome de "jif", o "0" argumento representa a permissão de arquivo padrão de 0444, o "NULL" significa que o arquivo deve ser criado diretamente sob o diretório proc / e o argumento final identifica o arquivo de estrutura de operações para associar o arquivo. Em outras palavras, a criação de arquivos proc e sua associação com a sua abertura e rotinas de I / O é feito em uma única chamada.
A rotina de saída é muito mais simples - ele simplesmente apaga o arquivo pelo nome.
//outros exemplos hz.c // fortune.c
Código-fonte
[editar | editar código-fonte]Procedimentos para testes
[editar | editar código-fonte][jif.c]
Jiffy : um intante, que é a duração de um tick do timer do sistema de interrupção. Não é uma unidade de tempo absoluto, sua duração depende da frequencia do clock de interrupção da platarforma de hardware especifica(ver modulo hz)
para carregar insmod jif.ko
para debugar cat /proc/jif
a cada execução do debug o valor irá mudar.
[hz.c]
Modulo que informa a taxa de calculo
carregue o modulo insmod hz.ko
para debugar cat /proc/hz
ou
dmesg | tail
[fortune.c]
Esse modulo simula de maneira muito simples um pote de biscoito da sorte. Para cada mensagem adicionada no /proc/fortune ao dar um cat /proc/fortune o modulo pega apenas uma mensagem e imprime na tela.
Esse modulo é um exemplo de como usar o sistema de arquivos virtual /proc para pegar mensagens do kernel para debug.
para testar esse modulo
echo "sua mensagem aqui" > /proc/fortune (faça isso para varias mensagens)
cat /proc/fortune
Considerações finais
[editar | editar código-fonte]O virtual /proc é amplamente usado para relatar informações do kernel e também para a configuração dinâmica.
Referências
[editar | editar código-fonte]Linux Device Driver 3rd Edition linux.com