Closed JoaquinCoaricona closed 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.-
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:
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.-
No entendi como pasaria eso de que del otro lado da el valor deseado. Yo lo tengo pensado asi: 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
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);
@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
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.-
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?
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.-
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
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.-
Ahi lo pude hacer, habia un puntero sumando de mas en el log. Gracias
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