Exercícios MT1
Nenhum exercício corresponde a esta pesquisa.
Hardware e I/O
Função principal dos dispositivos de I/OEscolha múltipla
Teste 1, 2024/25
Qual é a função principal dos dispositivos de entrada/saída (I/O) num sistema de computador?
Solução
Fornecer uma interface entre o computador e o seu ambiente exterior.
Os dispositivos de I/O são a ponte entre o sistema computacional e o utilizador ou outros sistemas, convertendo informação entre o mundo exterior e a representação interna do computador.
- Fornecer uma interface entre o computador e o seu ambiente.. Os periféricos de I/O ligam o processador ao mundo exterior: teclado, rato, ecrã, etc.
- Executar programas de software.. Quem executa programas é o CPU, não o dispositivo de I/O.
- Aumentar a velocidade de processamento do CPU.. A velocidade do CPU não depende dos periféricos de I/O.
- Armazenar dados de forma permanente.. O armazenamento permanente é papel da memória secundária, não da interface de I/O.
O que é um device driverEscolha múltipla
Teste 1, 2024/25
O que é um device driver?
Solução
É um software que permite a interação com um componente de hardware.
O device driver esconde os detalhes do dispositivo atrás de uma interface uniforme e faz as operações privilegiadas (portas de I/O, interrupções) através de chamadas ao kernel.
- É um software que permite a interação com um componente de hardware.. O driver traduz pedidos do sistema operativo em operações sobre o dispositivo.
- É um componente de hardware de um dispositivo externo que recebe pedidos do processador.. O driver é software, não um componente de hardware.
- É uma classe de software específica para configurar o temporizador do processador.. O driver não se limita ao temporizador nem ao processador.
- É um componente de software que permite interagir diretamente com o hardware sem o sistema operativo.. Em Minix, o driver corre como processo e usa chamadas ao kernel; não dispensa o sistema operativo.
Polling vs interrupções: chamadas ao kernelEscolha múltipla
Teste 1, 2024/25
Para ler scancodes do teclado pode escolher-se polling ou interrupções. Qual das duas alternativas espera que faça menos chamadas sys_inb() ao kernel?
Solução
Interrupções.
Em polling, o programa verifica o estado do dispositivo em ciclo, gastando uma chamada sys_inb() por consulta. Com interrupções, cada chamada ao kernel corresponde a um evento real, pelo que o número de chamadas é menor.
- Interrupções.. Com interrupções, o kernel só é chamado quando há um evento novo; em polling consulta-se o estado repetidamente.
- Polling.. Em polling é preciso consultar o registo de estado muitas vezes, mesmo sem teclas premidas.
- O número de chamadas é aleatório.. O número de chamadas não é aleatório; depende do mecanismo escolhido.
- Fazem sempre o mesmo número de chamadas.. Polling e interrupções não fazem o mesmo número de chamadas.
Teclado
Combinação make code e break code válidaEscolha múltipla
Teste 1, 2024/25
No protocolo PS/2 (set 1), o break code de uma tecla obtém-se poniendo o bit 7 do make code a 1. Qual é uma combinação make code / break code válida?
0xC2 já tem o bit 7 a 1; o break code não pode resultar dele.O break code tem sempre o bit 7 a 1, ao contrário do make code.0x9E = 0x1E | 0x80, ou seja, o bit 7 foi posto a 1.0xCA já tem o bit 7 a 1; o break code não pode resultar dele.Solução
Make code 0x1E e break code 0x9E.
No set 1, o break code distingue-se do make code apenas no bit 7: 0x1E = 0001 1110 e 0x9E = 1001 1110 = 0x1E | 0x80.
- Make code:
0xC2, break code:0xCA.0xC2já tem o bit 7 a 1; o break code não pode resultar dele. - Make code:
0x9E, break code:0x1E. O break code tem sempre o bit 7 a 1, ao contrário do make code. - Make code:
0x1E, break code:0x9E.0x9E = 0x1E | 0x80, ou seja, o bit 7 foi posto a 1. - Make code:
0xCA, break code:0xC2.0xCAjá tem o bit 7 a 1; o break code não pode resultar dele.
Porque é que alguns scancodes têm dois bytesEscolha múltipla
Teste 1, 2024/25
No KBC, porque é que há scancodes com dois bytes?
0xE0 duplica o espaço disponível para teclas estendidas.O idioma do teclado é interpretado em software, não pelo número de bytes do scancode.Scancode não é ASCII; a tecla 0x1E não produz o caráter a sem interpretação do layout.Solução
Porque não era possível representar todo o conjunto de scancodes num só byte.
As teclas estendidas usam o prefixo 0xE0 seguido do código, como a seta direita (E0 4D no make). Com um só byte ficariam indisponíveis muitos códigos.
- Por retrocompatibilidade.. A retrocompatibilidade explica a conservação do set 1, não o facto de alguns scancodes usarem dois bytes.
- Porque não era possível representar todo o conjunto de scancodes num só byte.. Um byte só dá 256 códigos; o prefixo
0xE0duplica o espaço disponível para teclas estendidas. - Para permitir mapear os scancodes para diferentes idiomas de teclado.. O idioma do teclado é interpretado em software, não pelo número de bytes do scancode.
- Para mapear diretamente para ASCII.. Scancode não é ASCII; a tecla
0x1Enão produz o caráterasem interpretação do layout.
Função do registo de estado do KBCEscolha múltipla
Teste 1, 2024/25
Qual é o objetivo principal do registo de estado (status register) do KBC?
Solução
Guardar o estado do KBC.
O registo de estado (lido na porta 0x64) tem bits como OBF (output buffer full) e IBF (input buffer full), que o programa testa antes de ler scancodes ou escrever comandos.
- Guardar o último caráter digitado dentro do KBC.. O caráter lido está no output buffer, não no registo de estado.
- Mostrar no ecrã o que se digita no teclado.. O KBC não gere o ecrã; isso é papel da placa de vídeo.
- Guardar o estado do KBC.. Bits como OBF e IBF indicam se há byte novo para ler ou se se pode escrever uma ordem.
- Guardar palavras-passe do utilizador.. O KBC não guarda palavras-passe.
Temporizador
Fórmula do divisor de frequência do timerEscolha múltipla
Teste 1, 2024/25
Na função timer_set_frequency, é necessário um divisor de frequência d. Qual fórmula exprime corretamente o seu cálculo? Neste contexto, freq é a frequência desejada, TIMER_FREQ é a frequência do relógio do timer no PC e USHRT_MAX é o valor máximo do contador.
freq = TIMER_FREQ / d.Esta expressão mistura o valor máximo do contador com a frequência desejada.Multiplicar as frequências não produz um divisor de contagem.O divisor não depende da razão entre a frequência desejada e o valor máximo.Solução
d = TIMER_FREQ / freq.
O contador divide o relógio de entrada: para obter freq Hz a partir de TIMER_FREQ Hz, carrega-se d = TIMER_FREQ / freq (com a política de quociente inteiro usada no laboratório).
d = TIMER_FREQ / freq. A frequência de saída é a de entrada dividida pelo divisor:freq = TIMER_FREQ / d.d = TIMER_FREQ / USHRT_MAX * freq. Esta expressão mistura o valor máximo do contador com a frequência desejada.d = TIMER_FREQ * freq. Multiplicar as frequências não produz um divisor de contagem.d = freq / USHRT_MAX. O divisor não depende da razão entre a frequência desejada e o valor máximo.
Função do registo de controlo na porta 0x43Escolha múltipla
Teste 1, 2024/25
Qual é a função do registo de controlo na porta 0x43 do i8254?
Solução
Programa os timers e seleciona os modos de contagem.
A porta 0x43 recebe a palavra de controlo do i8254, que configura cada contador de 16 bits (portas 0x40 a 0x42).
- Guarda a hora atual.. A hora é dada pelo relógio de tempo real, não pelo i8254.
- Controla a transferência de dados entre o CPU e a memória.. Isso é papel do controlador de memória/DMA, não do timer.
- Guarda definições de configuração do utilizador.. O registo de controlo programa o próprio contador, não preferências do utilizador.
- Programa os timers e seleciona os modos de contagem.. A palavra de controlo escolhe o contador, a ordem de bytes (LSB/MSB), o modo e o formato binário/BCD.
O que permite o comando read-back do i8254Escolha múltipla
Teste 1, 2024/25
O que permite o comando read-back do i8254?
0x43 com os bits 7–6 a 11) permite obter a contagem e/ou o estado do contador.O read-back é apenas de leitura; não repõe nada.Solução
Ler o valor atual do contador e a configuração programada.
Sem o read-back, a porta de um contador só daria a contagem de forma pouco fiável; o comando permite ainda ler o estado (modo, formato) de um contador.
- Aumentar a velocidade de processamento do timer.. O read-back não altera a velocidade do relógio.
- Alterar o vetor de interrupção.. O vetor de interrupção é gerido pelo PIC, não pelo read-back.
- Ler o valor atual do contador e a configuração programada.. O comando read-back (escrito em
0x43com os bits 7–6 a11) permite obter a contagem e/ou o estado do contador. - Repor o timer nas definições de fábrica.. O read-back é apenas de leitura; não repõe nada.
Como se mediu o tempo no Lab 2Escolha múltipla
Teste 1, 2024/25
No Lab 2, como foi medido o tempo e impressa uma mensagem a cada segundo?
Solução
Subscrivendo as interrupções do timer com a definição de 60 Hz do Minix.
O Lab 2 configurava o contador 0 para gerar interrupções e o handler incrementava um contador de ticks; a cada 60 ticks (1 segundo a 60 Hz) se imprimia a mensagem.
- Usando o comando read-back a cada segundo.. O read-back lê o contador, mas não foi esse o mecanismo de temporização do Lab 2.
- Subscrivendo as interrupções do timer com a definição de 60 Hz do Minix.. O ciclo de eventos recebia notificações do timer (60 Hz) e contava ticks até perfazer um segundo.
- Configurando o timer com uma frequência de 120 Hz.. O Lab 2 usou a frequência de 60 Hz habitual do Minix, não 120 Hz.
- Subscrivendo as interrupções do timer com a definição de 120 Hz do Minix.. A definição usada foi a de 60 Hz, não 120 Hz.
Interrupções
Comportamento de driver_receive no MinixEscolha múltipla
Teste 1, 2024/25
Qual é o comportamento da chamada driver_receive no Minix?
driver_receive não espera por uma interrupção de software; espera por uma mensagem (que pode ser uma notificação de hardware).Não dá erro; bloqueia à espera de mensagem.Quem trata do PIC é o kernel, não a aplicação.Enquanto não chega mensagem, o processo fica bloqueado e o CPU pode correr outro processo.Solução
Bloqueia até receber uma mensagem de pedido de serviço, permitindo comutação de contexto.
O ciclo de eventos do Lab 2 chama driver_receive(ANY, &msg, &ipc_status) e fica bloqueado até o kernel lhe entregar uma mensagem, incluindo as notificações de interrupção de hardware.
- Bloqueia até receber uma interrupção de software, permitindo comutação de contexto.. A
driver_receivenão espera por uma interrupção de software; espera por uma mensagem (que pode ser uma notificação de hardware). - Dá erro se não houver notificações pendentes para o processo chamador.. Não dá erro; bloqueia à espera de mensagem.
- Faz polling do PIC à procura de interrupções dos periféricos relevantes.. Quem trata do PIC é o kernel, não a aplicação.
- Bloqueia até receber uma mensagem de pedido de serviço, permitindo comutação de contexto.. Enquanto não chega mensagem, o processo fica bloqueado e o CPU pode correr outro processo.
Valor de hook_id para receber o bit 7 na notificaçãoEscolha múltipla
Teste 1, 2024/25
Um device driver quer subscrever interrupções do timer para ser notificado pelo kernel com um payload em que o bit 7 está a 1. Que valor deve passar no argumento hook_id da função sys_irqsetpolicy?
BIT(7) vale 128 e seria a máscara a testar na notificação, não o valor do hook; como hook pediria um bit que não existe no campo de notificações.Com hook_id = 0, o kernel poria a 1 o bit 0 da notificação, não o bit 7.O hook_id é o número do bit: o kernel coloca a 1 esse bit no payload, e a máscara a testar na aplicação é BIT(7) = 0x80.Com hook_id = 1, a notificação teria o bit 1 a 1.Solução
hook_id = 7.
Guarda-se o número do bit antes da chamada: a máscara a testar na notificação é 1 << hook_id, ou seja BIT(7) = 0x80. Passar o próprio BIT(7) como hook pediria o bit 128, que não existe no campo de notificações.
BIT(7).BIT(7)vale 128 e seria a máscara a testar na notificação, não o valor do hook; como hook pediria um bit que não existe no campo de notificações.0. Comhook_id = 0, o kernel poria a 1 o bit 0 da notificação, não o bit 7.7. Ohook_idé o número do bit: o kernel coloca a 1 esse bit no payload, e a máscara a testar na aplicação éBIT(7) = 0x80.1. Comhook_id = 1, a notificação teria o bit 1 a 1.
O que faz a política IRQ_REENABLEEscolha múltipla
Teste 1, 2024/25
O que faz a flag IRQ_REENABLE no contexto das subscrições de notificações de interrupção no Minix?
sys_irqrmpolicy, independentemente desta flag.A política não altera prioridades de atendimento.A reativação automática da linha é o efeito da flag, não a devolução ao driver do sistema.Sem esta política, o processo teria de chamar sys_irqenable quando ficasse pronto; com ela, a rotina genérica do kernel reativa a linha.Solução
Faz com que o kernel desmascare automaticamente as interrupções na linha IRQ associada ao hook_id indicado.
A IRQ_REENABLE autoriza a rotina genérica a reativar a linha de IRQ depois de cada interrupção, para que as seguintes possam chegar sem a aplicação ter de chamar sys_irqenable.
- Permite remover mais tarde a respetiva subscrição.. A remoção faz-se com
sys_irqrmpolicy, independentemente desta flag. - Aumenta a prioridade do handler instalado, impedindo o kernel de o tratar primeiro.. A política não altera prioridades de atendimento.
- Permite que o driver de dispositivo do próprio Minix trate das interrupções da respetiva linha IRQ depois de a subscrição ser removida.. A reativação automática da linha é o efeito da flag, não a devolução ao driver do sistema.
- Faz com que o kernel desmascare automaticamente as interrupções na linha IRQ associada ao
hook_idindicado.. Sem esta política, o processo teria de chamarsys_irqenablequando ficasse pronto; com ela, a rotina genérica do kernel reativa a linha.
Papel do PIC no mecanismo de interrupçõesEscolha múltipla
Teste 1, 2024/25
De que é responsável o PIC (Priority Interrupt Controller)?
Solução
Avisar o CPU de uma nova interrupção.
O PIC i8259 regista os pedidos de interrupção, aplica as máscaras e apresenta ao processador o pedido prioritário, que o CPU atende com o vetor associado.
- Avisar o CPU de uma nova interrupção.. O periférico pede IRQ ao PIC, o PIC escolhe o pedido a apresentar e sinaliza o processador com o vetor correspondente.
- Avisar o dispositivo de I/O das interrupções pela ordem correta.. O PIC comunica com o CPU, não com os dispositivos.
- Executar o handler respetivo de cada interrupção.. Quem executa o handler é o CPU, depois de o kernel despachar a notificação.
- Avisar o CPU de que o handler terminou.. O fim do atendimento é sinalizado com EOI, tratado pelo kernel.
C e chamadas ao sistema
Semântica dos valores de retorno das chamadas POSIXEscolha múltipla
Teste 1, 2024/25
Nas chamadas ao sistema POSIX, qual é a semântica habitual dos valores de retorno?
1 que indica sucesso nas chamadas POSIX.É ao contrário: 0 é o valor de sucesso.Nenhum valor positivo indica erro por convenção geral.É a convenção habitual, também usada nas chamadas do Minix como sys_inb e sys_irqsetpolicy.Solução
0 indica sucesso e os outros valores erro.
As chamadas ao sistema POSIX (e as do kernel do Minix usadas em LC) devolvem 0 quando a operação foi bem-sucedida e um código de erro diferente de zero quando falhou.
1indica sucesso e os outros valores erro.. Não é1que indica sucesso nas chamadas POSIX.0indica erro e os outros valores sucesso.. É ao contrário:0é o valor de sucesso.1indica erro e os outros valores sucesso.. Nenhum valor positivo indica erro por convenção geral.0indica sucesso e os outros valores erro.. É a convenção habitual, também usada nas chamadas do Minix comosys_inbesys_irqsetpolicy.
Resultado da operação bit a bit 12 & 10Escolha múltipla
Teste 1, 2024/25
Qual é o resultado da expressão em C (12 & 10)?
12 = 1100b e 10 = 1010b; 1100 & 1010 = 1000 = 8.O resultado não é o primeiro operando.2 = 0010b seria o resultado de 12 & 10 se só o bit 1 contasse, mas o bit 3 também é comum.O resultado não é o segundo operando.Solução
8.
O operador & atua bit a bit: 12 = 1100b, 10 = 1010b, logo 12 & 10 = 1000b = 8.
8.12 = 1100be10 = 1010b;1100 & 1010 = 1000 = 8.12. O resultado não é o primeiro operando.2.2 = 0010bseria o resultado de12 & 10se só o bit 1 contasse, mas o bit 3 também é comum.10. O resultado não é o segundo operando.
O dispositivo L3223 (PP1)
Palavra de controlo do L3223: timer 1, alarme em milissegundosAutoavaliação
PP1, 2020
No dispositivo fictício L3223 do PP1 de 2020, a escrita no porto 0x23 acede ao registo de controlo, cujos bits relevantes são: bits 7–6 selecionam o timer (00, 01, 10 para os timers 0, 1, 2), o bit 4 seleciona o modo (0 periódico, 1 alarme) e os bits 1–0 selecionam a unidade de tempo (00 microssegundos, 01 milissegundos, 10 segundos). Indique a palavra de controlo, em hexadecimal, para configurar o timer 1 em modo alarme com unidade de milissegundos.
Solução
A palavra de controlo é 0x51.
Timer 1 dá 01 nos bits 7–6 (0x40), o modo alarme liga o bit 4 (0x10) e milissegundos são 01 nos bits 1–0 (0x01). Somando: 0x40 | 0x10 | 0x01 = 0x51. Depois de escrever a palavra de controlo em 0x23, carrega-se o intervalo no porto do timer (0x21), primeiro o LSB e depois o MSB.
Confere a tua resposta:
- A resposta indica a palavra de controlo
0x51(binário01010001). - A justificação separa os campos: bits 7–6 =
01, bit 4 =1, bits 1–0 =01.
Bit do registo de estado do L3223 para o timer 2Autoavaliação
PP1, 2020
No L3223, a leitura do porto 0x23 acede ao registo de estado, em que o bit 2 (TIMER2-INT), o bit 1 (TIMER1-INT) e o bit 0 (TIMER0-INT) indicam, com valor 1, uma interrupção pendente do respetivo timer. Num atendimento de interrupção, para detetar o alarme do timer 2, que bit do registo de estado deve ser testado e com que valor?
Solução
Testa-se o bit 2 (TIMER2-INT) e o valor esperado é 1.
Cada timer tem o seu bit no registo de estado: o timer 0 usa o bit 0, o timer 1 o bit 1 e o timer 2 o bit 2. No handler lê-se 0x23 com sys_inb e verifica-se (estado & TIMER2_INT) != 0 quando se espera o alarme do timer 2.
Confere a tua resposta:
- A resposta indica que se testa o bit 2 (TIMER2-INT).
- A resposta indica que o valor esperado é 1.