Cuando se creó el microprocesador 386, al ser un micro de 32 bits se varió la estructura del modo protegido para darle una mayor potencia, aparte de permitirle direccionar los 4GBytes que permite su bus de direcciones de 32 bits.
En principio, el modo protegido del 386 funciona igual que el del 286: tenemos un registro de selector de 16 bits y uno de offset, esta vez de 32 bits, y en la tabla de selectores disponemos esta vez de 32 bits para indicar la posición base de cada segmento. Sin embargo, disponemos solamente de 20 bits para indicar la longitud de cada segmento. Esto nos la limitaría, en principio, a una longitud máxima de 1 mega por segmento. Sin embargo, los diseñadores de Intel reservaron un bit de granularidad entre los muchos reservados del registro de estado. Este bit permite conseguir segmentos de hasta 4 GBytes con solo 20 bits. El truco consiste en que, si el bit está a cero, la unidad de longitud será 1 byte, con lo que solo podremos tener segmentos de hasta 1 mega. En este modo se es compatible con el 286. Pero si este bit se pone a 1, la unidad será 4 KBytes. Esto significa que un segmento puede tener una longitud múltiplo de esta: 4, 8, 12, 16, 20, 24, 28, 32, etc KBytes. En total, podemos disponer de hasta 64 TeraBytes de memoria para cada programa.
Sin embargo, cuando usamos memoria virtual, este método tiene un inconveniente que ya comentamos: dado que los segmentos pueden tener un tamaño variable, puede ser necesario liberar varios pequeños para hacer sitio a uno grande. Además, la memoria puede fragmentarse con facilidad, lo que obliga a reorganizarla para juntar pequeños huecos libres en uno solo grande. Todo esto consume tiempo extra durante el intercambio a disco. Para evitarlo, se incluyó el modo paginado. Si este modo está activo, las direcciones que salen de la suma del selector y del offset son pasadas por un esquema como el siguiente:
Aquí vemos que el sistema se ha complicado mucho más. Mediante este, podemos dividir la memoria en bloques de 4KBytes, e intercambiar solo aquellos que nos interese. De esta forma, si tenemos que cargar un segmento de 24 KBytes, solo liberaremos 24 KBytes de otro segmento, y no un segmento completo. Esto acelera las transferencias, elimina la fragmentación (los bloques de 4KBytes que forman un segmento no tienen por qué ser consecutivas) y evita el crecimiento incontrolado del fichero de Swap. Sin embargo, hace el sistema algo más lento, pues tiene que hacer más accesos a la RAM (todas estas tablas se situan en la RAM normal). Para evitarlo, se incluyeron una serie de Buffers que retienen las paginas de direccion y de tabla mas usadas.
En OS/2 2.0 y posteriores se define un único segmento para cada programa, de 4 GBytes de longitud (si bien la cantidad de memoria disponible para uso propio es de 'solo' 512 MBytes) y se activa el modo paginado. De esta forma el acceso es más rápido, pues no es necesario cargar múltiples valores en el registro de selector, y conservamos la capacidad de memoria virtual. Esta es la razón de que, cada vez que se hace una reserva de memoria (con DosAllocMem o similar) la cantidad se redondea al múltiplo de 4KBytes superior.