sisoputnfrba / foro

Foro de consultas para el trabajo práctico
151 stars 7 forks source link

Duda LOG #4133

Closed JoaquinCoaricona closed 4 months ago

JoaquinCoaricona commented 4 months ago

Hola buenas tengo una pregunta con este log de CPU _Lectura/Escritura Memoria: “PID: - Acción: <LEER / ESCRIBIR> - Dirección Física: - Valor: <VALOR LEIDO / ESCRITO>”._

En las intstrucciones que acceden a memoria que son MOV_IN MOV_OUT y COPY STRING hay datos diferentes. Osea son int y string. Queria preguntar si se tiene que poder imprimir en la parte de VALOR dependiendo si es un int o si es un string. O solamente deberiamos imprimir los int y dejar la impresion de string a las interfaces

iago64 commented 4 months ago

Buenas! Cómo va?

Tienen que imprimir los valores independientemente del tipo de dato, por suerte como saben en que instrucción estan pueden decirle al logger si imprimirlo como %d o como %s.

Saludos.-

JoaquinCoaricona commented 4 months ago

Ok pero entonces tengo una pregunta. En las pruebas dice que _En la ejecución del proceso MEMORIA2 se observa que puede recuperar correctamente el valor de la memoria que se encuentra en 2 páginas diferentes.

Pero con los logs obligatorios no se si se podria ver eso. Porque como tenemos que imprimir el valor por cada pagina entonces en un acceso quizas leemos media pagina y lo que imprima valor no va a ser el numero real.

_Fetch Instrucción: “PID: - FETCH - Program Counter: ”. Instrucción Ejecutada: “PID: - Ejecutando: - ”. TLB Hit: “PID: - TLB HIT - Pagina: ” TLB Miss: “PID: - TLB MISS - Pagina: ” Obtener Marco: “PID: - OBTENER MARCO - Página: - Marco: ”. Lectura/Escritura Memoria: “PID: - Acción: <LEER / ESCRIBIR> - Dirección Física: - Valor: <VALOR LEIDO / ESCRITO>”._

iago64 commented 4 months ago

Buenas!

En el caso que planteas que es justo el de las pruebas tienen 2 opciones a considerar: 1- Imprimir los valores por partes 2- Reconstruir el valor e imprimir todo junto

En ambos casos es algo relativamente facil de validar ya que el valor se parte exactamente a la mitad, por lo que al ser uint32_t les quedan como uint16_t y por lo tanto si los imprimen con %d no debería explotarles y va a pasarles que de un lado les da 0 y del otro el valor que recuperan.

Saludos.-

JoaquinCoaricona commented 4 months ago

No entendi como pasaria eso de que del otro lado da el valor deseado. Yo lo tengo pensado asi: image numeroGlobalLog es un int y yo copio ahi la cantidad de bytes que se mandaron a escribir osea que no se llena siempre. Entonces al imprimirlo imprime mal en los dos logs. Yo se que funciona bien porque lo probaba viendo el valor del registro pero de esta forma no funciona el log

JoaquinCoaricona commented 4 months ago

Hola estoy probando este archivo de instrucciones:

RESIZE 8 SET EAX 2500 SET BX 3 MOV_OUT BX EAX MOV_IN EBX BX EXIT

[INFO] 22:29:34:532 CPU/(25832:25832): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 1 [INFO] 22:29:34:532 CPU/(25832:25832): Instrucción Ejecutada: PID: 0 - Ejecutando: RESIZE - 8 [INFO] 22:29:35:533 CPU/(25832:25832): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 2 [INFO] 22:29:35:533 CPU/(25832:25832): Instrucción Ejecutada: PID: 0 - Ejecutando: SET - EAX 2500 [INFO] 22:29:36:534 CPU/(25832:25832): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 3 [INFO] 22:29:36:534 CPU/(25832:25832): Instrucción Ejecutada: PID: 0 - Ejecutando: SET - BX 3 [INFO] 22:29:37:553 CPU/(25832:25832): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 4 [INFO] 22:29:37:553 CPU/(25832:25832): Instrucción Ejecutada: PID: 0 - Ejecutando: MOV_OUT - BX EAX [INFO] 22:29:37:553 CPU/(25832:25832): PID: 0 - TLB MISS - Pagina: 0 [INFO] 22:29:37:554 CPU/(25832:25832): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 0 - Marco: 0 [INFO] 22:32:18:261 CPU/(25832:25832): PID: <0> - Acción: ESCRIBIR - Dirección Física: 3 - Valor: 196 [INFO] 22:32:26:913 CPU/(25832:25832): PID: 0 - TLB MISS - Pagina: 1 [INFO] 22:32:26:914 CPU/(25832:25832): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 1 - Marco: 1 [INFO] 22:32:36:672 CPU/(25832:25832): PID: <0> - Acción: ESCRIBIR - Dirección Física: 4 - Valor: 9

