¿Qué dispositivo de hardware solía consumir 1,4 GB de mi RAM de 4 GB y ahora, de repente, sin cambios de hardware, consume 2,2 GB?

17

Esto es más o menos una continuación de

¿Qué dispositivo de hardware consume 1,4 GB de mi RAM de 4 GB?

Si bien he aceptado más o menos la solución que, por alguna misteriosa razón, después de una actualización del BIOS, mi adaptador de gráficos de repente reservó 1,4 GB de memoria (en lugar de reservarla dinámicamente), ahora (2 semanas después de que expiró la garantía de mi portátil), después de hacerlo nada especial, excepto quizás probar algunos CD en vivo de Linux (algunos de ellos en bucle invertido desde una llave USB) y cambiar algunas veces las opciones de arranque de UEFI a BIOS CSM y viceversa, de repente se reservan 800 MB más.

Y para que quede claro, este no es un problema de Windows: tanto memtest como Linux también ven esa cantidad de memoria. Solo Lenovo Diagnostics todavía ve los 4 GB completos de memoria (y lo probó y no encontró errores)

Aquí hay capturas de pantalla de la herramienta de diagnóstico del controlador de gráficos y del monitor de recursos:

Nueva situacion

(Como referencia, antes de 1435 MB estaban reservados para hardware, y la memoria gráfica máxima era de 1138 MB).

Lo que obviamente hace que el problema sea mucho más urgente, ya que ahora la mitad de mi memoria está "reservada por hardware".

La salida de meminfo -rno cambió mucho (el cuarto rango de memoria se redujo en casi 800 MB):

MemInfo v2.10 - Show PFN database information
Copyright (C) 2007-2009 Alex Ionescu
www.alex-ionescu.com

Physical Memory Range: 0000000000001000 to 000000000009D000 (156 pages, 624 KB)
Physical Memory Range: 0000000000100000 to 0000000020000000 (130816 pages, 523264 KB)
Physical Memory Range: 0000000020200000 to 0000000040004000 (130564 pages, 522256 KB)
Physical Memory Range: 0000000040005000 to 0000000057D32000 (97581 pages, 390324 KB)
Physical Memory Range: 0000000100000000 to 000000011F600000 (128512 pages, 514048 KB)
MmHighestPhysicalPage: 1177088

Como ya no confío en UEFI después de las historias anteriores con Samsung y Lenovo, entré en el shell EFI y descargué un poco más de información. Realmente no sé de qué se trata todo esto, pero tal vez esto ayude a alguien:

memmap

