1.4GB의 4GB RAM을 사용하는 하드웨어 장치는 무엇이며 하드웨어 변경이 없으면 갑자기 2.2GB를 소비합니까?


17

이것은 다소의 연속입니다

1.4GB의 4GB RAM을 사용하는 하드웨어 장치는 무엇입니까?

몇 가지 신비한 이유 때문에 BIOS를 업그레이드 한 후 그래픽 어댑터가 갑자기 1.4GB의 메모리를 (동적으로 예약하지 않고) 예약했습니다 (노트북의 보증 기간이 만료 된 후 2 주). Linux 라이브 CD 몇 개 (USB 키에서 루프백 부팅)를 시도하고 UEFI에서 BIOS CSM으로 부팅 옵션을 변경 한 후 몇 번이나 변경하면 갑자기 800MB 이상이 예약됩니다.

그리고 명확하게 말하면, 이것은 Windows 문제가 아닙니다. memtest와 Linux 모두 해당 메모리 양을 봅니다. Lenovo Diagnostics만이 여전히 전체 4GB의 메모리를 확인합니다 (테스트 한 후 오류가 없음)

다음은 그래픽 드라이버 진단 도구 및 리소스 모니터의 스크린 샷입니다.

새로운 상황

참고로 1435MB 이전에는 하드웨어 용으로 예약되었으며 최대 그래픽 메모리는 1138MB였습니다.

내 메모리의 절반이 "하드웨어에 의해 예약되어"있기 때문에 분명히 문제를 훨씬 더 시급하게 만듭니다.

출력은 크게 meminfo -r바뀌지 않았습니다 (4 번째 메모리 범위는 거의 800MB 줄었습니다).

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

삼성과 레노버와의 이전 이야기 이후 더 이상 UEFI를 신뢰하지 않기 때문에 EFI 셸에 들어가서 몇 가지 정보를 더 버렸습니다. 나는 이것이 무엇에 관한 것인지 정말로 모른다. 그러나 아마도 이것은 누군가를 도울 것이다.

mm

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

(UEFI noob으로서 BS_data는 무엇을 의미합니까?)

dh -d

http://pastebin.com/KH1rFehj

(dh -v는 무한 루프로 실행되며 덤프 할 수 없습니다 ...)

dmpstore (Windows 8 제품 키를 편집했습니다) :

http://pastebin.com/iYPcbpEY

이 메모리를 되 찾을 수있는 아이디어 나 다른 방법 (기계를 부팅 할 수있게하지 않고 UEFI NVRAM을 완전히 재설정하는 효과적인 방법이 있는지 아는 사람이 있습니까?)

편집 1

UEFI 모드에서 Linux를 부팅 할 때 대부분의 메모리를 사용할 수 있습니다.

/ proc / meminfo

/ proc / iomem

dmesg

그러나 CSM을 통해 호환성 BIOS 모드로 부팅 할 때는 다음이 아닙니다.

/ proc / iomem

dmesg

아마도 CSM의 버그일까요? (그러나 여전히 갑자기 등장한다는 것은 놀라운 일입니다 ...)

기본 OS가 Windows (7)이므로 UEFI를 사용하려면 8 (.1)로 업그레이드하고 GPT 파티션에서 전체 재설치를 수행해야한다고 생각합니다. 그리고 UEFI가 (여전히) 규칙적으로 발생하는 문제를 고려할 때 해당 경로로 가고 싶은지 확실하지 않습니다 ...

편집 2

나는이에 대한 레노버 포럼에 스레드를 게시,하지만 응답 지금까지 : http://forums.lenovo.com/t5/R-and-L-Series-ThinkPad-Laptops/L530-2481-3SG-First-1 하드웨어별로 예약 된 -4-GB RAM-// td-p / 1539272

또한 (이 원인을 제외하고) CMOS 배터리를 제거했지만 "맨 아래 도어"(하드 디스크와 RAM이 숨겨져있는 덮개)에서 발견 된 일부 어두운 지문을 제외하고는 더 현명하지 않았습니다.

편집 3

별로 뉴스는 아니지만 Lenovo의 일부 직원이 포럼에서 내 게시물을 팔로우하여 일부 엔지니어가 살펴볼 것이라고 말했습니다. 최선을 기대해 보자구.

편집 4

또 다른 21MB는 먼지를 깨뜨 렸습니다. 이번에는 UEFI 보안 부팅을 통해 Linux 배포판을 부팅하려고 시도했습니다. 위에서 언급 한 Lenovo 포럼 스레드에 대한 자세한 내용.

더 많은 메모리 손실


메모리와 관련된 BIOS 옵션이 있습니까? 특히 메모리 리매핑 옵션이 있습니까?
David Schwartz

메모리 보호 (DEP) 비활성화를 제외하고는 그러한 옵션이 없습니다. 특히 1.4GB에서 2.2GB 사이의 부팅 우선 순위를 제외하고는 BIOS 옵션을 변경하지 않았다는 확신이 있습니다.
mihi

Win7이 어쨌든 3.5GB 이하의 메모리 만 사용할 수 있다는 점을 감안할 때이 질문에 약간 기뻐합니다. 이 기사의 제안을 시도해 보셨습니까? support.microsoft.com/kb/978610
Debra

