Вы находитесь на странице: 1из 3

Periféricos e Interfaces

had

Trabalho prático Nº 1
Data de inicialização do sistema

1 Objectivo
Desenvolva um módulo para o kernel 2.6.35, chamado uptime.c, que instala uma chamada ao
sistema que retorna os segundo passados desde a inicialização do sistema, e um cliente no espaço de
utilizador, bootdate.c, que efectuando essa chamada imprima a data correspondente à inicialização
do sistema, de acordo com o especificado abaixo.
O módulo será testado por um script que indicará erro no trabalho se as especificações não
forem seguidas textualmente.

2 Especificações:
2.1 Nomes dos ficheiros
Nome do ficheiro com o código fonte do módulo: uptime.c
Nome do ficheiro com o módulo compilado: uptime.ko
Nome do ficheiro com o código fonte do cliente: bootdate.c
Nome do ficheiro com o cliente compilado: bootdate
Nome do ficheiro para gerar o código (fornecido com o enunciado): Makefile
Script para inserir o módulo (fornecido com o enunciado): insert.sh
Script para teste do módulo (fornecido com o enunciado): test.sh
Comando para imprimir a data de inicialização (fornecido com o enunciado): checkBootDate.sh
Módulo para ocupar entradas não usadas na tabela de chamadas ao sistema (fornecido com o
enunciado): rndusesyscalls.ko

2.2 Módulo uptime.c


2.2.1 Licença do módulo
A licença deverá ser especificada como: GPL

2.2.2 Parâmetros do módulo


O único parâmetro do módulo é o endereço da tabela de chamadas ao sistema: syscalltbl

insmod uptimer.ko syscalltbl=0x00000000

Este parâmetro deve ter o valor por defeito 0 e permissões apenas de leitura no sistema de ficheiros
virtual /sys: 0444.

Se este parâmetro for omitido ou nulo, a rotina de inicialização do módulo não deverá permitir a sua
inserção retornando –EINVAL e imprimindo no registo do kernel: "System call table address can
not be NULL\n".

2.2.3 Inserção do módulo com o script: insert.sh


O script insert.sh dado com o enunciado facilita a inserção do módulo pois obtém o endereço da
tabela de chamadas ao sistema do ficheiro /boot/System.map-$(uname -r) e passa-o para o
parâmetro do módulo: syscalltbl.

Nota: o script deve ter permissões de execução. Para isso poderá ser usado na linha de comandos:

chmod +x insert.sh

PIN 2010-11 TP1 - 1/3


Periféricos e Interfaces
had

2.2.4 Chamada ao sistema uptime


2.2.4.1 Instalação da chamada ao sistema uptime
Enquanto o módulo estiver inserido a chamada ao sistema uptime deve estar instalada na última
entrada livre da tabela de chamadas ao sistema. O índice desta entrada (baseado em zero) deverá
poder ser consultada no sistema de ficheiros virtual sysfs com:

/sys/kernel/system_call_numbers/uptime

2.2.4.2 Implementação da chamada ao sistema uptime


Esta chamada deverá retornar ter o seguinte protótipo:

static asmlinkage int uptime(unsigned long *useradr);

e enviar para o espaço de utilizador através de useradr o número de segundos desde que o sistema
foi inicializado (arredondado para cima), que podem ser calculados com:

struct timespec tp;

ktime_get_ts (&tp);
monotonic_to_bootbased(&tp);
return tp.tv_sec + (tp.tv_nsec ? 1 : 0); //arredonda para cima

2.2.4.3 Informação publicada no sistema de ficheiros virtual procfs


Deverá ser criada uma nova entrada no sistema de ficheiros virtual procfs que quando lida com:

cat /proc/uptimeseconds

o número de segundos desde que o sistema foi inicializado deve ser calculado, da mesma forma que
na implementação da chamada ao sistema, função uptime(), e impressos na saída padrão.

2.2.4.4 Inicialização do módulo


Na inserção do módulo, a alocação de memória, quer seja explicita com kmalloc() ou implícita com
funções que criam estruturas, como por exemplo novas entradas no sistema de ficheiros virtuais
procfs e sysfs, deve ser validada. Se não houver memória disponível a inserção do módulo deverá
ser abortada (retornando um código de erro negativo), devendo ser também impressa uma
mensagem de erro correspondente no registo do kernel com printk().

2.2.4.5 Remoção do módulo


Quando o módulo for removido, com rmmod, o estado do sistema, alterado quando da inserção,
deverá ser restaurado:

1) Repor o endereço original da chamada ao sistema na tabela de chamadas.


2) Repor o valor original da entrada na tabela de páginas correspondente à página de memória
onde está armazenada a tabela de chamadas ao sistema.
3) Eliminar a entrada: /proc/uptimeseconds
4) Eliminar a entrada: /sys/kernel/system_call_numbers/uptime

2.3 Cliente bootdate.c


Com o módulo uptime.c inserido, o cliente bootdate.c deverá determinar qual o número da
chamada ao sistema uptime, lendo o ficheiro virtual:
PIN 2010-11 TP1 - 2/3
Periféricos e Interfaces
had

/sys/kernel/system_call_numbers/uptime

por exemplo com: fscanf (…, &syscallnum), efectuar a chamada ao sistema para obter o número
de segundos desde que o sistema foi inicializado:

unsigned int syscallnum;


unsigned long secsinceboot;
syscall (syscallnum, & secsinceboot);

e imprimir na saída padrão, os segundos e a data de inicialização correspondente, no formato dado


pela função ctime():

uptime seconds: 23123


boot date: Thu Oct 14 09:02:22 2010

Repare-se que para obter a data de inicialização do sistema é necessário determinar o tempo
corrente em segundos, por exemplo com time (NULL), subtrair os segundos passados desde a
inicialização (secsinceboot), e então imprimir a data de inicialização com ctime().

2.4 Teste do módulo e do cliente


O script test.sh, pode ser usado para testar parte da funcionalidade do módulo.

3 Entrega:
Até ao prazo limite deve ser entregue num ficheiro compactado todo o código fonte que responda
ao enunciado, incluindo um ficheiro Makefile para compilar o módulo:

http://www.deei.fct.ualg.pt/PIn/Entregas/

Não esquecer de indicar o turno, grupo, nome, número e curso dos autores do trabalho em TODOS
OS FICHEIROS.

4 Bibliografia
Capítulos 1, 2 e da matéria teórica de Periféricos e Interfaces e slides correspondentes.

E bibliografia indicada nesses capítulos.

PIN 2010-11 TP1 - 3/3

Вам также может понравиться