Type       Start            End               # Pages          Attributes
BS_code    0000000000000000-0000000000000FFF  0000000000000001 000000000000000F
available  0000000000001000-000000000005AFFF  000000000000005A 000000000000000F
BS_data    000000000005B000-000000000005BFFF  0000000000000001 000000000000000F
BS_code    000000000005C000-0000000000086FFF  000000000000002B 000000000000000F
BS_data    0000000000087000-0000000000087FFF  0000000000000001 000000000000000F
BS_code    0000000000088000-000000000008FFFF  0000000000000008 000000000000000F
reserved   0000000000090000-000000000009FFFF  0000000000000010 000000000000000F
BS_code    0000000000100000-000000000010FFFF  0000000000000010 000000000000000F
available  0000000000110000-000000001FFFFFFF  000000000001FEF0 000000000000000F
reserved   0000000020000000-00000000201FFFFF  0000000000000200 000000000000000F
available  0000000020200000-0000000040003FFF  000000000001FE04 000000000000000F
reserved   0000000040004000-0000000040004FFF  0000000000000001 000000000000000F
available  0000000040005000-0000000057D31FFF  0000000000017D2D 000000000000000F
BS_data    0000000057D32000-0000000057D51FFF  0000000000000020 000000000000000F
available  0000000057D52000-000000005A34AFFF  00000000000025F9 000000000000000F
BS_data    000000005A34B000-000000005A360FFF  0000000000000016 000000000000000F
reserved   000000005A361000-000000005A562FFF  0000000000000202 000000000000000F
BS_data    000000005A563000-000000005AD21FFF  00000000000007BF 000000000000000F
available  000000005AD22000-0000000096B02FFF  000000000003BDE1 000000000000000F
LoaderData 0000000096B03000-0000000096B04FFF  0000000000000002 000000000000000F
available  0000000096B05000-0000000096B06FFF  0000000000000002 000000000000000F
LoaderData 0000000096B07000-0000000096B14FFF  000000000000000E 000000000000000F
LoaderCode 0000000096B15000-0000000096BD1FFF  00000000000000BD 000000000000000F
LoaderData 0000000096BD2000-00000000C9468FFF  0000000000032897 000000000000000F
available  00000000C9469000-00000000C9474FFF  000000000000000C 000000000000000F
LoaderCode 00000000C9475000-00000000C9668FFF  00000000000001F4 000000000000000F
available  00000000C9669000-00000000CA828FFF  00000000000011C0 000000000000000F
BS_data    00000000CA829000-00000000CAE22FFF  00000000000005FA 000000000000000F
available  00000000CAE23000-00000000CAE31FFF  000000000000000F 000000000000000F
BS_data    00000000CAE32000-00000000CD668FFF  0000000000002837 000000000000000F
available  00000000CD669000-00000000CDCD5FFF  000000000000066D 000000000000000F
BS_code    00000000CDCD6000-00000000D6268FFF  0000000000008593 000000000000000F
RT_code    00000000D6269000-00000000D6344FFF  00000000000000DC 800000000000000F
RT_code    00000000D6345000-00000000D6468FFF  0000000000000124 800000000000000F
RT_data    00000000D6469000-00000000D6FEDFFF  0000000000000B85 800000000000000F
RT_data    00000000D6FEE000-00000000D9E9EFFF  0000000000002EB1 800000000000000F
reserved   00000000D9E9F000-00000000DAC13FFF  0000000000000D75 000000000000000F
reserved   00000000DAC14000-00000000DAE9EFFF  000000000000028B 000000000000000F
ACPI_NVS   00000000DAE9F000-00000000DAF04FFF  0000000000000066 000000000000000F
ACPI_NVS   00000000DAF05000-00000000DAF9EFFF  000000000000009A 000000000000000F
ACPI_recl  00000000DAF9F000-00000000DAFD9FFF  000000000000003B 000000000000000F
ACPI_recl  00000000DAFDA000-00000000DAFFEFFF  0000000000000025 000000000000000F
BS_data    00000000DAFFF000-00000000DAFFFFFF  0000000000000001 000000000000000F
available  0000000100000000-000000011F5FFFFF  000000000001F600 000000000000000F
reserved   00000000000A0000-00000000000BFFFF  0000000000000020 0000000000000000
reserved   00000000DB000000-00000000DF9FFFFF  0000000000004A00 0000000000000000
MemMapIO   00000000F80F8000-00000000F80F8FFF  0000000000000001 8000000000000001
MemMapIO   00000000FED1C000-00000000FED1FFFF  0000000000000004 8000000000000001

  reserved  :  24,115 Pages (98,775,040)
  LoaderCode:     689 Pages (2,822,144)
  LoaderData: 207,015 Pages (847,933,440)
  BS_code   :  34,263 Pages (140,341,248)
  BS_data   :  13,865 Pages (56,791,040)
  RT_code   :     512 Pages (2,097,152)
  RT_data   :  14,902 Pages (61,038,592)
  available : 748,703 Pages (3,066,687,488)
  ACPI_recl :      96 Pages (393,216)
  ACPI_NVS  :     256 Pages (1,048,576)
  MemMapIO  :       5 Pages (20,480)
Total Memory: 3,985 MB (4,179,152,896) Bytes

(como un novato UEFI, ¿qué significa BS_data?)

dh -d

http://pastebin.com/KH1rFehj

(dh -v se encuentra con un bucle infinito y no se puede volcar ...)

dmpstore ( edité mi clave de producto de Windows 8):

http://pastebin.com/iYPcbpEY

Se agradece cualquier idea u otra forma de recuperar esta memoria (¿alguien sabe si hay una manera de restablecer completamente la UEFI NVRAM sin hacer que la máquina no se pueda arrancar?)

EDITAR1

Al arrancar Linux en modo UEFI, se puede utilizar la mayor parte de la memoria.

/ proc / meminfo

/ proc / iomem

dmesg

Pero al iniciarlo en modo BIOS de compatibilidad (a través de CSM) no es:

/ proc / iomem

dmesg

Entonces, ¿probablemente un error en el CSM? (Pero sigue siendo sorprendente que de repente aparezca ...)

Como mi sistema operativo principal es Windows (7), supongo que tendría que actualizar a 8 (.1) y realizar una reinstalación completa en una partición GPT para usar UEFI. Y teniendo en cuenta los problemas que UEFI (todavía) está causando regularmente, no estoy seguro de si quiero seguir esa ruta ...

EDIT2

