Exame de Época Normal (Duração 45+45 minutos) Nome: Número: 1. (5) Classifique cada uma das alíneas seguintes como Verdadeira ou Falsa. 1.1. Num sistema baseado no processador Intel Pentium em modo protegido, a) V o barramento externo de dados tem 64 bits de largura. b) V utilizam-se Call Gates para implementar chamadas a procedimentos menos privilegiados. c) V são utlizados dois TLB (Tanslation Lookaside Buffer) integrados. d) F a dimensão de cada página de memória é especificada na tabela de páginas. e) V utilizam-se endereços físicos de 32 bits. f) F os registos de uso genérico têm 64 bits. g) F pode ser utilizado um mecanismo de segmentação de memória a dois níveis. h) V a dimensão de um segmento de memória é definida na tabela de segmentos. 1.2. a) F O processador Intel 386DX possui uma unidade processamento SIMD (Single Instruction Multiple Data) integrada. b) V O processador Intel Pentium 4 utiliza 2 níveis de cache integrados. c) V O processador Intel Pentium possui uma unidade de vírgula flutuante integrada. d) V Um processador Intel Pentium III utiliza um Buffer de Reordenação. e) V O processador Intel Pentium III utiliza dois TLBs distintos. f) F Um BTB (Branch Target Buffer) só se justifica em arquitecturas com segmentação. g) V Um TLB (Tanslation Lookaside Buffer) só se justifica em arquitecturas com paginação de memória. h) V Um TLB pode utilizar políticas de substituição do tipo LRU (Least Recently Used). 1.3. a) F Uma cache vítima utiliza-se para acelerar o processo de segmentação b) V É possível utilizar políticas de leitura do tipo Read-Through com uma cache completamente associativa. c) V Uma cache pode utilizar blocos de dados mais largos do que o barramento de dados externo. d) V É possível utilizar políticas de escrita do tipo Write-Back com uma cache de mapeamento direto. e) V Um TLB pode ser implementado com uma cache completamente associativa. f) V Uma cache vítima pode ser completamente associativa.
g) V Uma cache externa pode ser gerida por políticas de substituição do tipo LRU (Least Recently Used) h) F Uma cache externa pode ser virtualmente indexada. 1.4. a) F Uma tabela de partições reside normalmente numa partição do tipo FAT. b) F Um dispositivo de armazenamento tem sempre uma tabela de partições. c) V Um bootloader pode utilizar recursos do BIOS (Basic Input Output System). d) F Um bootloader é gravado na tabela de partições. e) V O Journaling é uma técnica utilizada para facilitar a recuperação de sistemas de ficheiros. f) F O uso de Journaling é importante em sistemas de ficheiros voláteis. g) F Os sistemas de ficheiros do tipo FAT utilizam Journaling. h) V 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) V Um kernel Linux pode ser compilado numa máquina com uma arquitectura distinta da máquina a que se destina. b) V Um kernel Linux pode incluir módulos desenvolvidos por entidades distintas. c) V Uma biblioteca pode utilizar funcionalidades disponibilizadas pelo kernel Linux. d) F Os ficheiros de dispositivos (device files) residem normalmente no directório /proc/devices e) F A lista de módulos carregados pode ser obtida com o comando modinfo f) F Num sistema Linux, todos os módulos de kernel têm associados os números Major e Minor. g) V Um ficheiro de dispositivos pode implementar uma comunicação bidireccional entre uma aplicação e o kernel. h) V O comando insmod é utilizado para carregar módulos de sistema operativo. 2. (2) Em alguns processadores, utilizam-se como apontadores para a memória, registos internos mais estreitos do que o barramento externo de endereços. Comente esta afirmação, referindo exemplos de processadores que conhece. Justifique esta opção técnica e as consequências respectivas. A afirmação é verdadeira. Um exemplo é o Intel 8086 que usa registos de 16 bits e tem barramento externo de endereços de 20 bits. Com esta solução, só é possível aceder a um conjunto limitado de segmentos de cada vez. Para aceder a outras posições é necessário alterar a segmentação. Usa-se para permitir alargar a capacidade de endereçamento de memória sem alargar a arquitectura interna.
3. (1) Compare as tecnologias MMX e SSE2 (SIMD Streaming Extensions 2) em termos de desempenho espectável no tratamento de cadeias de dados do tipo inteiro de 16 bits. Com MMX é possível tratar 4 dados do tipo inteiro de 16 bits empacotados nos registos MM (de 64 bits) com única instrução. Com SSE2 é possível tratar 8 dados do tipo inteiro de 16 bits empacotados nos registos XMM (de 128 bits) com única instrução. Logo, é expectável que o desempenho com SSE2 seja o dobro do obtido com MMX. 4. (2) Um determinado fabricante pretende adicionar à sua linha de processadores uma memória cache associativa por conjuntos com 4 vias, que permita o armazenamento de 4096 blocos de 512 bits de dados. Sabendo que os processadores em causa possuem barramentos de endereços de 24 bits, barramento de dados de 32 bits e que utilizam endereçamento ao Byte, indique qual deverá ser, para esta cache: a) O número de comparadores. NComp = NVias = K = 4 b) O número de bits utilizados na indexação. NSets = NBlocos / NVias = 4096/4 = 1024 #Idx = log(1024)/log(2) = 10 bits c) A dimensão das etiquetas Bloco = 512 bits = 64 Bytes #BO = log 2 (64) = 6 bits #Tag = 24 - #BO - #Idx = 24-6 - 10 = 8 bits
5. Parte B - 45 minutos O dispositivo de armazenamento de um sistema dedicado encontra-se ligado a uma estação de trabalho GNU/Linux, tendo ficado associado ao ficheiro de dispositivo /dev/sdb. O sistema dedicado é baseado numa distribuição GNU/Linux, com executáveis baseados na biblioteca GNU Libc. a) Analise o output do comando apresentado abaixo. $ cat /proc/partitions grep sd 8 0 31457280 sda 8 1 512000 sda1 8 2 24576000 sda2 8 16 1000000 sdb 8 17 200000 sdb1 8 18 500000 sdb2 i) (0.5) Pretende-se criar uma nova partição no dispositivo associado a /dev/sdb. Indique o tamanho máximo para essa partição, assumindo que não se pretende alterar as partições existentes. Sdb-sdb1-sdb2 = 1000000-200000-500000 = 300000 blocos ii) (0.5) Apresente o(s) comando(s) necessário(s) para criar um sistema de ficheiros do tipo ext2 na partição criada na alínea anterior. mkfs -t ext2 /dev/sdb3 iii) (1.0) Apresente os comandos necessários para copiar o conteúdo da pasta./build (incluindo eventuais diretórios) para a partição preparada nas alíneas anteriores. mkdir part mount /dev/sdb3 part cp -a./build/* part/ umount part b) No diretório atual encontram-se os seguintes ficheiros, correspondentes a uma aplicação dedicada: makefile, myapp, libutils.a, libutils.so, myapp.h, myapp.o, utils.c, myapp_devices.c e myapp_main.c. Analise o output dos seguintes comandos: [user@localhost]$ file myapp setuid ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), stripped [user@localhost]$ readelf -d myapp grep NEEDED 0x0000000000000001 (NEEDED) 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] Shared library: [libutils.so] i) (1.0) Pretende-se instalar esta aplicação no sistema de ficheiros principal do sistema dedicado. Indique que ficheiros teria que copiar para o sistema alvo, indicando o diretório mais indicado para cada um deles. myapp -> /bin /usr/bin /usr/local/bin libutils.so -> /lib /usr/lib /usr/local/lib
ii) (0.5) Analise o resultado do seguinte comando, executado na estação de trabalho: Mestrado em Eng. Electrotécnica e de Computadores [user@localhost]$ uname -a Linux localhost.localdomain 4.1.6-200.fc22.x86_64 #1 SMP Mon Aug 17 19:54:31 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux Seria possível executar o ficheiro myapp mencionado acima numa linha de comando da estação de trabalho? Justifique. Não porque as arquitecturas não coincidem. ARM!= x86_64
6. Considere um processador da família x86 a funcionar em modo real em que o estado de alguns dos registos é o apresentado na tabela seguinte: ax bx cx dx si di Listagem 1 0x215 0x300 0x600 0x4A0 0x5C0 0x7C0 bp sp cs ds ss es 0x10C 0x40A 0x100 0x800 0x4400 0x5000 mov [0xFF], ax mov si, #0xFF mov bx, [si] mov bp, cx mov ax, [bp] mov [bx], cx Listagem 2 entry start start: run_system evento1: iret var1: db 100 a) i) (1,5) Determine os endereços físicos das posições de memória lidas ou escritas pela sequência de instruções da Listagem 1. mov [0xFF], ax ; EndFis = DS*0x10 + 0xFF = 0x800*0x10+0xff= 0x8000+0xff=0x080ff mov si, #0xFF ; SI := 0xff mov bx, [si] ; EndFis = DS*0x10 + SI = 0x080ff mov bp, cx ; BP := 0x600 mov ax, [bp] ; EndFis = SS*0x10 + BP = 0x44000+0x600 = 0x44600 mov [bx], cx ; EndFis = DS*0x10+BX = 0x8000+0x215 = 0x08215 ii) (0,5) Indique o valor contido no registo bx após a execução da sequência de instruções da Listagem 1. BX = AX = 0x215 b) (0,5) Altere o código da rotina evento1, na Listagem 2, de modo a que o valor da variável var1 seja carregado para o registo ax. Assuma que o programa é carregado no endereço 0x7100. Os registos podem ter qualquer valor no arranque da rotina e deverão manter os mesmos valores após a execução da mesma. 7. entry start start: run_system evento1: push ds mov ax, 0x710 mov ds, ax mov al, [var1] mov ah, 0x0 pop ds iret var1: db 100 Pretende-se implementar, na forma de um módulo de Linux, um controlador orientado ao carácter para o dispositivo XYZCrypt, com o nome de dispositivo mod2, major number 1100 e minor number 0.
a) (1) Implemente uma função que faça o registo do dispositivo aquando do carregamento do módulo, incluindo o registo da função mod_read, definida abaixo, como função de tratamento de leituras do dispositivo. struct file_operations fops = {.owner = THIS_MODULE,.read = mod_read }; static ssize_t mod_read(struct file *f, char *buf, size_t len, loff_t *off) { int bytes_read = 0; while ( len && *msgp ) { put_user( *(msgp++), buf++); len--; bytes_read++; } return bytes_read; } int init_module(void) { return register_chrdev(1100, "mod2", &fops); } b) (3.0) O ficheiro../build/initrd.img é o initrd de um sistema GNU/Linux. Pretende-se enviar a string HELLO para o dispositivo o XYZCrypt durante a execução do script linuxrc desse initrd. Apresente a sequência de comandos necessária para alterar esse initrd, assim como eventuais edições do respetivo script linuxrc, de modo a implementar essa operação. mkdir initrd mount../build/initrd.img initrd/ mknod initrd/dev/mod2 c 1100 0 vi initrd/linuxrc ( acrescentar : ) insmod /modules/xyzcrypt.ko echo HELLO >/dev/mod2 mkdir initrd/modules cp XYZCrypt.ko initrd/modules/ umount initrd cp../build/initrd.img (Sistema alvo)