UNIVERSIDADE DO ALGARVE
FACULDADE DE CIÊNCIAS E TECNOLOGIA
Departamento de Engenharia Electrónica e Informática
Relatório da disciplina:
Periféricos e Interfaces
2º semestre 2006 / 7
Helder Aniceto Amadeu de Sousa Daniel
Faro
Agosto de 2007
Periféricos e Interfaces 2006 / 7
1
Periféricos e Interfaces 2006 / 7
2
Índice
1
2
3
4
5
Introdução.....................................................................................................................................1
Objectivos e conteúdo ..................................................................................................................1
Requisitos recomendados.............................................................................................................1
Programa ......................................................................................................................................1
Bibliografia recomendada ............................................................................................................2
5.1
Sobre device drivers e módulos para linux: .........................................................................2
5.2
Sobre a camada de entrada saída do Sistema Operativo: .....................................................2
5.3
Sobre hardware e programação de baixo nível: ...................................................................2
5.4
Outras fontes de informação complementares sobre programação de sistemas: .................2
5.5
Apoio online à disciplina......................................................................................................3
6
Avaliação......................................................................................................................................3
6.1
Épocas de avaliação e procedimento....................................................................................3
6.2
Admissão a exame................................................................................................................3
6.3
Aprovação na disciplina .......................................................................................................3
7
Calendarização .............................................................................................................................4
7.1
Teórica..................................................................................................................................4
7.2
Prática...................................................................................................................................5
8
Assiduidade ..................................................................................................................................6
8.1
Teóricas ................................................................................................................................6
8.2
Práticas .................................................................................................................................7
9
Avaliação......................................................................................................................................7
Enunciados dos momentos de avaliação ..............................................................................................9
Periféricos e Interfaces 2006 / 7
i
Periféricos e Interfaces 2006 / 7
ii
1 Introdução
Neste relatório encontra-se definido o conteúdo, objectivos, requisitos, programa, bibliografia,
métodos de avaliação da disciplina Periféricos e Interfaces, bem como uma análise da assiduidade e
aprovação no ano lectivo de 2006 / 7.
Esta disciplina consta do plano curricular dos cursos de Licenciatura em Informática e Licenciatura
em Ensino de Informática, leccionados no Departamento de Engenharia Electrónica e Informática
da Faculdade de Ciências e Tecnologia da Universidade do Algarve.
No plano curricular das licenciaturas acima referidas, esta disciplina insere-se no 2º semestre do 2º
ano e correspondem-lhe 3 créditos, 7 ECTS.
Esta disciplina aprofunda a matéria introduzida na disciplina de Sistemas Operativos sobre a
programação de entrada-saída (E/S) num sistema operativo.
2 Objectivos e conteúdo
A disciplina Periféricos e Interfaces tem por objectivo ministrar os princípios de funcionamento dos
periféricos padrão em computadores pessoais (PCs) bem como o interface destes com o PC, tal
como teclado, rato, vídeo, dispositivos de armazenamento magnéticos e ópticos, interface IDE e
SCSI, barramentos ISA, PCI, USB e CAN.
É estudada a operação dos periféricos quando controlados por um sistema operativo de 32/64 bits,
de modo que é aprofundado o modelo de E/S e a operação da camada de E/S do sistema operativo
Linux, introduzida previamente em Sistemas Operativos.
Além do estudo da operação e construção dos periféricos mais comuns de um PC, bem como dos
seus controladores, é objectivo desta disciplina que os alunos desenvolvam device drivers e rotinas
de tratamento de interrupções para esses periféricos.
3 Requisitos recomendados
Embora não seja obrigatório, é recomendado a quem frequente esta disciplina os seguintes
requisitos:
•
•
•
•
Conhecimentos de organização e implementação de Sistemas Operativos, nomeadamente
Linux.
Conhecimentos de arquitectura de computadores, nomeadamente PCs
Domínio dos conceitos da programação estruturada em ANSI C
Domínio da implementação e utilização de estruturas de dados
4 Programa
Seguidamente apresenta-se o programa semestral, conforme apresentado nas aulas teóricas:
1. Conceitos elementares
1.1. Periférico, interface e device driver (exemplos de periféricos)
1.2. A camada de entrada saída de um sistema operativo
1.3. Modelo de E/S em Linux (Chamadas ao sistema, interrupções de hardware e DMA)
1.4. Acesso a portos e memória de E/S em Linux no espaço do utilizador e no núcleo
2. Introdução aos módulos do núcleo (Linux)
Periféricos e Interfaces 2006 / 7
1
3. Introdução aos dispositivos de caracter (Linux)
3.1. O teclado e o rato
3.2. RTC/CMOS
3.3. Drivers para dispositivo de carácter: RTC
3.4. IOCTL
4. Introdução aos dispositivos de bloco (Linux)
4.1. Discos magnéticos (formatação, estrutura lógica, leitura/escrita)
4.2. Discos ópticos (estrutura, leitura/escrita)
4.3. IOCTL para dispositivos de bloco em Linux
4.4. Drivers para dispositivo de bloco: RAMDISK
4.5. O interface IDE e SCSI
5. Barramentos
5.1. ISA/EISA
5.2. PCI
5.3. USB
5.4. Comunicação série e paralelo
6. Rotinas de tratamento de interrupções
6.1. Interrupções rápidas e lentas
6.2. Top e Bottom halves
6.3. Interrupções partilhadas
6.4. Interrupções do RTC
7. Sub-sistema de vídeo
5
Bibliografia recomendada
5.1 Sobre device drivers e módulos para linux:
Corbet, Jonathan, Alessandro Rubini e Kroah-Hartman, Greg (2005). “Linux Device Drivers 3rd
edition”, O’Reilly, http://lwn.net/Kernel/LDD3/
Salzman, Peter Jay, Michael Burian and Ori Pomerantz (2005). “The Linux Kernel Module
Programming Guide”, http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf
5.2 Sobre a camada de entrada saída do Sistema Operativo:
Tanenbaum, Andrew S. (2001). "Modern Operating Systems. 2nd Edition", Prentice Hall
Silberschatz, Avi, Peter Baer Galvin and Greg Gagne (2004). "Operating System Concepts. 7th
Edition", John Wiley & Sons
5.3 Sobre hardware e programação de baixo nível:
Messmer, Hans-Peter (2002). “The Indispensable PC Hardware Book 4th edition”, Addison-Wesley
Gilluwe, Frank van (1997). “The Undocumented PC - A Programmer's Guide to I/O, CPU's and
Fixed Memory Areas 2nd edition”, Addison-Wesley
5.4 Outras fontes de informação complementares sobre programação de sistemas:
Tanenbaum, Andrew S. e Albert S. WoodHull (2006). “Operating Systems Design and
Implementation 3rd edition”, Prentice-Hall.
Tanenbau, Andrew S. (2006). "Structured Computer Organization, 5th Edition", Prentice Hall.
Karbo, Michael (2005). “PC Architecture”, http://www.karbosguide.com
Periféricos e Interfaces 2006 / 7
2
Tischer, Michael e Bruno Jennrich, (1996). “PC Intern - The Encyclopedia of System Programming
6th edition”, Abacus
Wilton, Richard (1994). "Programmer's Guide to PC Video Systems", Microsoft Press
Norton, Peter, Peter Aitken e Richard Wilton, (1993), “PC Programmer´s Bible”, Microsoft Press
5.5 Apoio online à disciplina
A partir da página da disciplina, em http:/w3.ualg.pt/~hdaniel/pin, de entre outros elementos de
apoio à disciplina, encontra disponível:
•
•
•
•
6
Conteúdo das aulas teóricas
Fichas para avaliação prática
Enunciados de exames e soluções
Sistema de entrega de automático de trabalhos práticos
Avaliação
6.1 Épocas de avaliação e procedimento
A avaliação é efectuada em duas épocas:
•
•
Normal
Recurso
A avaliação nestas épocas resulta da média ponderada do exame e dos trabalhos práticos:
Avaliação = 60% Exame + 40 % Trabalhos práticos
ou por opção do aluno apenas da avaliação em exame:
Avaliação = 100% Exame
6.2 Admissão a exame
Todos os alunos regularmente inscritos são admitidos aos exames.
Os exames consistem de prova escrita, sem consulta, podendo incluir questões sobre conhecimentos
necessários à realização do trabalho prático.
Poderá ser usada como consulta para os exames 30 páginas A4, com o conteúdo a descrição.
6.3 Aprovação na disciplina
Serão aprovados na disciplina alunos com nota igual ou superior a 10 valores, em qualquer das
épocas.
Periféricos e Interfaces 2006 / 7
3
7 Calendarização
A disciplina é composta por uma componente teórica semanal de 2 horas e uma componente prática
semanal de 3 horas. A componente teórica divide-se em dois períodos não consecutivos de 1 hora.
7.1 Teórica
A exposição da matéria teórica, segundo o programa apresentado no ponto 4, foi calendarizada para
25 aulas teóricas, com duração aproximada de 50 minutos cada, leccionadas durante 14 semanas, de
12 de Fevereiro de 2007 a 8 de Junho de 2007:
Semana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Segunda
Inicio
12-Fev-07
19-Fev-07
26-Fev-07
05-Mar-07
12-Mar-07
19-Mar-07
26-Mar-07
02-Abr-07
09-Abr-07
16-Abr-07
23-Abr-07
30-Abr-07
07-Mai-07
14-Mai-07
21-Mai-07
28-Mai-07
04-Jun-07
Sexta
Fim
16-Fev-07
23-Fev-07
02-Mar-07
09-Mar-07
16-Mar-07
23-Mar-07
30-Mar-07
06-Abr-07
13-Abr-07
20-Abr-07
27-Abr-07
04-Mai-07
11-Mai-07
18-Mai-07
25-Mai-07
01-Jun-07
08-Jun-07
T1
Seg
Qua
1
2
Carnaval
3
4
5
6
7
8
9
10
11
12
Páscoa
13
Páscoa
14
15
16
FER
17
18
Semana académica
19
20
21
22
23
24
25
Os alunos dos cursos aos quais a disciplina foi leccionada foram agrupados num turno teórico,
referido por T1, leccionado em dois períodos de uma hora por semana, sendo atribuído o serviço
docente do seguinte modo:
T1
Helder Daniel
(professor auxiliar DEEI)
As aulas foram leccionadas segundo a calendarização acima apresentada e o seu conteúdo encontrase descriminado abaixo:
1. Apresentação.
2. "Conceitos elementares: Periférico, interface, driver BIOS; Camada de E/S do SO"
3. Chamadas ao sistema. Modelo de E/S do Linux I
4. Modelo de E/S do Linux II: Portos e memória de E/S
5. Programação de transferências de dados; Módulos do Núcleo Linux I
6. Módulos do Núcleo Linux II
7. Dispositivos de carácter: Teclado
8. Dispositivos de carácter: o rato, RTC/CMOS
9. Dispositivos de carácter: RTC/CMOS (conclusão)
10. Drivers para dispositivos de carácter: números dispositivo e registo do driver
11. Drivers para dispositivos de carácter: transferências de dados com o espaço de utilizador I
12. Drivers para dispositivos de carácter: transferências de dados com o espaço de utilizador II
13. RTC driver
Periféricos e Interfaces 2006 / 7
4
14. RTC driver + IOCTL
15. Dispositivos de bloco: Discos Magnéticos I
16. Dispositivos de bloco: Discos Magnéticos II; Discos Ópticos
17. Dispositivos de bloco III: IDE
18. Dispositivos de bloco IV: SCSI
19. Drivers para dispositivos de blocos: Ramdsk
20. Barramentos I: CAN, ISA/EISA, PCI parte 1
21. Barramentos II: PCI parte 2, USB; Interrupções I
22. Interrupções II
23. Interrupções III; VGA I
24. VGA II
25. VGA III
7.2 Prática
Nas aulas práticas foram resolvidos exercícios sobre os temas apresentados nas aulas teóricas,
distribuídos por 10 fichas, resolvidas ao longo de 12 semanas de 26 de Fevereiro de 2007 a 8 de
Junho de 2007. Na primeira semana não foram efectuadas aulas práticas por não ter sido leccionada
matéria teórica.:
Semana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Segunda
Sexta
Inicio
Fim
12-Fev-07
19-Fev-07
26-Fev-07
05-Mar-07
12-Mar-07
19-Mar-07
26-Mar-07
02-Abr-07
09-Abr-07
16-Abr-07
23-Abr-07
30-Abr-07
07-Mai-07
14-Mai-07
21-Mai-07
28-Mai-07
04-Jun-07
16-Fev-07
23-Fev-07
02-Mar-07
09-Mar-07
16-Mar-07
23-Mar-07
30-Mar-07
06-Abr-07
13-Abr-07
20-Abr-07
27-Abr-07
04-Mai-07
11-Mai-07
18-Mai-07
25-Mai-07
01-Jun-07
08-Jun-07
Fichas
Ter
Qua
P1
P2
Não se efectuam
aulas práticas
Carnaval
1
1
2
2
3
3
4
4
4
4
Páscoa
5
5
5
5
6
Fer
6
Fer
Semana académica
7
7
8
8
9
9
9 / 10
9 / 10
Os alunos dos cursos aos quais a cadeira é leccionada foram divididos em 2 turnos, P1 e P2, sendo
distribuído o serviço docente do seguinte modo:
P1
P2
Helder Daniel (professor auxiliar DEEI)
Helder Daniel (professor auxiliar DEEI)
As fichas foram resolvidas nas aulas conforme mostra a calendarização acima e o tema de cada uma
apresenta-se a seguir:
1. Apresentação do ambiente de trabalho; Exercícios introdutórios
2. Chamadas ao sistema. Portos e memória de E/S
3. Módulos do kernel Linux
Periféricos e Interfaces 2006 / 7
5
4. Dispositivos de caracter: teclado, rato e RTC/CMOS
5. Driver para dispositivos de carácter: números de dispositivo, registo do driver, transferência
de dados com espaço utilizador.
6. RTC driver com IOCTL
7. Dispositivos de bloco; Interface IDE
8. Interface SCSI; Drivers para dispositivos de bloco: RAMDISK
9. Interrupções
A avaliação prática consistiu na avaliação de duas das fichas práticas propostas, a ficha 2 e a 3,
escolhidas aleatoriamente entre as fichas 2 a 9, no final do semestre. Embora só duas fichas sejam
avaliadas, grupos que não entreguem todas as fichas não terão avaliação prática.
Os trabalhos práticos são realizados em grupos de 2 alunos. Em casos excepcionais admitiu-se a
formação de grupos de 1 ou 3 alunos
Os trabalhos práticos foram entregues na semana seguinte à última aula sobre a mesma ficha,
através do sistema de entregas automáticas, disponível no site da disciplina:
http://www.deei.fct.ualg.pt/PIn/Entregas/index.php
Cada dia de atraso implica uma penalização de 0.25 valores na avaliação prática.
8
Assiduidade
8.1 Teóricas
O número de alunos inscritos na disciplina, por curso, segundo os serviços académicos da UAlg,
foi:
Ensino de Informática:
32
Informática:
47
Total:
79
No gráfico seguinte apresenta-se a assiduidade à componente teórica ao longo do semestre:
alunos
18
16
14
12
10
Total
8
6
4
2
0
1
3
5
7
9
11
13 15 17 19
21 23 25
aula nº
Fig. 1 – Assiduidade às aulas teóricas
Periféricos e Interfaces 2006 / 7
6
8.2 Práticas
O numero de alunos que se inscreveram nos turnos práticos, directamente através do site da
disciplina http://www.deei.fct.ualg.pt/PIn/Entregas/register.php, foi:
P1:
P2:
Total:
13
14
27
Na seguinte figura apresenta-se o somatório da assiduidade aos dois turnos práticos ao longo do
semestre:
alunos
25
20
15
Total
10
5
0
1
2
3
4
5
6
7
8
9
10
11
aula nº
12
Fig. 2 – Assiduidade às aulas práticas
9 Avaliação
Relativamente à avaliação, em ambas as épocas normal e de recurso, está indicado no quadro
abaixo a percentagem de aprovação baseada nos alunos que se propuseram a cada época de
avaliação, e não a totalidade de inscritos segundo os serviços académicos:
EI
I
Total
6
8
14
Assiduidade ao exame época normal:
Aprovados na época normal:
% aprovação:
7
6
85,71%
10
8
80,00%
17
14
82,35%
Assiduidade ao exame recurso:
Aprovados na época de recurso:
% aprovação:
1
5
1
1
100,00% 20,00%
6
2
33,33%
Entregaram todas as fichas práticas
Total de alunos aprovados
Periféricos e Interfaces 2006 / 7
16
7
Os seguintes histogramas mostram a distribuição da avaliação para ambas as épocas de avaliação.
Nota de valor zero significa desistência no exame da época correspondente.
Distribuição da avaliação na época normal
5
4
3
2
1
0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
valores
Fig. 3 – Distribuição da avaliação na época normal
Distribuição da avaliação na época de recurso
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18 19 20
valores
Fig. 4 – Distribuição da avaliação na época de recurso
____________________________________________________
Helder Daniel
Responsável pela disciplina de Periféricos e Interfaces no ano lectivo 2006 / 7
Periféricos e Interfaces 2006 / 7
8
Enunciados dos momentos de avaliação
Exame época normal
Exame recurso
Fichas práticas
Periféricos e Interfaces 2006 / 7
9
Periféricos e Interfaces 2006 / 7
10
Universidade do Algarve
Faculdade de Ciências e Tecnologia
Departamento de Engenharia Electrónica e Informática
Periféricos e Interfaces
2006/2007
Curso de Informática e Ensino de Informática
Exame época normal
21 de Junho de 2007
Duração: 2 horas
Consulta limitada a 30 páginas A4
Deve ser indicado na folha de teste se pretende incluir na nota final da disciplina a
avaliação prática. Se nada for indicado é assumido que NÃO pretende.
1. (1v) Das seguintes expressões indique quais as que são executadas através de chamadas ao
sistema:
i)
ii)
iii)
iv)
int pid = syscall (SYS_getpid);
int t0 = time(NULL);
int t1 = syscall (SYS_time, NULL);
double x = exp(2.5);
2. (1v) Indique qual a diferença essencial entre Entrada-Saída programada e DMA.
3. Considere o código do módulo mod.c, onde é omitido apenas a inclusão de headers:
static int i, c, a[5];
module_param_array(a, int, &c, 0);
int init_module(void) {
for (i=0; i<c; ++i) printk("%d\n", a[i]);
return -1;
}
a) (0.5v) O código acima tem um erro que impede a inserção do módulo. Corrija-o.
b) (1v) O que é executado quando o módulo é inserido com: insmod mod.ko a=1,2,3 ?
c) (1v) Adicione código para que o módulo possa ser removido.
4. Considere um rato ps2 com bola:
a) (1v) Explique o mecanismo de detecção e quantificação do movimento do rato.
b) (2v) Escreva um programa que continuamente detecte se o botão esquerdo ou o direito
do rato foi pressionado, imprimindo respectivamente "ESQ" ou "DIR".
c) (0.5) Altere o código acima para impedir que ocorram interrupções durante a leitura de
um pacote de dados do rato.
5. Considere um disco rígido com 32 130 000 sectores de 512 bytes cada. Descreva como a
partir da informação no MBR pode determinar:
a) (1v) O sector inicial de uma das quatro partições primárias.
b) (1v) O número de sectores da primeira partição.
1-2
6. (1v) Explique em termos de composição da camada de gravação, porque é que num CD-R
só é possível gravar informação uma vez e num CD-RW é possível mais que uma vez.
7. (1v) Considerando o suporte genérico SCSI em Linux e assumindo que a variável cmdHdr
do tipo sg_io_hdr_t, já foi preparada com um comando SCSI de 6 bytes, escreva um
segmento de código que permita enviar esse comando para a unidade SCSI /dev/sda.
8. (1v) Quais as vantagem do barramento PCI quando comparado com o ISA original?
9. A função seguinte implementa uma rotina de atendimento da interrupção IRQ1 muito
simplificada:
irqreturn_t kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
static unsigned char scancode;
if (!(inb(0x64) & 0x01)) return IRQ_NONE;
scancode = inb(0x60);
//trata scancode
return IRQ_HANDLED;
}
a)
b)
c)
d)
e)
10.
a)
b)
11.
a)
b)
c)
(1v) Explique o código da função detalhadamente.
(0.5v) Explique a utilidade da partilha de linha de interrupção.
(0.5v) Escreva um segmento de código que permita registar a rotina de atendimento de
interrupção acima para que partilhe a linha de interrupção IRQ1.
(0.5v) Num módulo, em que função deverá estar o código da alínea c)?
(0.5v) Substitua o comentário com código para que o scancode lido do porto 60H seja
escrito no registo do sistema.
Considere o modo de texto 80x25 com 16 cores do sub-sistema de vídeo VGA:
(1v) Explique como a partir de um qualquer byte atributo, na memória de vídeo, se
obtém uma cor RGB para o carácter correspondente.
(1.5v) Desenvolva um segmento de código que escreva a string "VGA" na memória de
vídeo ou framebuffer, de modo que surja em todas as 25 linhas a partir da coluna 30,
qualquer que seja a zona da memória de vídeo que está correntemente a ser mostrada
no ecrã.
As seguintes afirmações são falsas! Explique porquê:
(0.5v) A macro inw(PORTO) permite ler um inteiro de 8 bits do porto indicado como
argumento.
(0.5v) O Major de dois periféricos diferentes tem de ser diferente.
(0.5v) No sub-sistema de vídeo VGA o endereço de início do framebuffer é A0000H,
quer num modo de texto ou num modo gráfico.
2-2
Universidade do Algarve
Faculdade de Ciências e Tecnologia
Departamento de Engenharia Electrónica e Informática
Periféricos e Interfaces
2006/2007
Curso de Informática e Ensino de Informática
Exame época recurso
18 de Julho de 2007
Duração: 2 horas
Consulta limitada a 30 páginas A4
Deve ser indicado na folha de teste se pretende incluir na nota final da disciplina a avaliação
prática. Se nada for indicado é assumido que NÃO pretende.
1. (1v) Considere a seguinte chamada ao sistema, que retorna o PID do processo corrente:
int pid = syscall (SYS_getpid);
Descreva o que sucede em termos de mecanismo de chamadas ao sistema, considerando os espaços
de utilizador e núcleo, desde que a função syscall ( ) é executada até que seja devolvido o PID do
processo.
2. (1v) Considerando que as duas linhas de código seguintes são executadas através de chamadas
ao sistema:
int t0 = time(&t0);
int t1 = syscall (SYS_time, &t1);
proponha código para a função int time(int* ).
3. (1v) Explique porque para transferências de grandes quantidades de dados, o modo DMA burst
permite transferir a informação mais rapidamente que o modo DMA cycle stealing.
4. Considere o código do módulo mod.c, onde é omitido apenas a inclusão de headers:
int init_module(void) { return 0; }
void cleanup_module(void) { }
a) (1v) Adicione código para que quando o módulo for inserido com: insmod mod.ko par=1,
seja impresso no registo do núcleo o valor do parâmetro par, que foi passado no comando
de inserção, no exemplo: 1.
b) (0.5v) Adicione código para que quando o módulo for inserido com: insmod mod.ko seja
impresso no registo do núcleo o valor por defeito do parâmetro par, que deve ser "0" (zero).
c) (0.75v) Adicione código para que quando for executado o comando modinfo mod.ko seja
também impressa a seguinte informação sobre o parâmetro par:
par: Inteiro 32 bits
d) (0.75v) Modifique o código para que a função init_module() seja descarregada da memória
após o módulo ter sido inserido.
5. (1v) Explique em termos físicos e/ou lógicos porque é que num DVD é possível gravar mais
informação que num CD.
1-2
6. Considere um módulo onde está implementado um driver que permite controlar o alarme do
relógio de tempo real, e onde a entrada de directório para acesso a este driver é: /dev/alarm.
a) (1.5v) Implemente uma função do driver que, quando inserido, ao comando cat /dev/alarm,
retorne a hora do alarme no formato HH:MM:SS.
b) (1v) Adicione código, indicando a função ou local apropriado, para que após o driver
estar inserido, se for dada na linha de comandos o comando cat /proc/misc, seja impressa
informação semelhante a:
1 psaux
70 alarm
135 rtc
7. Considere um disco rígido com 16 450 560 000 bytes, onde cada sector tem 512 bytes.
a) (1v) Considerando que cada pista tem 63 sectores e o disco tem 255 superfícies, qual o
número de cilindros?
b) (1v) Descreva como a partir da informação no MBR pode ser determinado o sector inicial e
o número de sectores da segunda partição primária.
c) (1.5v) Escreva um programa que leia o MBR do disco /dev/hda, e através da informação
neste sector determine o sector final da segunda partição primária.
8. (1v) Explique porque é que a velocidade de transferência de dados é superior num barramento
PCI, quando comparado com um ISA.
9. A função seguinte implementa uma simplificada rotina de atendimento da interrupção IRQ1:
irqreturn_t kbd_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
static unsigned char scancode;
local_irq_disable();
if (!(inb(0x64) & 0x01)) return IRQ_NONE;
scancode = inb(0x60);
local_irq_enable();
//trata scancode
return IRQ_HANDLED;
}
a) (0.5v) Explique o que sucede se o bit 0 do registo acedido pelo porto 0x64 for nulo.
b) (0.75v) Explique o que é uma interrupções rápida (fast interrupt).
c) (1v) Escreva, indicando a função apropriada, um segmento de código que permita registar
a rotina de atendimento de interrupção acima para que seja uma interrupção rápida.
d) (0.5v) Considerando que a rotina foi registada como uma interrupção rápida fará sentido
continuar a chamar as funções: local_irq_disable() e local_irq_enable()? Porquê?
e) (0.75v) O que se deve substituir no código acima para que seja apenas desligada a linha de
interrupção IRQ1 durante a leitura do scancode?
10. (0.5v) Calcule a ocupação de memória de vídeo, em bytes, para um ecrã em modo gráfico com
resolução 800x600 e que pode apresentar 256 cores diferentes.
11. (2v) Considerando modo texto 25 linhas e 80 colunas e 16 cores, escreva um programa que
dada uma coordenada de ecrã por dois inteiros linha e coluna, imprima os valores dos três
componentes RGB da cor do carácter nessa posição.
2-2
Periféricos e Interfaces
had
Ficha prática 1
Exercícios introdutórios
1 Manipulação de bits
1.1
Escreva em C a função:
char* toBinary (unsigned int m)
que retorna numa string o inteiro (decimal) passado como argumento em notação binária.
1.2
Escreva o código das seguintes funções:
int isSet (int value, int bit);
Retorna um valor não nulo se o bit do parâmetro value indicado no parâmetro bit
tiver o valor 1 ou zero caso contrário.
void setBit (int *value, int bit);
Coloca no bit de value, indicado no segundo argumento, o valor 1.
void clearBit (int *value, int bit);
Coloca no bit de value, indicado no segundo argumento o, valor 0.
void toggleBit (int *value, int bit);
Troca o valor binário do bit de value, indicado no segundo argumento.
Nota: Assuma que o bit menos significativo é indicado pelo valor zero no parâmetro bit, e
que este parâmetro só pode tomar valores positivos.
1.3
Teste as funções desenvolvidas nos exercícios anteriores.
2 Assembly embebido em código C
Neste exercícios deverá ser usado o compilador gcc. O assembler suportado por este
compilador está de acordo com a sintaxe AT&T.
2.1
Escreva um programa em C, chamado contador, que receba dois argumentos da linha de
comando. O primeiro será usado para inicializar uma variável inteira N e o segundo indica o
número de vezes que essa variável deve ser incrementada. A saída do programa apresenta
todos os incrementos de N. Por exemplo:
contador 4 5
56789
Se o segundo argumento for menor do que 1 não escreve nada na saída.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P01 - 1/3
Periféricos e Interfaces
had
a) Assuma que N é uma variável global.
b) Reescreva o programa de modo que o incremento da variável N seja efectuado em
assembler
c) Reescreva o programa de modo que o incremento da variável N seja efectuado em
assembler, e a variável seja local à função main().
Sugestões:
- use a função int atoi (const char*) declarada em <stdlib.h> para converter uma string para
um inteiro.
- para incrementar um registo de uso geral como o eax em assembler pode ser usado:
inc
%eax
2.2
Seja o programa:
#include <stdio.h>
int a=1, b=2;
// Variáveis globais.
int main(int argc, char **argv) {
printf ("%d %d\n", a, b);
/* Código Assembler
*/
printf ("%d %d\n", a, b);
return 0;
}
Escreva código assembler, onde indicado, que troque o valor das duas variáveis a e b, de
modo que quando executado o programa imprima:
1 2
2 1
a) se as variáveis forem globais
b) se as variáveis forem locais à função main ( )
c) Substitua o código assembler na função main( ) por uma chamada à função cujo
protótipo é:
void swap (int *a, int *b);
Implemente e teste esta função em C e em assembler.
3 Bibliografia
Free Software Foundation, Inc (2005). "Extended ASM: Assembler Instructions with C
Expression Operands",
http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/gcc/Extended-Asm.html
- Extended-Asm [último acesso em: 1 mar 2007]
Linux man pages
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P01 - 2/3
Periféricos e Interfaces
had
Ficha prática 2
1
Chamadas ao sistema
1.1
Usando chamadas ao sistema ou wrappers da libc escreva código que permita:
a)
b)
c)
d)
identificar o PID do processo corrente
alterar a prioridade do processo corrente
descarregar os buffers para o disco
mostrar os segundos que passaram desde as 00:00 horas de 1 de Janeiro de 1970
1.2
Escreva um programa que leia uma string da entrada padrão e a escreva num ficheiro de texto:
a) Usando funções wrapper da libc para todas as chamadas ao sistema.
b) Usando a função syscall ( ) da libc para todas as chamadas ao sistema.
1.3
Escreva um programa que imprima informação sobre o sistema, expressando quantidades de
memória em KBytes, no formato:
Uptime = 24673 seg.
Load:
1 min 0 / 5 min 0 / 15 min 0
RAM: total 386172 / free 29240 / shared 0
Memory in buffers = 5064
Swap: total 915664 / free 911240
High Memory: total 0 / free 0
Number of processes = 0
Memory unit = 1 bytes
KBytes
KBytes
KBytes
KBytes
a) Usando a chamada ao sistema acedida pela função sysinfo (...) da libc.
b) Substitua a função sysinfo (...) pela syscall ( )
Os resultados do programa podem ser confirmados escrevendo na consola:
2
cat /proc/meminfo
Portos e memória de E/S
2.1
Como se pode determinar que portos estão atribuídos a um dispositivo?
2.2
Implemente um programa que leia um valor de 8 bits do porto 0x81 e o apresente no monitor,
escreva neste porto um qualquer valor de 8 bits e volte a ler esse porto e apresentar o valor no
monitor.
Sugestão: use as macros inb e outb da libc.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P02 - 1/2
Periféricos e Interfaces
had
2.3
Escreva um programa que lendo os registos do controlador do teclado escreva o scancode de cada
tecla pressionada, até que seja pressionada a tecla <Esc>.
2.4
Como se pode determinar quais os segmentos de memória física atribuídos a um dispositivo?
Para os exercícios seguintes considerando que os programas são executados na consola, em modo
de texto 80x25
2.5
Escreva um programa para ler o código ASCII das 5 primeiras linhas da memória de vídeo e
imprimir essa string no monitor.
2.6
Implemente um programa que escreva a string "Hello world" no topo da memória de vídeo.
2.7
Implemente um programa que altere a cor das 5 primeiras linhas da memória de vídeo.
Bibliografia
Linux System Call quick reference
http://tiger.la.asu.edu/Quick_Ref/Linux_Syscall_quickref.pdf
Capítulo 1 da matéria teórica de Periféricos e Interfaces.
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t01.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P02 - 2/2
Periféricos e Interfaces
had
Ficha prática 3:
Introdução aos módulos do núcleo Linux
1
Como se pode determinar quais os módulos inseridos correntemente no núcleo?
2
Configurar o sistema para inserir o módulo /root/Linux_module_hello/hello.ko, com o comando:
modprobe hello
3
Separar o módulo /root/Linux_module_hello/hello.ko em dois ficheiros: init.c e exit.c, cada um
deles com uma das funções do módulo original, e compilar os ficheiros de modo a obter hello.ko e
inseri-lo no kernel.
4
Implementar um módulo que receba dois argumentos quando da inserção. O primeiro um inteiro e o
segundo uma string. Quando inserido o módulo deve escrever a string tantas vezes como indicadas
no inteiro, no registo do sistema.
O valor por defeito dos argumentos deverá ser 1 para o inteiro e “uma string” para a string.
Deve ser usado o modificador __init e __exit nas funções adequadas.
O nome do módulo deverá ser prtnstr e ao ser inserido não deve ser adicionada ao registo do
sistema a mensagem:
prtnstr: module license 'unspecified' taints kernel.
5
Implementar um módulo que quando identificado com o comando modinfo apresente a seguinte
saída:
filename:
license:
author:
version:
description:
vermagic:
depends:
srcversion:
parm:
arraypar.ko
GPL
Um nome
1.0
Demonstração de passagem de arrays argumentos
2.6.14-mini 386 gcc-3.3
C4BC318C11A6DEAEC37C8DD
array:Vector inteiros com max 5 elementos (array of int)
E que ao ser inserido imprima no registo do kernel todos os elementos passados no array.
O valor do campo srcversion é igual ao valor indicado acima? Porquê?
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P03 - 1/2
Periféricos e Interfaces
had
6
Implementar um módulo que escreva no log do kernel o scancode de cada tecla pressionada, até que
seja pressionada a tecla <Esc>, mas que não o escreva na consola.
Tente escrever um comando, como por exemplo "ls" no terminal. O que sucede?
Pressione <Esc>. O que sucedeu?
7
Implementar um módulo que escreva "Hello World" na 2ª linha da memória de vídeo, quando
inserido a partir da consola em modo texto 80x25, e que quando removido escreva "GoodBye
World", na 3ª linha da memória de vídeo.
Bibliografia
Salzman, Peter Jay, Michael Burian and Ori Pomerantz (2005). “The Linux Kernel Module
Programming Guide”, http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf
[último acesso em: 1 mar 2007]
Capítulo 2 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t02.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P03 - 2/2
Periféricos e Interfaces
had
Ficha prática 4:
Dispositivos de carácter: teclado, rato e RTC/CMOS
1
Escreva um programa no espaço de utilizador que traduza os scancodes das teclas alfabéticas
pressionadas, ignorando as libertadas, para o código ASCII, de modo a imprimir uma tabela como
mostra o exemplo abaixo:
scancode
16
16
30
30
44
ASCII
113
81
97
65
90
carácter
q
Q
a
A
z
SHIFT
up
down
up
up
up
CAPS
off
off
off
on
off
Devem ser reconhecidas o estados das teclas <SHIFT> e <CAPS LOCK> de modo a distinguir
maiúsculas de minúsculas.
O programa deve terminar quando se pressionar a tecla <ESC>.
Como poderia fazer para que as teclas pressionadas não sejam processadas pelo driver do teclado?
2
Escreva código que programe o teclado para que as teclas <Num Lock>, <Caps Lock> e <Scroll
Lock> pisquem durante 0,1 segundos, com esta sequência e repetidamente até que seja pressionada
a tecla <ctrl-c>.
3
Escreva um programa que actue no controlador do teclado para simular a escrita num terminal, do
comando Linux:
ls <enter>
4
Escreva um programa que indique continuamente quais os botões do rato pressionados, como
mostra o exemplo:
LEFT=0
LEFT=0
LEFT=0
LEFT=1
LEFT=1
LEFT=1
LEFT=1
LEFT=0
LEFT=1
MID=0
MID=0
MID=0
MID=0
MID=0
MID=1
MID=1
MID=0
MID=0
RIGHT=1
RIGHT=1
RIGHT=1
RIGHT=0
RIGHT=0
RIGHT=0
RIGHT=0
RIGHT=0
RIGHT=1
O programa deve terminar quando se pressionarem em simultâneo o botão esquerdo e direito.
5
Escreva um programa que permita alterar a resolução do rato entre 0 e 3. O programa deve ter o
seguinte output:
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P04 - 1/2
Periféricos e Interfaces
had
mouseres 1
Resolução anterior: 2
Resolução actual: 1
verifique se o desempenho do ponteiro é alterado.
6
Escreva um programa no espaço de utilizador que mostre o estado do rato quando executado:
mousestate
Mode:
Scaling:
Resolution:
Sample Rate:
stream ou “remote”
1:1 ou 2:1
0 - 3
10, 20, 40, 60, 80, 100, ou 200
7
Altere o programa anterior para um módulo do kernel, que escreva a informação acima, acrescida
da data e hora actuais, no registo do sistema, quando o módulo for inserido e também quando for
removido.
8
Escreva um programa que quando executado retorne a data e hora reportado pelo RTC, no formato:
DD/MM/AAAA
HH:MM:SS
assuma que o RTC está no modo 24 Horas. Confirme com na consola com o comando hwclock.
9
Escreva um programa que consultando a informação presente na NVRAM ou CMOS, indique se a
unidade de disco flexível está presente e o número de discos rígidos presentes no sistema.
Nota: Para evitar conflitos com o servidor gráfico X-Window, recomenda-se que os programas
sejam testados nas consolas virtuais em modo texto. Estas podem ser acedidas com:
CTRL-ALT-F1 ... F6
(CTRL-ALT-F7 retorna ao servidor gráfico)
Nos exercícios sobre o rato poderão ser evitados conflitos, mesmo na consola, removendo os
módulos que operam o rato com por exemplo: mousedev e psmouse, ou desligando as interrupções
enquanto se acede aos registos do controlador.
Bibliografia
Salzman, Peter Jay, Michael Burian and Ori Pomerantz (2005). “The Linux Kernel Module
Programming Guide”, http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf
[último acesso em: 1 mar 2007]
Capítulo 3 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t03.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P04 - 2/2
Periféricos e Interfaces
had
Ficha prática 5:
Introdução aos drivers para dispositivos de carácter
1
Escreva um módulo que implemente um driver de carácter, chamado chardrv1, e que:
a) quando inserido admita como parâmetro o Major do número de dispositivo, reserve esse
número de dispositivo e efectue o registo do driver no kernel
b) quando removido deve ser eliminado este registo.
c) Insira o driver com insmod, e confirme em /proc/devices se os Majors: 3, 30, 50 foram
reservados. Se algum não foi justifique o porquê?
d) Altere o driver anterior para que o Major seja atribuído pelo kernel, quando o parâmetro
Major for omitido na inserção. Confirme qual foi o Major atribuído pelo sistema.
e) Escreva um script que permita inserir o driver e criar a entrada de directório:
/dev/chardrv1, para acesso ao driver.
f) Escreva outro script que remova o driver e a entrada de directório criada com o script da
alínea anterior.
2
Modifique o driver do exercício anterior para que:
a) O nome do driver passe a ser chardrv2
b) Mantenha a mesma funcionalidade em termos de registo, mas usando as funções que
implementam a forma canónica do registo definida no capítulo 4.
c) Escreva um script que receba como parâmetro start ou stop, e que respectivamente insira
ou remova o driver no kernel. Na inserção deve ser criada a entrada de directório:
/dev/chardrv2 com Major e Minor de acordo com os atribuídos pelo sistema. Na remoção
esta entrada de directório deve ser eliminada.
Confirme que o driver foi inserido em /proc/devices e que a entrada /dev/chardrv2 existe
apenas enquanto o driver estiver inserido no kernel.
d) Implemente as funções open() e release() do driver que garantam só um utilizador tem
acesso exclusivo ao driver. Verifique que realmente só um utilizador pode aceder ao driver
ao mesmo tempo.
e) Implemente a função read () de modo que cada vez que for lido o driver seja retornada a
string “Hello World\n”, por exemplo com:
cat /dev/chardrv2
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P05 - 1/2
Periféricos e Interfaces
had
f) Implemente as funções write() e read () que actualizam e retornam o conteúdo de um buffer
estático no driver. A função write() deve adicionar o conteúdo ao fim do buffer e read()
deve ler todo o conteúdo do buffer e seguidamente limpá-lo, como mostra o exemplo:
cat > /dev/chardrv2
0123
4567
^D
cat /dev/chardrv2
0123
4567
cat > /dev/chardrv2
89
^D
cat /dev/chardrv2
89
g) Substitua o buffer estático por um buffer alocado na memória dinâmica mantendo a mesma
funcionalidade.
Bibliografia
Capítulo 4 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t04.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P05 - 2/2
Periféricos e Interfaces
had
Ficha prática 6:
Driver para RTC com IOCTL
1
Modifique o driver do exercício 2 da ficha prática 5 para que:
a) O nome do driver passe a ser rtci
b) retorne as horas, com o formato abaixo indicado, na resposta a:
cat /dev/rtci
HH:MM:SS
c) ajustar a hora, no formato abaixo indicado, com:
cat > /dev/rtci
HH:MM:SS
^D
2
Adicione comandos ioctl ao driver do exercício anterior que permitam parar e reiniciar a
actualização do RTC, e também invocar as operações de escrita e leitura. O ficheiro header a
utilizar, com nome “rtcioctl.h” deverá ser:
#ifndef RTCIOCTL
#define RTCIOCTL
#include <linux/ioctl.h>
#define IOCID 0x15
#define RTC_STOP _IO
#define RTC_START _IO
#define RTC_RUN
_IO
#define RTC_SET
#define RTC_GET
#endif
(IOCID, 0)
(IOCID, 1)
(IOCID, 2)
//
//
//
//
_IOW (IOCID, 3, char
_IOR (IOCID, 4, char
Pára actualização do RTC
Reinicia actualização do RTC
Retorna 0 se RTC parado ou 1 caso
contrário
*) // Acerto da hora
*) // Consulta da hora corrente
Deverá ser desenvolvido também um programa em C, que se execute no espaço de utilizador, e que
aceda ao RTC através do driver. O programa deverá chamar-se rtctl e suportar os seguintes
parâmetros na linha de comandos:
rtctl
rtctl
rtctl
rtctl
rtctl
start
stop
read
write HH:MM:SS
running?
http://w3.ualg.pt/~hdaniel/pin
Pára actualização do RTC
Reinicia actualização do RTC
Mostra a hora
Ajusta a hora
Retorna yes ou no
PIN 2006-7
P06 - 1/2
Periféricos e Interfaces
had
As operações de alteração da actualização do RTC e de leitura e escrita, deverão ser efectuadas
usando IOCTL. Se o número de parâmetros não for o correcto, ou não for conhecido deverá ser
impressa a mensagem:
Usar com:
rtctl [read | start | stop ]
rtctl write HH:MM:SS
rtctl running?
(returns yes if RTC running, no otherwise)
Bibliografia
Capítulo 4 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t04.pdf
E a bibliografia indicada nesses capítulos.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P06 - 2/2
Periféricos e Interfaces
had
Ficha prática 7:
Introdução aos dispositivos de bloco
1
Antes de responder às questões siga os seguintes passos:
i)
Faça download da imagem do disco flexível de 1.44 MBytes dado no código auxiliar, e
descomprima-a com:
tar –xzf
ii)
fd1440.tar.gz
Insira uma disquete na unidade e copie a imagem para a disquete com:
dd of=/dev/fd0 if=fd1440.dat bs=512 count=2880
iii)
Monte a disquete com:
mount –t ext2 /dev/fd0 /tmp_mnt
e execute o programa ex1 a partir da disquete (/tmp_mnt/ex1).
Deve ser impressa na consola a mensagem: original
iv)
Copie para a sua área o programa ex1.
v)
Desmonte a disquete e substitua-a por outra disquete.
Crie nesta nova disquete o sistema de ficheiros ext2 com:
mkfs.ext2 /dev/fd0 –v
Nota: para criar o sistema de ficheiros na disquete com mkfs a disquete não deve
estar montada.
vi)
Monte a nova disquete, tal como em iii), e copie para esta o programa ex1.
vii)
Execute o programa ex1 a partir da disquete criada em v).
Deve ser impressa na consola a mensagem: cópia
Agora responda às seguintes questões:
a) Analisando o código do programa ex1.c, explique porque é que o mesmo programa
executado a partir de disquetes diferentes imprime mensagens diferentes.
b) Usando o utilitário:
hexedit –s /dev/fd0
modifique a disquete criada em v), para que seja impressa também a mensagem: original,
quando se executa o programa ex1 a partir desta disquete.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P07 - 1/2
Periféricos e Interfaces
had
2
Considerando discos rígidos IDE com mais de 1024 cilindros, escreva um programa em C,
chamado partid, que para cada partição do disco, mostre a seguinte informação:
Partição número:
Activa:
Tipo de sistema de ficheiros:
Cilindro Inicial:
Cilindro final:
Sector inicial:
Número de sectores (512 bytes):
[0, 3]
< Sim | Não >
< Linux nativa | NTFS | outra >
[0, 65535]
[0, 65535]
[0, 4294967296]
[0, 4294967296]
Teste o programa com o disco mestre do interface IDE primário: partid /dev/hda.
O cilindro inicial e final da partição podem ser confirmados com: fdisk -l /dev/hda.
3
Escreva um programa que leia um sector da unidade de disco mestre do interface IDE primário,
/dev/hda, e o apresente no monitor, de acordo com:
i)
Os dados do sector devem ser apresentados em hexadecimal e ASCII, num formato
semelhante ao do programa hexedit.
ii)
O sector a ler deve ser especificado na linha de comandos:
readsectorlba <nº do sector na gama: 0 - Total de Sectores LBA-1>
Se o argumento for omitido deve ser mostrado o MBR de /dev/hda.
iii)
A leitura do sector deve ser efectuada usando os comandos do interface IDE-ATA6 para
ler sectores em modo LBA 28 bits ou 48 bits dependendo da capacidade do disco.
Nota: Para confirmar que o sector lido foi o correcto pode-se comparar com:
hexedit –s /dev/hda
iv)
Se o número do sector especificado na linha de comandos for negativo ou maior que
Total de sectores-1, deve ser impressa uma mensagem de erro e abortado o programa.
Sugestão: Para identificar o número total de sectores no disco pode ser usado o
comando IDE IDENTIFY DEVICE (código: 0xEC), ou comando IOCTL
HDIO_GETGEO
Bibliografia
Capítulo 5 da matéria teórica de Periféricos e Interfaces.
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t05.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P07 - 2/2
Periféricos e Interfaces
had
Ficha prática 8:
Drivers para dispositivos de bloco
1.
Desprezando o processamento de erros, complete o seguinte programa, justificando cada passo, de
modo que implemente a leitura e apresentação do sector 1025 (LBA) da unidade de discos com
endereço 3:
#include
#include
#include
#include
#include
#include
#include
#define
#define
#define
#define
<unistd.h>
<fcntl.h>
<stdio.h>
<stdlib.h> //memset
<string.h>
<sys/ioctl.h>
<scsi/_______>
READ_REPLY_LEN
READ_CMD_CODE
READ_CMD_LEN
SENSE_BUF_LEN
512
_______
6
32
int main(int argc, char **argv) {
unsigned char cmdBlk[READ_CMD_LEN] = { _____________ };
unsigned char inpBuf[READ_REPLY_LEN];
unsigned char senseBuf[SENSE_BUF_LEN];
sg_io_hdr_t cmdHdr;
int f = open( _______, O_RDWR);
if (f < 0) { perror("open scsi device"); exit(1); }
memset( ________, 0, sizeof(sg_io_hdr_t));
cmdHdr.interface_id = 'S';
cmdHdr.cmd_len = __________;
cmdHdr.mx_sb_len = sizeof(senseBuf);
cmdHdr.dxfer_direction = __________;
cmdHdr.dxfer_len = __________;
cmdHdr.dxferp = __________;
cmdHdr.cmdp = __________;
cmdHdr.sbp = senseBuf;
cmdHdr.timeout = 20000; // 20 ms
if (ioctl(f, SG_IO, &cmdHdr) < 0) {
perror("sending read command");
exit(1);
}
close(f);
//Código para apresentar o sector em Hexadecimal e ASCII (como hexedit)
__________
__________
__________
return 0;
}
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P08 - 1/3
Periféricos e Interfaces
had
2.
Antes de responder às questões siga os seguintes passos:
i)
Faça download do código auxiliar do capítulo 6 teórico e descomprima-a com:
tar –xzf
ii)
codet06.tar.gz
Compile com make e instale o driver com:
insmod ramdsk.ko
iii)
lsmod
Verifique se foi instalado o módulo com:
Verifique qual o Major do dispositivo com:
cat /proc/devices
Verifique se foi criado o nó no sistema de ficheiros para um driver de bloco com:
ls /dev/ramdsk -l
Se não foi, reinstale o driver e crie o nó com o :
. drvload2 b ramdsk 1 restart
iv)
Crie duas partições primárias tipo Linux nativa com: cfdisk /dev/ramdsk
Sugestão: use 2 MBytes para a primeira e o resto para a segunda.
Verifique se foram criados os nós para as partições com os nomes indicados em cfdisk:
ls /dev/ramdsk* -l
Se não o foram crie-os com:
mknod /dev/ramdsk1 b <Major de ramdsk> 1
mknod /dev/ramdsk2 b <Major de ramdsk> 2
v)
Formate ambas as partições em alto nível para o sistema de ficheiros ext2, com:
mkfs.ext2 /dev/ramdsk1
mkfs.ext2 /dev/ramdsk2
vi)
Crie dois directórios, por exemplo: /root/m1 e /root/m2 e monte ambas as partições com:
mount -t ext2 /dev/ramdsk1 /root/m1
mount -t ext2 /dev/ramdsk2 /root/m2
Verifique a montagem com:
Verifique a capacidade disponível com:
vii)
mount
df
Verifique a operação de uma das partições, copiando um ficheiro para por exemplo:
/root/m1
e liste o directório raiz.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P08 - 2/3
Periféricos e Interfaces
had
Agora responda às seguintes questões:
a) Copie um ficheiro maior que a capacidade de uma das partições da ramdisk. O que sucede e
porquê?
b) Mantendo o tamanho do sector com 512 bytes, que modificações terá de fazer no código para
que a capacidade da ramdsk seja 10 MBytes.
c) Adicione o suporte para o comando IOCTL: RD_FORMAT, que formata toda a ramdisk em
baixo nível.
Desenvolva um programa no espaço de utilizador que peça a execução desse comando para
uma ramdisk indicada no argumento da linha de comandos:
rdformat /dev/ramdsk
Pode-se validar a operação deste comando, após instalar o driver actualizado, por exemplo
criando uma partição com fdisk, executar rdformat e voltar a fdisk para confirmar que a
partição foi apagada.
Bibliografia
Capítulos 5 e 6 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t05.pdf
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t06.pdf
E a bibliografia indicada nesses capítulos.
Comandos SCSI agrupados pelo comprimento do SCB:
http://www.t10.org/lists/op-num.htm
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P08 - 3/3
Periféricos e Interfaces 2006 / 7
10
Periféricos e Interfaces
had
Ficha prática 9:
Introdução às rotinas de tratamento de interrupções
Antes de resolver as questões desta ficha:
i)
Faça download do código auxiliar do capítulo 8 teórico e descomprima-o com:
tar –xzf
ii)
codet08.tar.gz
Compile com make e instale o driver com:
insmod rtcirq.ko
Após a inserção, em qualquer consola em modo texto, deve ser impressa a cada segundo a
mensagem IRQ occurred.
Para remover o módulo basta usar:
rmmod rtcirq.ko
Deixando a mensagem de ser impressa na consola.
O comando rmmod pode ser dado num terminal virtual no ambiente gráfico.
1.
Para resolver este exercício o driver rtcirq deve estar inserido, e poderá ser necessário consultar o
código fonte rtcirq.c. É aconselhável trabalhar num terminal virtual em modo gráfico (KDE,
Gnome,...), pois nas consolas em modo texto a mensagem IRQ occurred continuará a ser impressa até
que o driver seja removido, isto é durante toda a resolução do exercício.
a) Descreva como verificar na linha de comandos Linux, a que driver está atribuído o Major de
/dev/rtcirq
b) Explique porque o Major não corresponde ao driver rtcirq
c) Descreva como verificar na linha de comandos Linux, a que driver está atribuído o Minor de
/dev/rtcirq
d) Explique porque basta usar insmod para instalar o driver rtcirq.
e) Explique porque não são necessárias implementar as funções open () e release ().
2.
Modifique o driver rtcirq dado no código fonte, segundo o principio de Top e Bottom halves para que
escreva no registo do kernel a hora actual do relógio:
a) 1 vez por segundo
b) 2 vezes por segundo
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P09 - 1/2
Periféricos e Interfaces
had
3.
Modifique o driver rtcirq desenvolvido no exercício anterior, segundo o principio de Top e Bottom
halves, para que:
a) Quando a interrupção do alarme do RTC ocorrer, escrever no registo do kernel a string
ALARME OCORREU
b) A hora do alarme possa ser consultada com:
cat /dev/rtcirq
c) A hora do alarme possa ser seleccionada com:
cat > /dev/rtcirq
HH:MM:SS
^D
4.
Modifique o código do driver desenvolvido no exercício anterior para que permita que um processo no
espaço de utilizador aguardar a ocorrência da interrupção do alarme do RTC.
Desenvolva também um programa no espaço de utilizador chamado wakeup, que admite como
parâmetro da linha de comandos o caminho de uma aplicação, e que quando ocorre a interrupção do
alarme do RTC executa a aplicação passada como argumento.
Após inserir o driver e seleccionar uma hora para o alarme, e testar, por exemplo, com:
wakeup hwclock
wakeup alsaplayer song.mp3
Bibliografia
Capítulo 8 da matéria teórica de Periféricos e Interfaces:
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t08.pdf
E a bibliografia indicada nesses capítulos.
http://w3.ualg.pt/~hdaniel/pin
PIN 2006-7
P09 - 2/2
Periféricos e Interfaces
had
Ficha prática 10:
Sub-sistema de vídeo
Modo Texto
1.
Desenvolva um programa que:
a) Desloque o texto visível na consola 10 linhas para baixo e 10 linhas para cima
b) Adicione código que escreva a string “Hello World” sensivelmente no centro do ecrã e que se
mantenha nessa posição enquanto o resto do texto é deslocado como na alínea a)
2.
Altere o exercício 2 da ficha 9, para que a hora do relógio continuamente actualizada, seja
apresentada no canto superior direito do ecrã, sem destruir o texto por baixo, mesmo quando este se
desloca.
3.
Escreva um programa que mova lentamente o cursor ao longo da 2ª linha da consola, como um
hífen, e que quando terminar transforme o cursor num underscore.
4.
Escreva um programa que efectua uma rotação de cor dos caracteres:
a) usando toda a intensidade do vermelho primário da DAC.
b) usando todas as cores da palete
5.
Escreva um programa que efectua uma rotação de cor do border usando todas as cores da palete.
6.
Escreva um programa que troque o bitmap da fonte do carácter ‘A’ com o ‘B’.
7.
Escreva um programa que inverta o bitmap da fonte de caracteres na vertical.
Modo gráfico
8. Programa que:
a) Num modo gráfico de 256 cores 320 x 200, crie um fundo aleatório, por exemplo com pontos
a simular estrelas de várias cores.
b) Desloque um quadrado sólido, no topo do monitor da esquerda para a direita sem destruir o
fundo criado em a)
c) Repita a alínea anterior com um quadrado sem o centro sólido.
d) Adicione suporte ao programa para deslocar o quadrado se forem pressionadas as teclas do
cursor do teclado numérico, respeitando os limite do ecrã
Nota: A animação 2D, pedida no exercício 8 acima, não foi apresentada nas aulas teóricas, por
isso não consta da matéria dos exames deste ano.
http://w3.ualg.pt/~hdaniel/pin
PIN 2005-6
P07 - 1/2
Periféricos e Interfaces
had
Bibliografia
Capítulo 9 da matéria teórica de Periféricos e Interfaces.
http://w3.ualg.pt/~hdaniel/pin/teorica/pin_t09.pdf
E a bibliografia indicada neste capítulo.
http://w3.ualg.pt/~hdaniel/pin
PIN 2005-6
P07 - 2/2
Download

Relatório 2006/7 - Site de utilizadores