"를 추가하면바드람" 모델64비트 메모리 테스트 86+v6.10/v6.20이 나에게 준,그럽 2시작 시 완전히 멈춥니다.
묻다:
- Badram 모드 주소가 표시된 "잘못된 주소"(
0x0ac...
vs0x62c...
)와 다른 이유는 무엇입니까? 이러한 명백한 변화의 이유는 무엇입니까? badram
64비트 모드를 통과할 때 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가 badram
64비트 주소에서 작동하지 않는지 알 수 없습니다. 왜냐하면 찾을 수 없기 때문입니다.긍정적인"나에게 효과적"이라고 보고합니다. (이것들은 모두 Linux 형식이나 Linux 커널 매개변수를
사용하는 사람들에게 해당됩니다 .)memmap=
memtest=
마침내 나는 badram
성공할 것 같은 또 다른 남자를 찾았습니다 ...32비트 주소 표현 사용(64비트 시스템에서)?
그래서 다음에 한번 시도해 보려고 합니다.
답변1
딱히 답을 찾지는 못했지만왜, GRUB 소스 코드를 이해할 수 없었기 때문에 이제 badram
GRUB 2의 명령은 다음과 같다고 확신합니다.방금 망가졌어64비트 주소 공간의 경우.
따라서 이 정보는 이 토끼굴에 빠진 다른 사람들을 위한 것입니다.
(tl;dr: badram
사용할 수 없습니다! Linux memmap=
커널 모드를 사용하세요.)
grub 명령줄을 적용한 후 badram 0xac4d96c0,0xfffffff8
Linux의 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에 전달하는 주소 마스크가 논리적으로 0x00000000fffffff8
64비트 공간에 있음을 의미합니다.
그런 다음 커널은 이러한 모든 "사용할 수 없는" 버그를 시스템 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
메모리 맵— 하지만 방법을 안다면 아마도 이 글을 읽고 있지 않을 것입니다. )