Y log logs del MOV_OUT son estos, en ningun caso se imprime el 2500, son paginas de 4 bytes. El codigo funciona porque lo veo con los registros pero aca creo que no puede sallir nunca porque estamos escribiendo por parte el valor de numeroGlobalLog que es un INT global. Se escribe dos veces pero se escriben cosas distintas y no llega a ser el numero original

mandarAescribirEnMemoria(nuevaDirFisica,contenidoAescribir + desplazamientoContenido,cantidadBits,contexto); memcpy(&numeroGlobalLog,contenidoAescribir + desplazamientoContenido,cantidadBits); log_info(logOficialCpu,"PID: <%i> - Acción: ESCRIBIR - Dirección Física: %i - Valor: %i",contexto>pid,nuevaDirFisica,numeroGlobalLog);

JoaquinCoaricona commented 4 months ago

@iago64 lo volvi a probar pero ahora con estas instrucciones. Solo cambie el inicio a la mitad de la pagina.

RESIZE 8 SET EAX 2500 SET BX 2 MOV_OUT BX EAX MOV_IN EBX BX EXIT

Pero lo que me parece raro es que cuando yo le hago memcpy yo le copio la mitad de los bytes del void* contenido, osea solo copio 2. bytes en este caso. Pero a la primera ya leyo el numero 2500. Osea que con solo 2 bytes ya leyo el numero entero

[INFO] 22:51:09:498 CPU/(30669:30669): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 1 [INFO] 22:51:09:498 CPU/(30669:30669): Instrucción Ejecutada: PID: 0 - Ejecutando: RESIZE - 8 [INFO] 22:51:10:499 CPU/(30669:30669): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 2 [INFO] 22:51:10:500 CPU/(30669:30669): Instrucción Ejecutada: PID: 0 - Ejecutando: SET - EAX 2500 [INFO] 22:51:11:501 CPU/(30669:30669): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 3 [INFO] 22:51:11:501 CPU/(30669:30669): Instrucción Ejecutada: PID: 0 - Ejecutando: SET - BX 2 [INFO] 22:51:12:502 CPU/(30669:30669): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 4 [INFO] 22:51:12:502 CPU/(30669:30669): Instrucción Ejecutada: PID: 0 - Ejecutando: MOV_OUT - BX EAX [INFO] 22:51:12:502 CPU/(30669:30669): PID: 0 - TLB MISS - Pagina: 0 [INFO] 22:51:12:502 CPU/(30669:30669): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 0 - Marco: 0 [INFO] 22:51:15:543 CPU/(30669:30669): PID: <0> - Acción: ESCRIBIR - Dirección Física: 2 - Valor: 2500 [INFO] 22:51:23:689 CPU/(30669:30669): PID: 0 - TLB MISS - Pagina: 1 [INFO] 22:51:23:689 CPU/(30669:30669): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 1 - Marco: 1 [INFO] 22:51:28:573 CPU/(30669:30669): PID: <0> - Acción: ESCRIBIR - Dirección Física: 4 - Valor: 2500

Estuve probando mas y me pasa lo mismo en el mov_in. Osea es como que de una lee 2500 pero yo creo que deberia leer la mitad. Yo esperaba que pase lo que me dijiste, que a la primera viene 0 y despues el numero entero y que tenia que sumar punteros y eso pero funciona asi. Pero no entiendo porque pasa esto y si es algun error

iago64 commented 4 months ago

Buenas! Cómo va?

Es justamente lo que te dije que podía pasar, que de un lado te devuelva 0 y del otro el número. Creo que es un buen momento para recordar lo que deberían haber visto en arquitectura respecto a la representación de los números en la memoria y que los mismos pueden ser little endian o big endian, al final de cuentas nos da lo mismo como los represente la arquitectura que estamos usando pero hace que puedan darse estas cosas raras de que copiando la mitad de un número ya nos alcance para tener el valor completo, ya que con 2 bytes vos podes tener un número de 0 a 65535.

Saludos.-

JoaquinCoaricona commented 4 months ago

Ok entiendo pero solo para cerrar, entiendo que te referis al caso que de un lado te devuelva 0 y del otro el numero. En mi caso me devuelve el numero de los dos lados. Osea de ninguno me da un 0. Pero seria por esto que me decis no?

iago64 commented 4 months ago

Buenas! Cómo va?

Y la pregunta, si vos reconstruis el valor, te da el número o que te devuelve? Porque me parece que ahi calculaste mal alguna dirección.

Saludos.-

JoaquinCoaricona commented 4 months ago

Hola buenas, estaba Probando la prueba de Memoria y TLB, el punto en el que hay que recuperar el valor en dos paginas. Los logs me dieron asi. Solo para confirmar esto estaria bien? Las partes que me hacen dudar son las que 4 resalte. Porque en una se escribe 10 y en la otra pagina 0. Y al leer lee 10 en las dos. No se si es por el tema de la division de datos pero me parecio raro eso.

