Quale dispositivo hardware consumava 1,4 GB della mia RAM da 4 GB e ora improvvisamente dopo che nessuna modifica hardware ha assorbito 2,2 GB?


17

Questa è più o meno una continuazione di

Quale dispositivo hardware consuma 1,4 GB della mia RAM da 4 GB?

Mentre ho più o meno accettato la soluzione lì che per qualche motivo misterioso, dopo un aggiornamento del BIOS la mia scheda grafica ha improvvisamente riservato 1,4 GB di memoria (invece di prenotarla dinamicamente), ora (2 settimane dopo la scadenza della garanzia del mio notebook), dopo aver fatto niente di speciale tranne forse provare alcuni CD live Linux (alcuni dei quali loopback avviati da una chiave USB) e alcune volte cambiando le opzioni di avvio da UEFI a BIOS CSM e viceversa, all'improvviso ne vengono riservati altri 800 MB.

E solo per chiarire, questo non è un problema di Windows: sia memtest che Linux vedono anche quella quantità di memoria. Solo Lenovo Diagnostics rileva ancora 4 GB di memoria (e lo ha testato e non ha riscontrato errori)

Ecco le schermate dallo strumento di diagnostica del driver grafico e dal monitoraggio delle risorse:

Nuova situazione

(Per riferimento, prima di 1435 MB erano riservati all'hardware e la memoria grafica massima era di 1138 MB).

Il che ovviamente rende il problema molto più urgente, dal momento che metà della mia memoria è "riservata all'hardware".

L'output di meminfo -rnon è cambiato molto (il quarto intervallo di memoria si è ridotto di quasi 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

Dato che non mi fido più di UEFI dopo le storie precedenti con Samsung e Lenovo, sono entrato nella shell di EFI e ho scaricato altre informazioni. Non so davvero di cosa si tratti, ma forse questo aiuta qualcuno:

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

(come noob UEFI, cosa significa BS_data?)

dh -d

http://pastebin.com/KH1rFehj

(dh -v viene eseguito in un ciclo infinito e non può essere scaricato ...)

dmpstore (ho modificato il codice Product Key di Windows 8):

http://pastebin.com/iYPcbpEY

Qualche idea o altro modo per recuperare questa memoria (qualcuno sa se esiste un modo operativo per ripristinare completamente la NVRAM UEFI senza rendere la macchina non avviabile?) Sono molto apprezzati ...

EDIT1

Quando si avvia Linux in modalità UEFI, la maggior parte della memoria è utilizzabile.

/ Proc / meminfo

/ Proc / iomem

dmesg

Ma quando lo si avvia in modalità BIOS di compatibilità (tramite CSM) non è:

/ Proc / iomem

dmesg

Quindi probabilmente un bug nel CSM? (Ma sorprende ancora che all'improvviso arrivi ...)

Poiché il mio sistema operativo principale è Windows (7), suppongo che dovrei eseguire l'aggiornamento a 8 (.1) ed eseguire una reinstallazione completa su una partizione GPT per utilizzare UEFI. E considerando i problemi che UEFI sta (ancora) causando regolarmente, non sono sicuro di voler seguire questa strada ...

EDIT2

Ho anche pubblicato una discussione sui forum Lenovo a riguardo, ma finora nessuna risposta: http://forums.lenovo.com/t5/R-and-L-Series-ThinkPad-Laptops/L530-2481-3SG-First-1 -4-GB-RAM-di-4-GB-riservato-by-hardware e / td-p / 1.539.272

Inoltre (solo per escludere questa causa) ho rimosso la batteria CMOS, ma tranne alcune impronte digitali scure che ho trovato sulla "porta inferiore" (coperchio dietro il quale sono nascosti il ​​disco rigido e la RAM) non mi ha reso più saggio.

Edit3

Non molte notizie, un ragazzo di Lenovo ha seguito il mio post sul forum e ha detto che alcuni ingegneri lo daranno. Speriamo per il meglio.

edit4

Altri 21 MB hanno morso la polvere, questa volta per aver tentato di avviare una distro Linux tramite UEFI Secure Boot ... Maggiori dettagli nel thread sopra menzionato nei forum Lenovo.

più memoria persa


Hai qualche BIOS opzionale relativo alla memoria? In particolare qualche opzione di rimappatura della memoria?
David Schwartz,

No, ad eccezione della disabilitazione della protezione della memoria (DEP) non esistono tali opzioni. E soprattutto sono sicuro al 100% di non aver modificato alcuna opzione del BIOS tranne la priorità di avvio tra 1,4 GB e 2,2 GB consumati.
mihi,

Sono un po 'confuso dalla domanda, dato che Win7 può comunque utilizzare solo 3,5 GB o meno della tua memoria. Hai provato i suggerimenti in questo articolo? support.microsoft.com/kb/978610
Debra,

2
@Debra È Win7 a 64 bit, che (di sicuro) può utilizzare> 3,5 GB (al lavoro ho una macchina con 12 GB che esegue Win7). E sì, l'ho fatto (4 mesi fa quando ho pubblicato la mia ultima domanda)
mihi,

Quale versione del BIOS stai attualmente utilizzando e quale era la precedente? Hai già provato a ripristinare le impostazioni predefinite del BIOS? Qual è la quantità di memoria installata / utilizzabile visualizzata nella finestra di dialogo delle proprietà del sistema?
and31415

Risposte:


19

Risolto :)

La causa sembra essere una strana caratteristica nell'implementazione UEFI, che può essere vista anche nell'implementazione Open Source di TianoCore:

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

Alla fine l'ho trovato dopo aver differenziato i miei dump delle variabili EFI dopo l'ultima "perdita" di 21 MB e aver trovato variabili interessanti:

Prima di perdere gli ultimi 21 MB di 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...........*

Dopo averli persi

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...........*

Perché questo è interessante: tutto il tempo che ho testato cose, aggiornato e declassato il BIOS, modificato impostazioni, ecc., Queste variabili non sono mai cambiate (e ho assunto che immagazzinassero alcune informazioni sulla marca / modello della mia RAM installata o simili).

Ora che la mia memoria è diminuita, è stato eseguito il backup del valore di MemoryTypeInformation come MemoryTypeInformationBackup (sovrascrivendo il vecchio backup) e esattamente un DWORD nella modifica del valore - all'offset 0x34: il vecchio valore era 0x4000, il nuovo valore è 0x5582. La differenza è 0x1582 o 5506 in decimale, che corrisponde esattamente al numero di pagine (blocchi 4K) che la mia memoria si è ridotta l'ultima volta.

Andare oltre: il vecchio valore di MemoryTypeInformation e MemoryTypeInformationBackup differisce anche esattamente in un valore (con un offset diverso, 0x44). Quando si confrontano nuovamente i loro valori, 0x2F4C0 o 193728 in decimale, è esattamente il numero di pagine che la mia memoria ha ridotto il tempo precedente (quando l'indirizzo iniziale è cambiato da 871F2000 a 57D32000).

Confrontandolo con il suddetto codice TianoCore, improvvisamente ha perfettamente senso:

Questo codice viene attivato ogni volta che il sistema sta per avviare un'opzione di avvio e verifica che le diverse aree di memoria UEFI abbiano meno pagine allocate rispetto a quelle archiviate in MemoryTypeInformation. In caso contrario, la mappa di memoria non è corretta e la variabile viene aggiornata (con il 125% di ciò che è attualmente allocato) e viene avviato un riavvio, in modo che la mappa di memoria possa essere ricostruita dagli ultimi dati. Si noti che l'implementazione non ridurrà mai le dimensioni memorizzate nella cache per alcun tipo di memoria, quindi qualsiasi modifica qui sarà permanente.

Il problema qui è che se l'avvio UEFI non riesce, ti riporterà nel menu di selezione dell'avvio (o nel caso in cui fosse un dispositivo nell'ordine di avvio predefinito, viene provato il dispositivo successivo). Poiché la maggior parte dei caricatori di avvio UEFI non si ripulisce dopo se stessi in caso di errore di avvio, non appena viene avviato il menu successivo, questo codice rileverà che è stata allocata una quantità maggiore di memoria e quindi decide di aggiornare la mappa di memoria in modo che il il seguente sistema operativo non avrà problemi. Sfortunatamente questo si ripete per ogni errore di avvio, in modo che alla fine vi sia un "limite rigido" per quanto spesso si può fallire l'avvio :-(

Il codice in TianoCore ha anche opzioni di fallback nel caso in cui la variabile sia mancante o non valida (il che, se ho capito bene il codice può costare fino a due riavvii aggiuntivi, però), ma considerando il fatto che Lenovo includeva anche una variabile di backup (che non esiste in TianoCore), ho deciso di non fidarmi di questo fallback e sono tornato al backup più vecchio che avevo, meno 800 MB per il tipo LoaderData, che mi dà una memoria riservata hardware di 667 MB efficace (abbastanza buono per ora). E funziona :)

mappa di memoria risolta

Lezioni imparate

  • Quando un avvio UEFI fallisce e torni al menu di avvio, non provare mai ad avviare nient'altro, resetta meglio il sistema (spero che non attiverà il codice allora; in caso affermativo, aggiornerò il post)

  • EFI Shell ha un editor esadecimale abbastanza utilizzabile per modificare le variabili EFI e risolvere questi problemi

  • Anche se il tuo fornitore non può o non vuole aiutarti - resta testardo; alla fine troverai una soluzione (anche se mesi dopo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.