Pergunta

Eu decidi me ensinar linguagem assembly.

Eu percebi que meu programa não será compilado se eu tentar alterar o valor de qualquer registro de segmento.

Cada artigo que eu encontrei diz que eu posso de fato alterar o valor de pelo menos 4 registos do segmento, então o que dá?

Eu estou realmente interessado apenas no porque, neste momento, eu não tenho qualquer propósito real em mudar esses endereços.

Foi útil?

Solução

Você disse que estava interessado em por que, assim:

Em modo real, um segmento é uma "janela" de 64 K de memória física e essas janelas são espaçados 16 bytes separados. No modo protegido, um segmento é uma janela para qualquer memória física ou virtual, cujo tamanho e localização é determinada pelo sistema operacional, e tem muitas outras propriedades, incluindo o nível de privilégio de um processo deve ter para acessá-lo.

De agora em diante, tudo o que digo refere-se ao modo protegido.

Existe uma tabela na memória chamado de tabela de descritor global (GDT), que é onde as informações sobre esses tamanhos de janela e locais e outras propriedades são mantidas. Também pode haver tabelas descritor locais em uma base por processo, e eles funcionam de forma semelhante, por isso vou apenas focar o GDT.

O valor que você carregar em um registrador de segmento é conhecido como um seletor de segmento . É um índice para a GDT ou LDT, com um pouco de informação de segurança extra. Naturalmente, se um programa tenta carregar um descritor que está fora dos limites da GDT, ocorre uma exceção. Além disso, se o processo não tem privilégios suficientes para acessar o segmento, ou qualquer outra coisa é inválido, ocorre uma exceção.

Quando ocorre uma exceção, o kernel manipula-lo. Este tipo de exceção, provavelmente, ser classificada como uma falha de segmentação. Assim, o OS mata seu programa.

Há uma advertência final: no conjunto de instruções x86, você não pode carregar os valores imediatos para registradores de segmento. Você deve usar um registrador intermediário ou uma memória operando ou pop para o registro de segmento.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

Eu acho que deve ser salientado que a arquitetura permite a montes de segmentos. Mas AFAIK, quando se trata de sistemas operacionais tradicional x86, registradores de segmento servem apenas algumas finalidades:

  • Mecanismos de segurança, como manter os processos do espaço do usuário de prejudicar uns aos outros ou o OS
  • Lidar com processadores múltiplos / multi-core
  • armazenamento local de segmento: como uma otimização, alguns sistemas operacionais (incluindo Linux e Windows) registra o uso de segmento para armazenamento local de segmento (TLS). Desde threads compartilham o mesmo espaço de endereço, é difícil para um segmento para "saber" onde sua região TLS é sem usar uma chamada de sistema ou desperdiçar um registo ... mas desde registradores de segmento são praticamente inúteis, não há mal nenhum em "desperdício" -los para o bem da TLS rápidos. Note que quando essa configuração, um sistema operacional pode ignorar os registradores de segmento e escrever directamente para registros de cache descritor, que estão "escondidos" registradores usados ??para armazenar em cache as pesquisas GDT / LDT desencadeadas por referências aos registradores de segmento, caso em que se você tentar para ler os registradores de segmento que você não vai vê-lo.

Além de um segmento por segmento para TLS, realmente apenas um punhado de segmentos (vezes o número de processadores) são usados, e somente pelo sistema operacional. programas de aplicação pode completamente ignorar os registradores de segmento.

Isto é devido ao design OS, não a quaisquer limitações técnicas. Não pode ser incorporado sistemas operacionais que requerem programas de espaço de usuário para trabalhar com os registos do segmento, embora eu não sei de nenhum.

Outras dicas

Você está escrevendo executáveis ??do Windows?

de modo protegido (Win32), registos de segmento não são utilizadas.

Referência :

modelo de memória também é drasticamente diferente dos velhos tempos da mundo de 16 bits. Em Win32, não precisamos estar preocupado com o modelo de memória ou segmento mais! Há apenas uma modelo de memória: modelo de memória plana. Não há mais 64K segmentos. o Memória é um grande espaço contínuo de 4GB. Isso também significa que você não tem para brincar com registradores de segmento. Vocês pode usar qualquer registrador de segmento para abordar qualquer ponto no espaço de memória. Isso é uma grande ajuda para programadores. Isto é o que torna a montagem Win32 programação tão fácil como C.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top