Exame de (Duração 45+45 minutos) Nome: Número: 1. (4) Classifique cada uma das alíneas seguintes como Verdadeira ou Falsa. 1.1. Num sistema baseado no processador Intel 80386DX em modo protegido, a) o barramento externo de dados é mais largo do que o barramento de endereços. b) utilizam-se Call Gates para implementar as chamadas a procedimentos mais privilegiados. c) um segmento de memória pode residir em mais do que uma página de memória física. d) as páginas de memória têm sempre 16 kbytes. e) a dimensão da memória física pode ser superior à dimensão da memória linear. f) dois segmentos diferentes podem estar mapeados em páginas comuns de memória linear. g) pode ser utilizado um mecanismo de segmentação de memória a dois níveis. h) o nível de privilégio de um segmento de memória é definido na tabela de segmentos. 1.2. a) Um TLB (Translation Lookaside Buffer) é utilizado no processador Intel Pentium II. b) Um TLB permite o processamento paralelo de dados empacotados. c) Um TLB pode utilizar políticas de substituição do tipo LRU (Least Recently Used). d) Um TLB pode ser fisicamente etiquetado. e) Um BTB (Branch Target Buffer) é utilizado no processador Intel Pentium III. f) Um BTB só se justifica em arquitecturas com segmentação. g) Um BTB só se justifica em arquitecturas de execução em pipeline. h) Um BTB pode utilizar políticas de substituição do tipo LRU (Least Recently Used). 1.3. a) Uma cache vítima utiliza-se para acelerar o processo de paginação b) É possível utilizar políticas de leitura do tipo Read-Through com uma cache de mapeamento directo. c) Uma memória cache pode utilizar etiquetas de dimensão superior à dos blocos de dados. d) É possível utilizar políticas de escrita do tipo Write-Back com uma cache completamente associativa. e) Uma tabela de páginas invertida pode ser implementada com uma cache de mapeamento directo. f) Uma cache vítima pode ser virtualmente etiquetada. g) Uma cache externa pode ser gerida por políticas de substituição do tipo LRU (Least Recently Used) h) Uma cache interna pode ser fisicamente indexada
1.4. a) Uma tabela de partições reside num sistema de ficheiros. b) Um dispositivo de armazenamento pode conter sistemas de ficheiros de tipos distintos c) Um bootloader é um programa executável que utiliza recursos do sistema operativo. d) Um bootloader é gravado na directoria raiz de um sistema de ficheiros. e) O Journaling é uma técnica utilizada para facilitar a recuperação de sistemas de ficheiros. f) O uso de Journaling é importante em sistemas de ficheiros só de leitura (read-only) g) Os sistemas de ficheiros do tipo EXT3 utilizam Journaling. h) Um sistema de ficheiros do tipo UnionFS pode juntar, no mesmo directório, conteúdos voláteis e conteúdos armazenados num CD. 1.5. a) Um kernel Linux pode ser compilado numa máquina com uma arquitectura distinta da máquina a que se destina. b) Um kernel Linux pode incluir módulos desenvolvidos por entidades distintas. c) Um kernel Linux utiliza funcionalidades disponibilizadas pela biblioteca standard do C. d) Os módulos do sistema operativo residem normalmente no directório /dev e) A lista de módulos carregados pode ser obtida com o comando cat /proc/modules f) Num sistema Linux é possível ter vários ficheiros de dispositivos (device files) no mesmo directório com os mesmos números Major e Minor. g) Um ficheiro de dispositivos pode implementar uma comunicação bidireccional entre uma aplicação e o kernel. h) O comando rmmod é utilizado para carregar módulos de sistema operativo. 2. (2) Alguns processadores possuem um barramento externo de endereços mais largo do que os registos internos utilizados como apontadores. Comente esta afirmação, referindo exemplos de processadores que conhece. Justifique esta opção técnica e as consequências respectivas. 3. (1) Compare as tecnologias MMX e SSE (SIMD Streaming Extensions) em termos de desempenho espectável no tratamento de cadeias de dados do tipo inteiro. 4. (2) Um determinado fabricante pretende adicionar à sua linha de processadores uma memória cache completamente associativa que permita o armazenamento de 512 blocos de 64 bits de dados. Para esta cache, indique qual deverá ser: a) A dimensão das etiquetas. b) O número de comparadores. c) O número de bits utilizados na indexação.
Parte prática 5. Considere um processador da família x86 a funcionar em modo real em que o estado os registos e de algumas posições de memória é o apresentado nas tabelas seguintes: ax bx cx dx si di bp sp cs ds ss es 0x100 0x200 0x300 0x400 0x500 0x600 0x100 0x40 0x100 0x2000 0x1000 0x4000 Endereço 0x0038 0x0039 0x003A 0x003B 0x003C 0x003D 0x003E 0x003F Valor 0x0 0x0 0x00 0xF0 0x0 0x0 0x01 0xF0 Endereço 0x0040 0x0041 0x0042 0x0043 0x0044 0x0045 0x0046 0x0047 Valor 0x02 0x01 0x02 0xF0 0x07 0x0 0x13 0xF0 a) (1.5) Determine os endereços físicos das posições de memórias lidas ou escritas pela sequência de instruções: mov ax, #0x500 mov [0x200], ax add [bp], cx b) (1) Indique a sequência de acções desencadeadas pelo processador caso encontre a instrução INT 0x10. 6. Assuma que está a preparar um novo sistema dedicado, baseado num computador com processador da família x86 e BIOS PC. Este sistema terá um único dispositivo de armazenamento (TD), com interface SATA. Durante a fase de preparação, o TD está ligado a um sistema de desenvolvimento baseado em Linux, estando associado ao ficheiro de dispositivo /dev/sdb. Foram criadas previamente duas partições no TD. a) (0.5) Como utilizador normal e a partir da linha de comando, indique como poderia verificar se o TD se encontra realmente ligado e qual o tamanho de cada partição. b) (0.5) Indique como poderia proceder para obter uma cópia exacta (imagem) da primeira partição do dispositivo /dev/sdb. A imagem da partição deverá ficar guardada na forma de um ficheiro com o nome part1.img. c) (0.75) Assuma que lhe foi fornecido um ficheiro, mbr.img, contendo o a imagem do Master Boot Record (MBR). Indique como procederia para instalar o ficheiro no MBR do sistema alvo. d) (0.75) Indique que comando utilizaria para criar um sistema de ficheiros do tipo ext3 em /dev/sdb2 e) (1.5) O ficheiro initrd.img é o initrd a ser usado no sistema dedicado. Adicione o ficheiro mydriver2.ko ao directório modules desse initrd e copie o initrd para o sistema de ficheiros da primeira partição do sistema dedicado (que se encontra desmontado).
f) (1.5) Pretende-se instalar o programa myapp no sistema de ficheiros (SF) contido em /dev/sdb2 (que se encontra desmontado). O executável deverá ser copiado para o directório /usr/bin desse SF. No entanto, observa-se que o comando ldd /usr/bin/myapp (no sistema de desenvolvimento) retorna o seguinte resultado: linux-gate.so.1 => (0x005d0000) libpthread.so.0 => /lib/libpthread.so.0 (0x00bd5000) libgsl.so.0 => /usr/lib/libgsl.so.0 (0x07c7a000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003b2000) libm.so.6 => /lib/libm.so.6 (0x00ba9000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bf9000) libc.so.6 => /lib/libc.so.6 (0x00a1d000) /lib/ld-linux.so.2 (0x009fc000) libgslcblas.so.0 => /usr/lib/libgslcblas.so.0 (0x06de3000) Assumindo que o ambiente de desenvolvimento foi preparado para replicar o sistema alvo, explique como procederia para fazer a correcta instalação do programa myapp. 7. Considere o seguinte extracto de código de um módulo de kernel Linux: #define DEVICE_NAME "mydriver" #define DEVICE_MAJOR 1300 #define BUFSIZE 80 char mod_buffer[bufsize]; int n; int write_to_device(char *buf, int n); ssize_t mydriver_xxx (struct file *filp, char user *buf, size_t count, loff_t *pos) { int n1; if(*pos==n) return 0; n1 = count > n-*pos? n-*pos : count; copy_to_user(buf, mod_buffer, n1 ); *pos += n1; return n; ssize_t mydriver_yyy (struct file *filp, const char user *buf, size_t count,loff_t *pos) { n = count > BUFSIZE? BUFSIZE : count; copy_from_user(mod_buffer, buf, n); write_to_device(mod_buffer, n); *pos=0; return n; struct file_operations fops = {.owner = THIS_MODULE,.read = mydriver_xxx,.write = mydriver_yyy, ; int mydriver_init(void) { int r = register_chrdev(device_major, DEVICE_NAME, &fops); if (r < 0) return r; return 0; void mydriver_cleanup(void) { unregister_chrdev(device_major, DEVICE_NAME); module_init(mydriver_init); module_exit(mydriver_cleanup);
O resultado do comando ls -l no directório actual, onde foi desenvolvido o módulo, foi o seguinte: -rw-r--r-- 1 user1 user1 1078 Sep 13 11:25 Makefile -rw-rw-r-- 1 user1 user1 29 Sep 13 14:51 modules.order -rw-rw-r-- 1 user1 user1 0 Sep 13 11:26 Module.symvers crw-r--r-- 1 user1 user1 1200, 0 Sep 13 14:59 mydriver_if -rw-rw-r-- 1 user1 user1 1419 Sep 13 14:50 mydriver.c -rw-r--r-- 1 user1 user1 137484 Sep 13 14:51 mydriver.ko -rw-rw-r-- 1 user1 user1 497 Sep 13 14:51 mydriver.mod.c -rw-r--r-- 1 user1 user1 45284 Sep 13 14:51 mydriver.mod.o -rw-r--r-- 1 user1 user1 93373 Sep 13 14:51 mydriver.o Assuma que o módulo foi compilado para o kernel em utilização e que não se encontra carregado. a) (1) Em que situação a função mydriver_init é executada? Descreva as acções desencadeadas por esta função. b) (1) Observe o conteúdo da consola de texto de um utilizador: $ cat /proc/devices grep mydriver 1300 mydriver $ echo command1 > mydriver_if mydriver_if: No such device or address A que se deve a última mensagem? Indique como procederia para corrigir o problema. c) (1) Descreva o resultado do comando echo command1 > mydriver_if em condições normais de funcionamento.