2
@ Debra 그것은 64 비트 Win7입니다. (확실히)> 3.5GB를 사용할 수 있습니다 (12GB가 Win7을 실행하는 컴퓨터가 있습니다). 그리고 네, (4 개월 전 마지막 질문을 게시했을 때)
mihi

현재 사용중인 BIOS 버전과 이전 버전은 무엇입니까? BIOS를 기본 설정으로 이미 재설정 했습니까? 시스템 등록 정보 대화 상자에 설치 / 사용 가능한 메모리의 양은 얼마입니까?
and31415

답변:


19

해결 :)

원인은 UEFI 구현에서 이상한 기능인 것 같습니다.이 기능은 오픈 소스 TianoCore 구현에서도 볼 수 있습니다.

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

마지막 21MB "손실"이후 EFI 변수 덤프를 비교하여 흥미로운 변수를 찾은 후 궁극적으로 발견했습니다.

마지막 21MB의 메모리를 잃기 전에

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

그들을 잃은 후

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

이것이 흥미로운 이유 : 물건을 테스트하고, BIOS를 업그레이드 및 다운 그레이드하고, 설정을 변경하는 등 이러한 변수는 변하지 않았습니다 (그리고 설치된 RAM의 제조사 / 모델 등에 관한 정보를 저장한다고 가정했습니다).

메모리가 줄어 들었으므로 MemoryTypeInformation의 값이 MemoryTypeInformationBackup (이전 백업 덮어 쓰기)으로 백업되었으며 값의 정확히 하나의 DWORD가 오프셋 0x34에서 변경되었습니다. 이전 값은 0x4000이고 새 값은 0x5582입니다. 그 차이는 십진수로 0x1582 또는 5506이며, 지난 번에 메모리가 축소 된 페이지 수 (4K 블록)와 정확히 일치합니다.

한 단계 더 나아가 : MemoryTypeInformation과 MemoryTypeInformationBackup의 이전 값도 정확히 하나의 값이 다릅니다 (0x44와는 다른 오프셋에서). 값을 다시 비교할 때 0x2F4C0 또는 193728 (10 진수)은 내 기억이 이전 시간 (시작 주소가 871F2000에서 57D32000으로 변경되었을 때)에서 줄어든 페이지 수입니다.

이것을 앞에서 언급 한 TianoCore 코드와 비교하면 갑자기 완벽한 의미가 있습니다.

이 코드는 시스템이 부팅 옵션을 부팅하려고 할 때마다 트리거되며 다른 UEFI 메모리 영역에 MemoryTypeInformation에 저장된 것보다 할당 된 페이지 수가 적은지 확인합니다. 그렇지 않은 경우 메모리 맵이 올바르지 않고 변수가 현재 할당 된 것의 125 %로 업데이트되고 재부팅이 트리거되어 최신 데이터에서 메모리 맵을 다시 작성할 수 있습니다. 구현시 메모리 유형에 대한 캐시 크기가 절대 줄어들지 않으므로 여기에서 변경하면 영구적입니다.

여기서 UEFI 부팅에 실패하면 부팅 선택 메뉴로 돌아갑니다 (또는 기본 부팅 순서의 장치 인 경우 다음 장치가 시도 됨). 다음 메뉴가 부팅 되 자마자 부팅 실패시 대부분의 UEFI 부팅 로더가 자체적으로 정리되지 않기 때문에이 코드는 더 많은 메모리가 할당되었음을 감지하여 메모리 맵을 업데이트해야한다고 결정합니다. 다음 OS는 문제가되지 않습니다. 불행히도 이것은 모든 부팅 실패에 대해 반복되므로 결국 부팅에 실패 할 수있는 빈도에 대한 "하드 한계"가 있습니다.

TianoCore의 코드에는 변수가 없거나 변형 된 경우 (대체 코드를 올바르게 이해하면 최대 두 번의 추가 재부팅 비용이들 수 있지만) Lenovo에 백업 변수가 포함되어 있다는 사실을 고려할 때 대체 옵션이 있습니다. TianoCore에 존재하지 않는 경우)이 폴백을 신뢰하지 않기로 결정했으며 LoaderData 유형의 경우 800MB를 뺀 가장 오래된 백업으로 되돌 렸습니다. 이는 효과적인 667MB 하드웨어 예약 메모리를 제공합니다 (지금은 충분합니다). 그리고 그것은 작동합니다 :)

해결 된 메모리 맵

교훈

  • UEFI 부팅이 실패하고 부팅 메뉴로 돌아 가면 다른 부팅을 시도하지 말고 시스템을 다시 설정하십시오. 코드를 트리거하지 않기를 바랍니다. 그렇다면 게시물을 업데이트합니다.

  • EFI 셸에는 EFI 변수를 편집하고 이러한 문제를 해결하는 데 사용할 수있는 16 진 편집기가 있습니다.

  • 벤더가 당신을 도울 수 없거나 도와주고 싶지 않더라도 고집을 부리지 마십시오. 결국 당신은 해결책을 찾을 것입니다 (몇 달 후에도)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.