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