Domanda

Ho deciso di insegnarmi il linguaggio assembly.

Mi sono reso conto che il mio programma non verrà compilato se provo a modificare il valore di un registro di segmenti.

Ogni articolo che ho trovato dice che posso davvero cambiare il valore di almeno 4 registri di segmento, quindi cosa dà?

Sono davvero interessato solo al perché a questo punto, non ho alcun reale scopo nel cambiare questi indirizzi.

È stato utile?

Soluzione

Hai detto che eri interessato al perché, quindi:

In modalità reale, un segmento è una finestra da 64 K " alla memoria fisica e queste finestre sono distanziate di 16 byte. In modalità protetta, un segmento è una finestra sulla memoria fisica o virtuale, le cui dimensioni e posizione sono determinate dal sistema operativo e ha molte altre proprietà, incluso il livello di privilegi che un processo deve avere per accedervi.

Da qui in poi, tutto ciò che dico si riferisce alla modalità protetta.

Esiste una tabella in memoria chiamata Global Descritor Table (GDT), che contiene le informazioni su queste dimensioni e posizioni delle finestre e altre proprietà. Potrebbero esserci anche tabelle di descrittori locali su una base per processo e funzionano in modo simile, quindi mi concentrerò solo sul GDT.

Il valore caricato in un registro di segmento è noto come selettore di segmento . È un indice nel GDT o LDT, con un po 'di informazioni di sicurezza in più. Naturalmente se un programma tenta di caricare un descrittore che non rientra nei limiti del GDT, si verifica un'eccezione. Inoltre, se il processo non dispone di privilegi sufficienti per accedere al segmento o se qualcos'altro non è valido, si verifica un'eccezione.

Quando si verifica un'eccezione, il kernel la gestisce. Questo tipo di eccezione verrebbe probabilmente classificata come un errore di segmentazione. Quindi il sistema operativo uccide il tuo programma.

C'è un'ultima avvertenza: nel set di istruzioni x86, non è possibile caricare valori immediati nei registri di segmenti. È necessario utilizzare un registro intermedio o un operando di memoria o POP nel registro dei segmenti.

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

Penso che dovrebbe essere sottolineato che l'architettura consente cumuli di segmenti. Ma AFAIK, quando si tratta dei principali sistemi operativi x86, i registri di segmento servono solo per alcuni scopi:

  • Meccanismi di sicurezza, come evitare che i processi dello spazio utente si danneggino a vicenda o al sistema operativo
  • Gestione di processori multipli / multi-core
  • Archiviazione locale di thread: come ottimizzazione, alcuni sistemi operativi (inclusi Linux e Windows) utilizzano i registri di segmenti per l'archiviazione locale di thread (TLS). Dato che i thread condividono lo stesso spazio di indirizzi, è difficile per un thread conoscere " dove la sua regione TLS è senza usare una chiamata di sistema o sprecare un registro ... ma poiché i registri di segmento sono praticamente inutili, non c'è nulla di male a "sprecare" loro per il bene del TLS veloce. Si noti che durante l'impostazione, un sistema operativo potrebbe saltare i registri dei segmenti e scrivere direttamente nei registri della cache dei descrittori, che sono "nascosti". registri utilizzati per memorizzare nella cache le ricerche GDT / LDT attivate da riferimenti ai registri di segmento, nel qual caso se si tenta di leggere dai registri di segmento non lo si vedrà.

A parte un segmento per thread per TLS, in realtà solo una manciata di segmenti (volte il numero di processori) vengono utilizzati e solo dal sistema operativo. I programmi applicativi possono completamente ignorare i registri di segmento.

Ciò è dovuto alla progettazione del sistema operativo, non a limitazioni tecniche. Potrebbero esserci sistemi operativi integrati che richiedono programmi di spazio utente per funzionare con i registri di segmento, anche se non ne conosco nessuno.

Altri suggerimenti

Stai scrivendo eseguibili di Windows?

In modalità protetta (Win32), i registri di segmento non vengono più utilizzati.

Riferimento :

  

Anche il modello di memoria è drasticamente   diverso dai vecchi tempi del   Mondo a 16 bit. Sotto Win32, non è necessario   preoccuparsi del modello di memoria o   segmento più! Ce n'è solo uno   modello di memoria: modello di memoria piatta.   Non ci sono più segmenti da 64 KB. Il   la memoria è un ampio spazio continuo di   4GB. Ciò significa anche che non hai   per giocare con i registri di segmenti. tu   può usare qualsiasi registro di segmento per   indirizzare qualsiasi punto nello spazio di memoria.   Questo è un grande aiuto per i programmatori.   Questo è ciò che rende l'assemblaggio di Win32   programmazione facile come C.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top