Software Básico Memória Capítulo 2 Mitsuo Takaki http://www.cin.ufpe.br/~mt2/ [email protected] Memória Principal Introdução Introdução • É a parte do computador onde estão armazenados os programas e os dados. • Composta de células endereçáveis. – Armazenam informações. – Possui um número chamado de endereço. • Usado pelos programas para referenciá-la. – Todas as células possuem o mesmo número de bits. Introdução • A memória pode ser vista como um grande repositório (vetor) de células. • O endereço é equivalente ao índice da posição da célula no vetor. Introdução • O número de bits usado no endereçamento determina a quantidade de células endereçáveis. – 32 bits pode endereçar 4 bilhões de células. • A célula é a menor unidade endereçável. Ordenação de Bytes • Os bytes em uma palavra podem ser ordenados da esquerda para direita ou da direita para esquerda. Ordenação de Bytes Ordenação de Bytes • Computadores como SPARC e mainframes da IBM utilizam a estratégia big endian. • Computadores da família Intel utilizam little endian. Problemas na Ordenação de Bytes • Não existe uma forma certa ou errada, ambas são válidas e consistentes. • Problemas podem ocorrer no transmissão de dados de uma máquina little endian para uma big endian, ou vice-versa. Problemas na Ordenação de Bytes Problemas na Ordenação de Bytes • A solução proposta é utilizar cabeçalhos na frente de cada item de dados. – Informa o tipo do dado e o seu comprimento. – Não é eficiente, produz overhead. Memória Principal Memória Cache Introdução • As CPUs sempre se mantiveram mais rápidas que as memórias. • Quanto mais lenta for a memória, mais ciclos de CPU serão desperdiçados. • Sempre que a CPU precisa de um dado que não está nos registradores, este é buscado na memória. – O que a CPU faz enquanto a informação não chega? Formas de Esperar por um Dado • Existem duas problema: formas de resolver este – A CPU é bloqueada quando esta tenta ler uma palavra de memória antes de ela chegar. (HW) – O compilador não gera código que usa palavras antes de estarem prontas. (SW) Bloqueio por Software • O compilador introduz instruções NOP. – Instruções que não realizam nada. • Estas pausas são também conhecidas como bolhas. Bloqueio por Software Bloqueio por Software • NOPs também são utilizados em cracks. • Instruções são substituídas por NOPs. – Verificação de serial. – Autenticação. Exemplo de Crack em Java public String getContent(User user) { if (user.equals(this.owner)) { return content; } else { throw new AuthenticationException("Wrong user!!"); } } ... public boolean equals(Object o) { User other = (User) o; boolean result = true; result = result & (other.password.equals(this.password)); result = result & (other.username.equals(this.username)); return result; } Exemplo de Crack em Java public java.lang.String getContent(authentication.User); Code: 0: aload_1 1: aload_0 2: getfield #17; //Field owner:Lauthentication/User; 5: invokevirtual #26; //Method authentication/User.equals:(Ljava/lang/Object;)Z 8: ifeq 16 11: aload_0 12: getfield #15; //Field content:Ljava/lang/String; 15: areturn 16: new #32; //class authentication/AuthenticationException 19: dup 20: ldc #34; //String Wrong user!! 22: invokespecial #36; //Method authentication/AuthenticationException."<init>":(Ljava/lang/String;)V 25: athrow Exemplo de Crack em Java public java.lang.String getContent(authentication.User); Code: 0: aload_1 1: aload_0 2: getfield #17; //Field owner:Lauthentication/User; 5: invokevirtual #26; //Method authentication/User.equals:(Ljava/lang/Object;)Z 8: nop 9: aload_0 10: getfield #15; //Field content:Ljava/lang/String; 13: areturn 14: new #32; //class authentication/AuthenticationException 17: dup 18: ldc #34; //String Wrong user!! 20: invokespecial #36; //Method authentication/AuthenticationException."<init>":(Ljava/lang/String;)V 23: athrow Exemplo de Crack em Java • A instrução de verificação da autenticidade do usuário é substituída por uma instrução NOP. • A autenticação é omitida. – By-pass Memórias Cache • Para reduzir o impacto dos problemas de sincronização, uma memória de alta velocidade é introduzida na CPU. • Chamada de memória cache. • É utilizada para armazenar palavras de memória utilizadas com mais freqüência. Memória Cache • Quando a CPU precisa de uma palavra, ela verifica a cache. • Se a palavra buscada não está na cache, então é buscada na memória principal. Memória Cache • Sabe-se que quando uma palavra é referenciada no endereço A, a próxima referência está na vizinhança de A. • Um exemplo disto é o próprio programa. – Exceto em casos de desvios e chamadas a procedimentos. Memória Cache • Reduz o tempo gasto com acesso à memória armazenando os dados freqüentes. – Grande parte do tempo de execução é gasto em laços. – Um programa de manipulação de matrizes fará muitas referências à mesma matriz. Princípio da Localidade • O princípio da localidade é a observação de que referências à memória, feita em qualquer intervalo de tempo curto, tendem a usar apenas uma pequena fração da memória total. • Quando uma palavra é referenciada, ela e seus vizinhos são copiados para a cache. Linhas de Cache • Memórias principais e caches são divididos em blocos de tamanho fixo. – Chamados de linhas de cache. • Quando uma busca na cache falha, toda a linha é carregada. Linhas de Cache Projeto de Cache • Algumas questões são importantes no projeto de cache. 1. Tamanho da cache. – Quanto maior o tamanho da cache, melhor seu funcionamento, porém maior é o custo. 2. Tamanho da linha de cache. – Uma cache de 16kb pode ser dividida em até 1024 linhas de 16 bytes, 2048 linhas de 8 bytes... Projeto de Cache 3. Organização da cache. – Como são controladas as palavras de memória que estão sendo mantidas no momento. 4. O número de caches. – É comum um ter uma cache primária dentro do chip, uma cache secundária fora do chip e uma terceira mais adiante. Projeto de Cache 5. Localização das instruções e dos dados. – Instruções e dados podem ser mantidos em locais diferentes. – Pode ser classificada como: • • Cache unificada Cache dividida Projeto de Cache Cache Unificada • Projeto mais simples. • Mantém um equilíbrio entre as buscas de instruções e buscas de dados. • Mantém as instruções e os dados na mesma cache. Projeto de Cache Cache Dividida • Tendência nos projetos atuais. – Também conhecido como arquitetura Harvard. • Utiliza uma cache instruções dos dados. dividida, separando – Permite acesso paralelo às instruções e dados. – Instruções não são modificadas durante a execução, portanto, o conteúdo da cache de instruções nunca é escrito de volta na memória. Memória Secundária Introdução • A memória principal sempre será muito pequena. • O usuário sempre quer usar mais memória do que tem disponível. Hierarquia de Memória Hierarquia de Memória • A medida que desce na hierarquia, três parâmetros aumentam: – O tempo de acesso. – Capacidade de armazenagem. • Com exceção das fitas e discos óticos. – O preço por bit. Discos Magnéticos Introdução • Composto de um ou mais pratos de alumínio com um revestimento magnetizável. • Possui um cabeçote de disco com uma bobina de indução. – Flutua logo acima da superfície, apoiado sobre um colchão de ar. – Em discos flexíveis o cabeçote toca a superfície. Introdução • O cabeçote alinha as partículas magnéticas definindo um valor no setor. – Alinha para esquerda ou para direita. • A seqüência circular de bits escritos quando o disco faz uma rotação completa é denominada trilha. Estruturas • Cada trilha é dividida em setores. – Possui um número fixo de setores. • Cada setor possui um preâmbulo que permite a sincronização do cabeçote antes de uma leitura ou escrita. Estruturas • Após os dados, está um código de correção de erros. • Há uma lacuna entre os setores chamada de lacuna de intersecção. Estruturas • Os discos possuem braços móveis que deslocam-se para dentro e para fora. – Permite acessar diferentes distâncias radiais. • A cada distância radial pode ser escrita uma trilha diferente. Estruturas Estruturas • A maioria dos discos é composta de vários pratos empilhados na vertical. Busca de Dados • Para ler ou escrever um setor, o braço deve se posicionar até a posição radial correta. – Esta ação é chamada de busca (seek). • Assim que o cabeçote é posicionado, o disco deve ser rotacionado até o setor ser posicionado sob o cabeçote. – Este tempo é chamado de latência rotacional. Latência Rotacional Controlador de Disco • Todo drive possui um controlador de disco. – Um chip que controla o drive. • Pode conter uma CPU completa. • Deve aceitar comandos de software. – Read, write e format. Controlador de Disco • Controla o movimento do braço, detecta e corrige erros. • Deve converter bytes de 8 bits lidos da memória em uma corrente serial de bits e vice-versa. Discos IDEs • Possui o controlador integrado ao drive. – Discos anteriores possuíam uma placa separado para o controlador. • Realiza leitura e escrita da seguinte forma: – O SO coloca os parâmetros nos registradores da CPU e chama o BIOS (Basic Input Output System); – O BIOS emite as instruções para carregar os registradores do controlador. – O controlador inicia as transferências.