También publiqué un hilo en los foros de Lenovo sobre esto, pero hasta ahora no hay respuestas: http://forums.lenovo.com/t5/R-and-L-Series-ThinkPad-Laptops/L530-2481-3SG-First-1 -4-GB-RAM-de-4-GB-reservado-por-hardware-y / td-p / 1539272

También (solo para excluir esta causa) quité la batería CMOS, pero excepto algunas huellas dactilares oscuras que encontré en la "puerta inferior" (tapa detrás de la cual se ocultan el disco duro y la RAM) no me hizo más sabio.

EDITAR3

No hay muchas noticias, un tipo de Lenovo siguió mi publicación en el foro y dijo que algún ingeniero lo examinará. Esperemos lo mejor.

EDITAR4

Otros 21 MB han mordido el polvo, esta vez por intentar arrancar una distribución de Linux a través de UEFI Secure Boot ... Más detalles en el hilo mencionado anteriormente en los foros de Lenovo.

más memoria perdida

mihi
fuente
¿Tiene alguna BIOS opcional relacionada con la memoria? ¿Particularmente alguna opción de reasignación de memoria?
David Schwartz el
No, excepto que deshabilitar la protección de memoria (DEP) no hay tales opciones. Y especialmente estoy 100% seguro de que no cambié ninguna opción de BIOS, excepto la prioridad de arranque entre 1,4 GB y 2,2 GB consumidos.
mihi
Estoy un poco desconcertado por la pregunta, dado que Win7 solo puede usar 3.5GB o menos de su memoria de todos modos. ¿Has probado las sugerencias de este artículo? support.microsoft.com/kb/978610
Debra
2
@Debra Es Win7 de 64 bits, que (con seguridad) puede usar> 3.5GB (en el trabajo tengo una máquina con 12GB con Win7). Y sí, lo hice (hace 4 meses cuando publiqué mi última pregunta)
mihi
¿Qué versión de BIOS estás usando actualmente y cuál era la anterior? ¿Ya intentaste restablecer el BIOS a su configuración predeterminada? ¿Cuál es la cantidad de memoria instalada / utilizable que se muestra en el cuadro de diálogo de propiedades del sistema?
y31415

Respuestas:

19

Resuelto :)

La causa parece ser una característica extraña en la implementación UEFI, que también se puede ver en la implementación Open Source TianoCore:

https://github.com/tianocore/edk2/blob/master/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsMisc.c#L1425

Finalmente lo encontré después de diferenciar mis volcados de variables EFI después de la última "pérdida" de 21MB y encontrar variables interesantes:

Antes de perder los últimos 21 MB de memoria

Variable NV+RT+BS '4C19049F-4137-4DD3-9C10-8B97A83FFDFA:MemoryTypeInformationBackup' DataSize = 50
00000000: 09 00 00 00 60 00 00 00-0A 00 00 00 00 01 00 00 *....`...........*
00000010: 00 00 00 00 00 10 00 00-06 00 00 00 36 3A 00 00 *............6:..*
00000020: 05 00 00 00 00 02 00 00-03 00 00 00 00 8C 00 00 *................*
00000030: 04 00 00 00 00 40 00 00-01 00 00 00 00 02 00 00 *.....@..........*
00000040: 02 00 00 00 78 F2 03 00-0E 00 00 00 00 00 00 00 *....x...........*
Variable NV+RT+BS '4C19049F-4137-4DD3-9C10-8B97A83FFDFA:MemoryTypeInformation' DataSize = 50
00000000: 09 00 00 00 60 00 00 00-0A 00 00 00 00 01 00 00 *....`...........*
00000010: 00 00 00 00 00 10 00 00-06 00 00 00 36 3A 00 00 *............6:..*
00000020: 05 00 00 00 00 02 00 00-03 00 00 00 00 8C 00 00 *................*
00000030: 04 00 00 00 00 40 00 00-01 00 00 00 00 02 00 00 *.....@..........*
00000040: 02 00 00 00 38 E7 06 00-0E 00 00 00 00 00 00 00 *....8...........*

Después de perderlos

