elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  simulador segmentación paginada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: simulador segmentación paginada  (Leído 3,317 veces)
josperz

Desconectado Desconectado

Mensajes: 2


Ver Perfil
simulador segmentación paginada
« en: 23 Julio 2018, 02:37 am »

buenas, alguno no tendrá un ejemplo a nivel de código o un simulador de segmentación paginada??


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: simulador segmentación paginada
« Respuesta #1 en: 23 Julio 2018, 20:44 pm »

¿Puedes indicar que necesitas más en específico?


En línea

josperz

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: simulador segmentación paginada
« Respuesta #2 en: 23 Julio 2018, 23:11 pm »

¿Puedes indicar que necesitas más en específico?

específicamente eso, un simulador de administración de memoria por medio de segmentación paginada
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: simulador segmentación paginada
« Respuesta #3 en: 24 Julio 2018, 04:12 am »

Es que el tema resulta trivial...

Sea el caso del procesador 8086, el bus de datos es de 16bits, en tanto que el bus de direcciones es de 20bits.
Mientras que 16 bits direccionan 65.536 posiciones de memoria, 4 bits más (es decir 20bits), direccionan 1Mb.
Si divides 1Mb. entre los 64kb. tienes 16, que son el número de páginas que tiene 1Mb. 16 páginas son precisamente los valores que codifican 4bits.

Asi a las direcciones se les antepone el código de página:

pagina: Dirección16bits    
0000:0000.0000-0000.0000
Y ya con los 20 bits se obtiene la dirección absoluta.
La dirección de 16bits, es relativa en la página, es decir, va desde 0 hasta 65.535.
Pongamos que la página es la 5 y pongamos que la dirección en la pagina es 22.222,
la dirección real se calcula como::
nºpagina x 65.536 + direccion relativa
Y que por tanto, para el jemplo será:
 5*65.536 + 22.222 = 327.680 + 22.222 = 349.902
Igualmente puede ponerse en binario (por ejemplo en la calculadora) y luego pasarlo a decimal
página 5: Dir relativa; 22.222
0101:0101.0110-1100.1110 = 349.902

Esto sería como tener un mazo de 16 cartas, donde cada una de ellas representara 64kb.
Esto de más arriba, sin embargo es la explicación ideal...
...es decir la entrada para poder empezar a entender como es realmente.

A la página se le llama segmento y a la dirección relativa, desplazamiento..
Puesto que los registros en el 8086, son de 16 bits, incluído el registro IP.
La solución adoptada, aunque ingeniosa estuvo limitando la accesibilidad a la memoria, dejando en hándicap al PC frente a otros procesadores... y así se crearon los llamados registros de segmento.
La dirección física se compone realmente de dos registros:
El de segmento, y uno de propósito general que formaliza el 'offset' (desplazmaiento dentro del segmento).
En la explicación ideal, si se mira bien, si se repara lo suficiente, presenta un problema y es que como toma 64kb.
exige que un bloque de un programa tenga que coincidir alojado exactamente en un segmento. Es decir resulta un problema si parte de un programa cae en un bloque y parte en otro, pués un único segmento no basta para acceder al programa.
Aprovechando que también los registros de segmento eran igualmente de 16 bits, se eligió otro modelo, y es el que explico a continuación:
El de segmento queda desplazado 4 posiciones hacia arriba (es como si fuera de 20,  donde los 4 bits de menor peso estuvieren a 0), pero naturalmente el resto de los bits de ese registro pueden tener un valor arbitrario (no solo los 4 bits de menor peso).
Esto permite que pueda ubicarse en cualquier punto de la memoria (congruente con 16) el comienzo del bloque de 64kb.
Pero ahora en vez de haber 16 páginas de 64kb. ahora hay 64k.páginas de 16 bytes.
Esto permite que haya muchos pares segmento:desplazamiento (4096 exactamente, 65536/16=4096) que apunten a una misma dirección de memoria.

Ejemplo:
A - Registro de segmento:  
1000.0010-0011.0101 = 33.333
1000.0010-0011.0101*16= 533.328
1000.0010-0011.0101-0000 nótese el desplazamiento a la izquierda de 4 bits.

B - desplazamiento:
0101.0110-1100.1110 =  22.222

C - Dirección física: 533.328 + 22.222 = 555.550

1000.0010-0011.0101-0000
------0101.0110-1100.1110
-----------------------------------
1000-0111.1010-0001.1110 = 555.550

Haz si quieres las cuentas en hexadecinal que cada nibble es una cifra, y se ve mejor...

Y si lo has seguido hasta aquí, te invito a que pongas los bits altos del registro de segmento a 1 y verifiques a qué dirección de memoria estaríamos accediendo???
Por lo demás el cálculo real sigue siendo el explicado en el razonamiento ideal...

En fin, no hace falta mucho código, simplemente un array y un par de 'registros'... y alguna funcionalidad de lectura y/o escritura...

Envió antes que caduque la sesión y me edito luego... con algo de código de ejemplo.