_[INFO] 01:51:49:288 CPU/(1392:1392): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 7 [INFO] 01:51:49:288 CPU/(1392:1392): Instrucción Ejecutada: PID: 0 - Ejecutando: MOV_OUT - DX EBX [INFO] 01:51:49:288 CPU/(1392:1392): PID: 0 - TLB MISS - Pagina: 0 [INFO] 01:51:49:288 CPU/(1392:1392): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 0 - Marco: 0 [INFO] 01:51:49:288 CPU/(1392:1392): PID: <0> - Acción: ESCRIBIR - Dirección Física: 30 - Valor: 10 [INFO] 01:51:49:288 CPU/(1392:1392): PID: 0 - TLB MISS - Pagina: 1 [INFO] 01:51:49:288 CPU/(1392:1392): Obtener Marco: PID: 0 - OBTENER MARCO - Página: 1 - Marco: 1 [INFO] 01:51:49:289 CPU/(1392:1392): PID: <0> - Acción: ESCRIBIR - Dirección Física: 32 - Valor: 0 [INFO] 01:51:50:291 CPU/(1392:1392): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 8 [INFO] 01:51:50:291 CPU/(1392:1392): Instrucción Ejecutada: PID: 0 - Ejecutando: MOVIN - EAX DX [INFO] 01:51:50:291 CPU/(1392:1392): PID: 0 - TLB HIT - Pagina: 0 [INFO] 01:51:50:291 CPU/(1392:1392): PID: <0> - Acción: LEER - Dirección Física: 30 - Valor: 10 [INFO] 01:51:50:291 CPU/(1392:1392): PID: 0 - TLB HIT - Pagina: 1 [INFO] 01:51:50:291 CPU/(1392:1392): PID: <0> - Acción: LEER - Dirección Física: 32 - Valor: 10 [INFO] 01:51:51:293 CPU/(1392:1392): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 9 [INFO] 01:51:51:293 CPU/(1392:1392): Instrucción Ejecutada: PID: 0 - Ejecutando: SUB - EBX ECX [INFO] 01:51:52:293 CPU/(1392:1392): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 10 [INFO] 01:51:52:293 CPU/(1392:1392): Instrucción Ejecutada: PID: 0 - Ejecutando: SET - EAX 0 [INFO] 01:51:53:294 CPU/(1392:1392): Fetch Instrucción: PID: 0 - FETCH - Program Counter: 11

Tambien hice la prueba para ver si el valor se reconstruia bien, para eso copie las instrucciones de la prueba original pero le saque las ultimas dos lineas porque en esas se cambian los registros que intervienen en la etapa y escritura. Queda asi el script que se ejecuta, osea sin las ultimas dos lineas donde se cambiaban los registros.

SET EAX 0 SET EBX 10 SET EDX 0 SET ECX 1 SET DX 30 RESIZE 60 MOV_OUT DX EBX MOV_IN EAX DX EXIT

Y habilite mis logs donde se puede ver el resultado de todos los registros cuando un proceso llega por instruccion EXIT. Y el resultado se reconstruyo bien pero el tema de los logs es lo que me parece extraño y queria preguntar si estaba bien.

[INFO] 03:59:45:113 kernel/(2233:2235): <0> Llego a kernel [INFO] 03:59:45:113 kernel/(2233:2235): LLEGO UN PCB [INFO] 03:59:45:113 kernel/(2233:2235): Motivo Recibido : INSTRUCCION EXIT [INFO] 03:59:45:113 kernel/(2233:2235): PID RECIBIDO : 0 [INFO] 03:59:45:114 kernel/(2233:2235): PC RECIBIDO : 10 [INFO] 03:59:45:114 kernel/(2233:2235): ESTADO PROCESO: 2 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO AX : 1 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO BX : 1 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO CX : 1 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO DX : 30 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO EAX : 10 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO EBX : 10 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO ECX : 1 [INFO] 03:59:45:114 kernel/(2233:2235): REGISTRO EDX : 0 [INFO] 03:59:45:114 KERNEL/(2233:2235): Cambio de Estado: PID: <0> - Estado Anterior: EXEC - Estado Actual: EXIT [INFO] 03:59:45:114 kernel/(2233:2235): Se agrega el proceso: 0 a Exit

iago64 commented 4 months ago

Buenas! Cómo va?

Que recuperen 2 veces el mismo valor me preocupa, porque justamente como decis, tendrías que recuperarlo de la misma forma que lo grabas, un parte con 10 y la otra con 0

Saludos.-

JoaquinCoaricona commented 4 months ago

Ahi lo pude hacer, habia un puntero sumando de mas en el log. Gracias