64비트 Memtest86+ BadRAM 모드에서 GRUB가 중단됩니까?

64비트 Memtest86+ BadRAM 모드에서 GRUB가 중단됩니까?

"를 추가하면바드람" 모델64비트 메모리 테스트 86+v6.10/v6.20이 나에게 준,그럽 2시작 시 완전히 멈춥니다.

묻다:

  • Badram 모드 주소가 표시된 "잘못된 주소"( 0x0ac...vs 0x62c...)와 다른 이유는 무엇입니까? 이러한 명백한 변화의 이유는 무엇입니까?
  • badram64비트 모드를 통과할 때 GRUB가 중단되는 이유는 무엇입니까 ?

이건 내 GRUB입니다...

# grub-mkimage --version
grub-mkimage (GRUB) 2.06-3~deb11u5

회사에서 자고...

초과하다"GRUB에 오신 것을 환영합니다!"메시지, 없음. 재부팅도 없고 키 입력에 대한 응답도 없으며 복구 셸도 없습니다.
시스템이 완료되었습니다."벽돌" - 복구하기 위해 복구 USB UEFI 부팅 스틱을 만들어야 했습니다. (BTW, 보안 부팅 하드웨어도 없고 서명된 grub 설치도 없으므로 변명의 여지가 없습니다.)

그래도. 나는 시스템 메모리에 대해 잘 모르고 Memtest의 16진수 숫자로 많은 것을 알 수 없습니다.
하지만 앞의 0을 잘라내고 이 32비트 숫자를 GRUB에 전달할 수는 없을 것 같습니다. 아니면 그렇게 할 수 있습니까? ...레딧에 있는 누군가그게 그런 일인 것 같아, 그러나 저처럼 이 숫자가 실제로 예상대로 작동하고 올바른 메모리 영역을 마스킹한다는 사실을 검증할 방법이 없습니다.

GRUB이 이 문제를 망친 이유는 무엇입니까? 마스킹이 쉽지 않은 메모리 영역인가요? 영역이 너무 작습니까? 특정 크기(예: 4K 페이지 크기)여야 합니까, 아니면 정렬되어야 합니까?

GRUB가 방금 고장 났을까요 badram? 아니면 하드웨어인가요? (그렇지 않을 것 같지만 이러한 ACPI 테이블에 대해서는 전혀 모르시겠죠?)

어쨌든, 나는 다른 사람들이 GRUB + 64비트 주소에서 동일한 문제를 보고한 사례를 많이 발견했습니다(분명히 내 GRUB만이 게으른 작업자는 아닙니다).

이 명령을 실행한 후(grub.cfg를 통해 또는 명령줄에서 대화형으로) 시스템이 중단되고 응답하지 않게 됩니다. badram 0x000000008c4e0800,0xffffffffffffcfe0

(GRUB 개발자로부터 아무런 응답을 받지 못했습니다.)

GRUB_BADRAM="0x00000000b3a9feec,0xfffffffffffffffc"

위와 같이 변경한 후에는 Grub 스플래시 화면도 볼 수 없습니다. 나타나야 할 때 컴퓨터가 멈추고 검은색 화면이 표시됩니다.

(그들도 고치지 못했어요)

이 모든 작업을 수행했지만 GRUB_BADRAM= 줄을 추가한 후 컴퓨터는 완벽하게 정상이었으며 오류 없이 부팅이 거부되었습니다. 시작되지 않으며 메뉴도 전혀 제공되지 않습니다.

(badram서로 다른 두 시스템에서 GRUB 매개변수가 실패합니다....)

...이 모드들 사이에 문제를 일으키는 관계가 있는지 또는 GRUB가 badram64비트 주소에서 작동하지 않는지 알 수 없습니다. 왜냐하면 찾을 수 없기 때문입니다.긍정적인"나에게 효과적"이라고 보고합니다. (이것들은 모두 Linux 형식이나 Linux 커널 매개변수를
사용하는 사람들에게 해당됩니다 .)memmap=memtest=

마침내 나는 badram성공할 것 같은 또 다른 남자를 찾았습니다 ...32비트 주소 표현 사용(64비트 시스템에서)?

그래서 다음에 한번 시도해 보려고 합니다.

답변1

딱히 답을 찾지는 못했지만, GRUB 소스 코드를 이해할 수 없었기 때문에 이제 badramGRUB 2의 명령은 다음과 같다고 확신합니다.방금 망가졌어64비트 주소 공간의 경우.

따라서 이 정보는 이 토끼굴에 빠진 다른 사람들을 위한 것입니다.
(tl;dr: badram사용할 수 없습니다! Linux memmap=커널 모드를 사용하세요.)

grub 명령줄을 적용한 후 badram 0xac4d96c0,0xfffffff8Linux의 e820 메모리 맵에서 볼 수 있는 것은 다음과 같은 조각화입니다(죄송하지만 SE에는 색상 차이 강조 표시가 없습니다).