Variable NV+RT+BS '4C19049F-4137-4DD3-9C10-8B97A83FFDFA:MemoryTypeInformationBackup' DataSize = 50
00000000: 09 00 00 00 60 00 00 00-0A 00 00 00 00 01 00 00 *....`...........*
00000010: 00 00 00 00 00 10 00 00-06 00 00 00 36 3A 00 00 *............6:..*
00000020: 05 00 00 00 00 02 00 00-03 00 00 00 00 8C 00 00 *................*
00000030: 04 00 00 00 00 40 00 00-01 00 00 00 00 02 00 00 *.....@..........*
00000040: 02 00 00 00 38 E7 06 00-0E 00 00 00 00 00 00 00 *....8...........*
Variable NV+RT+BS '4C19049F-4137-4DD3-9C10-8B97A83FFDFA:MemoryTypeInformation' DataSize = 50
00000000: 09 00 00 00 60 00 00 00-0A 00 00 00 00 01 00 00 *....`...........*
00000010: 00 00 00 00 00 10 00 00-06 00 00 00 36 3A 00 00 *............6:..*
00000020: 05 00 00 00 00 02 00 00-03 00 00 00 00 8C 00 00 *................*
00000030: 04 00 00 00 82 55 00 00-01 00 00 00 00 02 00 00 *.....U..........*
00000040: 02 00 00 00 38 E7 06 00-0E 00 00 00 00 00 00 00 *....8...........*

¿Por qué es interesante? Todo el tiempo probé cosas, actualicé y degradé el BIOS, cambié la configuración, etc., estas variables nunca cambiaron (y supuse que almacenaban información sobre la marca / modelo de mi RAM instalada o similar).

Ahora que mi memoria disminuyó, el valor de MemoryTypeInformation fue respaldado como MemoryTypeInformationBackup (sobrescribiendo la copia de seguridad anterior) y exactamente un DWORD en el valor cambia - en el desplazamiento 0x34: el valor anterior era 0x4000, el nuevo valor es 0x5582. La diferencia es 0x1582 o 5506 en decimal, que coincide exactamente con el número de páginas (bloques 4K) que mi memoria redujo la última vez.

Yendo un paso más allá: el valor anterior de MemoryTypeInformation y MemoryTypeInformationBackup también difiere exactamente en un valor (aunque con un desplazamiento diferente, 0x44). Al comparar nuevamente sus valores, 0x2F4C0 o 193728 en decimal, es exactamente el número de páginas que mi memoria redujo el tiempo anterior (cuando la dirección de inicio cambió de 871F2000 a 57D32000).

Comparando esto con el código TianoCore mencionado anteriormente, esto de repente tiene mucho sentido:

Este código se activa cuando el sistema está a punto de iniciar una opción de inicio, y verifica que las diferentes regiones de memoria UEFI tengan menos páginas asignadas que las almacenadas en MemoryTypeInformation. Si no, el mapa de memoria es incorrecto y la variable se actualiza (con el 125% de lo que está asignado actualmente) y se activa un reinicio, de modo que el mapa de memoria se puede reconstruir a partir de los últimos datos. Tenga en cuenta que la implementación nunca disminuirá ningún tamaño en caché para ningún tipo de memoria, por lo que cualquier cambio aquí será permanente.

El problema aquí es que si el arranque UEFI falla, lo volverá a colocar en el menú de selección de arranque (o en caso de que fuera un dispositivo en el orden de arranque predeterminado, se intenta el siguiente dispositivo). Como la mayoría de los cargadores de arranque UEFI no se limpian después de sí mismos en caso de falla de arranque, tan pronto como se inicie el siguiente menú, este código detectará que se ha asignado más memoria y, por lo tanto, decide que debe actualizar el mapa de memoria para que el El siguiente sistema operativo no se meterá en problemas. Desafortunadamente, esto se repite para cada falla de arranque, por lo que eventualmente hay un "límite estricto" de la frecuencia con la que puede fallar el arranque :-(

El código en TianoCore también tiene opciones de reserva en caso de que la variable falte o esté malformada (lo cual, si entiendo el código correctamente, puede costarle hasta dos reinicios adicionales), pero teniendo en cuenta el hecho de que Lenovo incluso incluyó una variable de copia de seguridad (que no existe en TianoCore), decidí no confiar en este respaldo y volví a la copia de seguridad más antigua que tenía, menos 800 MB para el tipo LoaderData, lo que me da una memoria reservada efectiva de hardware de 667 MB (suficiente por ahora). Y funciona :)

mapa de memoria resuelto

Lecciones aprendidas

  • Cuando un arranque UEFI falla y regresas al menú de arranque, nunca intentes arrancar nada más, mejor reinicia el sistema (espero que eso no active el código; si lo hace, actualizaré la publicación)

  • EFI Shell tiene un editor hexadecimal bastante utilizable para editar variables EFI y solucionar estos problemas

  • Incluso si su proveedor no puede o no quiere ayudarlo, sea terco; eventualmente encontrará una solución (incluso si meses después)

mihi
fuente