ejemplos modo protegido.pdf


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


Página 1...85 86 87888991

Vista previa de texto


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

00112000 - 00112000:
00113000
:

112000 113000 (

112000
113000) in TLB

Donde la posición lineal 0 apunta a la GDT, como la 11000.
En la siguientes líneas se hace lo mismo pero con el código, la PDE y
la PTE. A partir de la dirección lineal 11000 ya que se dejan 656536
bytes para la GDT y 4096 para la IDT. A pesar de que inicialmente se
utiliza sólo una página para la GDT, se deja el espacio lineal como
para utilizarla entera, al igual que una página para la IDT, que en
este ejemplo no se utiliza. Las direcciones físicas a utilizar son
a partir de os_basep.
mov edi,11000h
shr edi,12
shl edi,2
add edi,[PTEF]
mov eax,os_basep
or al,111b

;
;
;
;
;
;

En ecx se indica la cantidad de páginas a direccionar.
(modo_prot_32_end-modo_prot_32+4095)/4096 son la cantidad de páginas
utilizadas por el código, a este valor se le suma una página por la
PDE y una por la PTE.
mov ecx,(modo_prot_32_end-modo_prot_32+4095)/4096+2
init_PTE2:
mov [edi],eax
add edi,4
add eax,1000h
dec ecx
jnz init_PTE2

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

Quedando el mapa de direccionamiento de la siguiente forma:
<bochs:44> show "tab"
cr3: 00112000
00000000 - 00000000:
00011000 - 00013000:
00110000
:
00111000
:
00112000 - 00112000:
00113000
:

110000
111000
110000
111000
112000
113000

(
(
(

110000
113000
110000) in TLB
111000) in TLB
112000
113000) in TLB

Se puede observar que cada dirección física se encuentra mapeada
dos veces linealmente. Como la idea es acomodar todo al inicio
de la memoria lineal, se deben utilizar las direcciones lineales
superiores a 110000, para lo que se debe seguir ejecutando el mismo
código, pero en las direcciones lineales 11000 en vez de 111000.
Para esto se debe realizar un salto. Además, a partir de aquí,
se utilizarán las direcciones lineales 12000 y 13000 para direccionar
la PDE y la PTE. Para ello se modifican las variables PDE y PTE, donde
además se ve que PTEF y PTE son la misma variable FÍSICAMENTE, como
PDE y PDEF, pero linealmente son distintas.
sub dword [PDE],os_basep-os_base
sub dword [PTE],os_basep-os_base

;
; Se realiza el salto.
;
jmp cs_sel_32:bajando-modo_prot_32+os_base