ejemplos modo protegido.pdf


Vista previa del archivo PDF ejemplos-modo-protegido.pdf


Página 1...59 60 61626391

Vista previa de texto


;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

ej06.asm - salto de niveles de privilegio en modo protegido
Protected Mode by Examples – 1era Edición - Octubre 2004
Autor:
Mariano Cerdeiro
<m.cerdeiro@soix.com.ar>
http://www.soix.com.ar/links/mpbyexamples.html
compilar: nasm ej06.asm -o ej06.com
Este programa ejemplifica los distintos métodos posibles para realizar
saltos entre niveles de privilegio. El programa principal corre en
nivel 3 y llama a rutinas del sistema operativo para leer el real time
clock, leer un scan code, imprimir en la pantalla y terminar el
programa.
En los ejercicios anteriores nunca se mencionaron los niveles de
privilegio, que son un punto fundamental en el momento de proteger
una aplicación de otra y al sistema operativo de todas ellas. Los
sistemas operativos más conocidos hoy en día no utilizan la
segmentación y los niveles de privilegio para proteger la memoria,
sino que se sirven de la paginación, ya que los segmentos son todos
flat. Se denomina a un segmento flat cuando la
base del mismo es cero y el límite 4 Gb.
Como es sabido, al pasar a modo protegido, se entra al nivel 0 de
privilegio, o sea, al de mayor privilegio. Para pasar de nivel 0 a 3
es necesario saltar de tarea. Se podría hacer mediante un retf con
cambio de nivel, al igual que se hace al retornar de las call gates,
pero es conceptualmente más complicado de comprender.
El método utilizado para cambiar de nivel de privilegio son dos call
gates, una para acceder a los servicios del kernel, que deben correr
en nivel 0 de privilegio, y la otra para acceder al servicio que
imprime en pantalla, que corre sobre un segmento conforming.
Para llevar a cabo la rutina de los servicios se puede utilizar un
segmento conforming o uno normal de nivel 0. La diferencia es que,
utilizando un conforming, no se cambia el nivel de privilegio, sino
que el mismo se asume del nivel del código que llama. La ventaja
consiste en que, al no cambiar de nivel, no se debe cambiar la pila
por una de otro nivel, lo que hace que el acceso sea más rápido y que
no se necesite ninguna verificación de niveles (una rutina conforming
no podría acceder a datos o códigos a los que el código peticionante
no pueda acceder). Por otro lado, es a veces necesario utilizar
variables que se encuentran en nivel cero, o acceder a puertos que son
inaccesibles desde niveles poco privilegiados. En estos casos se debe
utilizar un segmento de nivel 0. Para saltar a un segmento de código
de nivel 0 es necesario un mecanismo específico, como una
interrupción, una call gate u otro método que lo permita. El saltar a
un segmento conforming se puede hacer directamente.
En un tercer caso se podría necesitar, por un lado, acceder a una
rutina de nivel 0, para acceder a un puerto (por ejemplo el disco
rígido), y por el otro, colocar los datos leídos en un segmento de
datos de la rutina peticionante. Podría suceder que la aplicación que
corre en nivel 3 llame a la rutina enviándole como parámetros una
dirección del buffer donde escribir es:edi que esté en un nivel de
mayor privilegio y al que no tiene acceso la aplicación. Para evitar
este escenario, denominado escenario del Caballo de Troya, existe la