--- a/e820
+++ b/e820
@@ -1,5 +1,7 @@
 [    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable
-[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bd6f5fff] usable
+[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000000ac4d9000-0x00000000ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000000ac4da000-0x00000000bd6f5fff] usable
 [    0.000000] BIOS-e820: [mem 0x00000000bd6f6000-0x00000000bd749fff] ACPI NVS
 [    0.000000] BIOS-e820: [mem 0x00000000bd74a000-0x00000000bd751fff] ACPI data
 [    0.000000] BIOS-e820: [mem 0x00000000bd752000-0x00000000bd752fff] ACPI NVS
@@ -28,4 +30,18 @@
 [    0.000000] BIOS-e820: [mem 0x00000000fed61000-0x00000000fed70fff] reserved
 [    0.000000] BIOS-e820: [mem 0x00000000fed80000-0x00000000fed8ffff] reserved
 [    0.000000] BIOS-e820: [mem 0x00000000fef00000-0x00000000ffffffff] reserved
-[    0.000000] BIOS-e820: [mem 0x0000000100001000-0x000000083effffff] usable
+[    0.000000] BIOS-e820: [mem 0x0000000100001000-0x00000001ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000001ac4d9000-0x00000001ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000001ac4da000-0x00000002ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000002ac4d9000-0x00000002ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000002ac4da000-0x00000003ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000003ac4d9000-0x00000003ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000003ac4da000-0x00000004ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000004ac4d9000-0x00000004ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000004ac4da000-0x00000005ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000005ac4d9000-0x00000005ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000005ac4da000-0x00000006ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000006ac4d9000-0x00000006ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000006ac4da000-0x00000007ac4d8fff] usable
+[    0.000000] BIOS-e820: [mem 0x00000007ac4d9000-0x00000007ac4d9fff] unusable
+[    0.000000] BIOS-e820: [mem 0x00000007ac4da000-0x000000083effffff] usable

사용 가능한 메모리의 큰 덩어리는 여러 개의 작은 영역으로 조각화되어 있습니다. 이는 0xfffffff8우리가 GRUB에 전달하는 주소 마스크가 논리적으로 0x00000000fffffff864비트 공간에 있음을 의미합니다.

그런 다음 커널은 이러한 모든 "사용할 수 없는" 버그를 시스템 RAM에서 RAM 버퍼로 매핑하여 기록하므로 패턴이 더욱 명확해집니다.

[    0.615775] e820: reserve RAM buffer [mem 0xac4d9000-0xafffffff]
[    0.615779] e820: reserve RAM buffer [mem 0x1ac4d9000-0x1afffffff]
[    0.615780] e820: reserve RAM buffer [mem 0x2ac4d9000-0x2afffffff]
[    0.615781] e820: reserve RAM buffer [mem 0x3ac4d9000-0x3afffffff]
[    0.615782] e820: reserve RAM buffer [mem 0x4ac4d9000-0x4afffffff]
[    0.615783] e820: reserve RAM buffer [mem 0x5ac4d9000-0x5afffffff]
[    0.615784] e820: reserve RAM buffer [mem 0x6ac4d9000-0x6afffffff]
[    0.615785] e820: reserve RAM buffer [mem 0x7ac4d9000-0x7afffffff]

0xac4d9000 그래서 우리는 실제로 badram 주소 인 에서 0xac4d9fff... 까지 공간을 예약하고 이를 아래쪽 경계에 정렬한 다음 작은 비트 오류 주위에 멋진 4KB 커널 페이지 크기 구멍을 뚫습니다. (누군가가 대포알로 구멍을 뚫어 벽에 있는 거미를 제거했다고 상상해 보십시오. 실제로 그 방법으로 문제가 해결된 것 같습니다.)
0xac4d96c0

...그런 다음 시스템 메모리가 부족해질 때까지 계속해서 구멍을 뚫고0x1ac4d9000 , , ...에 0x2ac4d9000동일한 크기의 공간을 확보합니다 . (지금0x3ac4d9000
저것약간의 스프레이가 추가된 대포알 발사기처럼 보입니다! )

하지만 이것들은 모두 작은 구멍이고 벽은 크므로 실제로는 모든 것이 괜찮을 것입니다. 하지만 패턴이 실제로 이 예보다 훨씬 크다 면 badram어떻게 될까요 ? 아니면 Memtester가 우리에게 피해야 할 많은 장소를 제공합니까? 그렇다면 이 문제는 우리의 메모리 매핑을 체로 바꿉니다!

따라서 badram수행 중인 작업을 알지 못하는 경우에는 64비트 시스템에서 GRUB를 사용하지 마십시오.

대신 Linux의 완벽한 대안은 memmap=명령줄 인수를 사용하는 것입니다. 또한 이를 통해 GRUB에서 생성된 4KB 블록보다 작은 구멍을 뚫을 수 있으며 EFIStub과 같은 다른 부트로더와 함께 사용할 수도 있습니다. (또 다른 옵션은 어떻게든 자신의 수정된 커널을 전달하는 것입니다.e820메모리 맵— 하지만 방법을 안다면 아마도 이 글을 읽고 있지 않을 것입니다. )

관련 정보