ejemplos modo protegido.pdf


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


Página 1...60 61 62636491

Vista previa de texto


; instrucción arpl, la cual se utiliza para comparar el nivel de
; privilegio de es y el del cs pusheado en la pila por el procesador. La
; función compara ambos y coloca en el destino el mayor (numéricamente)
; de ambos.
;
; A veces, para evitar el escenario Caballo de Troya, se llama a los
; segmentos conforming como otro m‚ lo cual es cierto, pero, en
; ocasiones no es aplicable (por ejemplo cuando se necesita acceder a
; datos de nivel 0 o a puertos, como se menciona en el párrafo anterior,
; y a segmentos de nivel del peticionante).
;
; El descriptor de call gate es el siguiente:
;
; 31
16 15
8 7
0
; +------------------------+-+-+-+-+----+---+-------+
; |
Offset 31..16
|P|DPL|0|D100|000|PC4..0 | 4
; |
| |
| |
|
|
|
; +------------------------+-+-+-+-+----+---+-------+
;
; +------------------------+------------------------+
; |
Selector
|
Offset 15..0
| 0
; |
|
|
; +------------------------+------------------------+
; 31
16 15
0
;
;
- Offset 31..16: Parte alta del offset de la rutina de call gate.
;
- P: Indicación de presencia de la rutina de call gate.
;
- DPL: Nivel de privilegio necesario para poder utilizar este
;
descriptor.
;
- D: Indica si la call gate es de 16 o 32 bits, lo cual implica
;
que se almacenen en la pila los registros SP o ESP en caso de
;
cambio de pila y IP o EIP. Además indica si la cantidad indicada
;
en PC4..0 está dada en words o en double word.
;
- PC4..0: Param Count, cantidad de parámetros que son copiados de
;
una pila a la otra, si es que hay salto de nivel de privilegio.
;
- Selector: Selector de código de la atención de la call gate.
;
- Offset 15..0: Parte baja del offset de la rutina de call gate.
;
use16
org 100h
comienz:jmp inicio
;
; Es la primera vez que se decide alinear. Esta directiva comienza la
; próxima instrucción en una dirección múltiplo del valor que se le
; indique. Se utiliza en este caso para alinear los datos (y/o el
; código) que son muy utilizados para ganar velocidad, a cambio de
; perder algunos bytes de espacio. Alinear el GDTR no tiene mucho
; sentido, ya que el mismo se carga una única vez, mientras que alinear
; la GDT es algo fundamental para obtener un alto rendimiento, ya que
; los micros están optimizados para leer de memoria 64 bytes o más en un
; único ciclo de lectura y acceder a la información alineada. Hay que
; tener en cuenta que el código se lee de a 16 bytes, por lo que, de
; querer acelerar la ejecución de una rutina, por ejemplo el scheduler u
; otra función critica, se podría colocar un align 16 antes de ella.
;
align 4
gdtr dw
gdt_end-gdt-1
dd
0
;
align 8
gdt:
resb 8