Código
  1. ' El integer de VB6 no es 'unsigned', así que lo emulamos...
  2. Private Type UInteger
  3.    Bajo        As Byte     ' bits 0-7   ' podría acederse de este modo fácilmente a AH y AL, etc...
  4.    Alto        As Byte     ' bits 8-15
  5. End Type
  6.  
  7.  
  8. Private Const c_MegaByte = (2 ^ 20)                         ' 1Mb.
  9. Private Const c_Pagina = (2 ^ 16)                           ' 64Kb.
  10.  
  11. ' 1Mb. de memoria.
  12. Private s_Memoria(0 To c_MegaByte - 1) As Byte
  13.  
  14.  
  15. Private s_DirFisica             As Long
  16.  
  17. Private p_RegAX                 As UInteger  ' registros de 16 bits.
  18. Private p_RegIP                 As UInteger
  19. Private p_RegCS                 As UInteger
  20.  
  21.  
  22.  
  23. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  24.  
  25.  
  26.  
  27. Private Property Get Segmento() As UInteger
  28.     Segmento = p_RegCS
  29. End Property
  30.    Private Property Let Segmento(ByRef X As UInteger)
  31.        p_RegCS = X
  32.        Call CalculaDireccionFisica
  33.    End Property
  34.  
  35. Private Property Get IP() As UInteger
  36.     IP = p_RegIP
  37. End Property
  38.    Private Property Let IP(ByRef X As UInteger)
  39.        p_RegIP = X
  40.        Call CalculaDireccionFisica
  41.    End Property
  42.  
  43. Private Property Get AX() As UInteger
  44.     AX = p_RegAX
  45. End Property
  46.    Private Property Let AX(ByRef X As UInteger)
  47.        p_RegAX = X
  48.    End Property
  49.  
  50. Private Property Get DireccionFisica() As Long
  51.    DireccionFisica = s_DirFisica
  52. End Property
  53.  
  54.  
  55. Private Sub CalculaDireccionFisica()
  56.    Dim X As Long
  57.  
  58.    s_DirFisica = 0 ' al tener 4 bytes, primero los borramos todos...
  59.    Call CopyMemory(s_DirFisica, ByVal VarPtr(p_RegCS), 2)
  60.    Call CopyMemory(X, ByVal VarPtr(p_RegIP), 2)
  61.    s_DirFisica = ((s_DirFisica * 16) + X)
  62. End Sub
  63.  
  64.  
  65. Private Function StringToUInteger(ByRef Txt As String) As UInteger
  66.    Dim v As UInteger
  67.    Dim k As Long
  68.  
  69.    k = Val(Txt)
  70.    v.Bajo = (k And 255)
  71.    v.Alto = (k \ 256)
  72.  
  73.    StringToUInteger = v
  74. End Function
  75.  
  76.  
  77.  
  78. Private Sub Command1_Click()
  79.    Segmento = StringToUInteger(Text1.Text)
  80.    IP = StringToUInteger(Text2.Text)
  81.  
  82.    Text3.Text = DireccionFisica
  83. End Sub
  84.  
  85. Private Sub Command2_Click()
  86.    Dim v As UInteger
  87.  
  88.    AX = StringToUInteger(Text4.Text)
  89.  
  90.    s_Memoria(s_DirFisica) = AX.Bajo
  91.    s_Memoria(s_DirFisica + 1) = AX.Alto
  92. End Sub
  93.  

Añade 3 textbox, con sendos labels, el textbox1 será el de 'segmento' y sí poner en el label, eñ textbox 2, será el desplazamiento, para el eejemplo la dirección IP, el tercer textbox, la dirección física.
Añade un bótón, introduce de entrada los valores de más arriba que puse d eejmplo: Segmento: 33.333 y desplazamiento 22.222, y a la vuelta en el textbox 3 tendrás el valor de la dirección física real.

Usa ese valor como índice en el array s_Memoria...

Solo resta indicar que si bien la memoria del 8086 son direcciones de 16bits... y el array está declarado en bytes... debemos acceder individualmente a cada byte (como señala el código dle 2º botón, o bien usar copymemory).

Añade un segundo boitón y un 4º textbox... con su label 'Valor', introduce un valor en el rango 0-65535 en el textbox4, y pulsa el botón 2, escribirá en la memoria dicho valor...

Puedes si quieres al iniciar el formulario, relenar con valores al azar el array y añadir un botón para leer de la memoria actual, el valor que contiene...
Podrías también añadir un avance del registro IP en 2 posiciones ...

En fin, como has sido parco en palabras, no he podido orientar el código convenientemente... si tratas de hacer algún emulador, ya tienes por donde tomarlo...
« Última modificación: 24 Julio 2018, 05:18 am por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fallo de segmentación!!
Programación C/C++
<[(x)]> 6 3,793 Último mensaje 13 Julio 2010, 06:44 am
por nicolas_cof
Ayuda programa matriz paginada
Programación C/C++
luchofiattipo 0 2,311 Último mensaje 19 Octubre 2012, 04:46 am
por luchofiattipo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines