Chạy Windows với RAM bị lỗi


25

Có thể chạy Windows (7, x64) với mô-đun RAM bị lỗi không? Chính xác hơn, có cách nào đó để bảo Windows không phân bổ một địa chỉ xấu hoặc khối địa chỉ đã biết?

Đối với Linux, có BadRAM . Có một triển khai hiện có cho Windows? Điều đó thậm chí có thể với kernel của Windows (NT 6.1) không? Có lẽ một trình điều khiển chế độ kernel?


4
@ekaj Nếu chỉ một tuần sau khi mua, có thể thay thế nó trong bảo hành? ;)
Bob

3
Trên thực tế đó là ý tưởng thông minh nhất, Nó đã bị hỏng, hãy nhờ họ sửa chữa nó
Journeyman Geek

Câu trả lời:


15

Bob, có ba phần cho câu hỏi của bạn. Tôi sẽ giải quyết từng cái một.

Chạy Windows với bộ nhớ kém

Thực sự có thể chạy Windows 7 với một mô-đun bị lỗi. Tùy thuộc vào vị trí của các thành phần xấu và vị trí mô-đun nằm trong các ngân hàng DIMM của bạn, Windows 7 sẽ chạy như không có gì miễn là nó không cố chạm vào các phần xấu của bộ nhớ. Vì vậy, lý tưởng nhất là bạn di chuyển mô-đun bị lỗi càng xa càng tốt khỏi ngân hàng 0. Đương nhiên, nếu đây là mô-đun duy nhất của bạn, bạn sẽ không gặp may.

Chặn các vùng bộ nhớ xấu trong Windows

Trên các hệ điều hành x86 (32 và 64 bit), bộ nhớ được quản lý bởi kernel. Như bạn đã đề cập, BadMem có thể chặn các thành phần bộ nhớ xấu trong Linux. Nó hoạt động bằng cách hướng dẫn kernel khóa các địa chỉ bộ nhớ mà bạn đã chỉ định. Điều này có hiệu quả ngăn Linux không bao giờ giải quyết các địa chỉ đó khi phân bổ (và giải phóng) bộ nhớ. Nhưng để làm được điều này, BadMem cần vá kernel. BadMem không gì khác hơn là một bản vá kernel mà bạn cấu hình trước khi áp dụng.

Bây giờ, bạn không có khả năng đó trên Windows. Bạn không thể vá kernel. Phát triển trình điều khiển chế độ kernel sẽ không giúp ích gì cho bạn, vì kernel Windows sẽ không bao giờ để trình điều khiển của bạn được ưu tiên hơn kiến ​​trúc quản lý bộ nhớ của nó (có thể hiểu được như vậy).

Vì lý do này, bạn không thể hướng dẫn các cửa sổ theo bất kỳ cách nào để không sử dụng các địa chỉ bộ nhớ nhất định. Cách duy nhất là Microsoft sẽ vá kernel cho trường hợp của bạn một cách cụ thể. Không có khả năng.

Sự lan truyền của các địa chỉ bộ nhớ xấu

Không có nhiều lý do tại sao một mô-đun bộ nhớ có thể chứa địa chỉ xấu. Cuối cùng, tất cả đều có lỗi trong dây chuyền sản xuất, cho rằng nó không duy trì được thiệt hại trước khi vào máy tính của bạn. Trái ngược với ổ cứng, không có bộ phận có thể di chuyển trong các mô-đun bộ nhớ, như bạn đã biết. Vì vậy, các khu vực xấu không có xu hướng lây lan như trường hợp của các khu vực ổ cứng.

Tuy nhiên, phần mềm kiểm tra bộ nhớ không thể đánh lừa được. Nó có thể (và phổ biến) để nó vượt qua một số địa chỉ thực sự xấu. Vì vậy, bộ nhớ xấu có thể mang lại ấn tượng "lây lan" vì ngày càng nhiều địa chỉ được tiết lộ là xấu. Vì lý do này, các công cụ như BadMem tiết lộ điểm yếu của họ, bởi vì tự nhiên họ chỉ có thể xử lý các địa chỉ mà bạn hướng dẫn họ.

Không ai có thể tiến hành kiểm tra kỹ lưỡng mô-đun bộ nhớ và xác định tất cả các địa chỉ bộ nhớ xấu, sau đó khóa chúng và kết thúc với mô-đun bộ nhớ "tốt". Cách dễ nhất để làm là xem xét một mô-đun có địa chỉ xấu là một mô-đun bị lỗi trong suốt và do đó không được tin cậy.

Điều này có nghĩa là, nhiều như BadMem là một đề xuất hấp dẫn, thực tế nó không phải là một giải pháp cho vấn đề bộ nhớ xấu. Nhiều khả năng sau đó bạn sẽ vẫn không kết thúc với một hệ điều hành cố đọc một khu vực xấu và gặp sự cố với lỗi dừng. Một mô-đun xấu là một mô-đun xấu là một mô-đun xấu.


Có khá nhiều câu trả lời hay, nhưng tôi sẽ chấp nhận điều này vì đã đưa ra một lý do chính đáng tại sao không làm như vậy. Hạt nhân Windows có thể được yêu cầu không sử dụng qua một địa chỉ nhất định, như những người khác đã lưu ý, nhưng khi lỗi nằm ở giữa không gian địa chỉ, nó giống như sử dụng rìu khi bạn muốn một scapel ... mong muốn kiểm soát tốt hơn nhưng, Rõ ràng là không thể. Thật đáng tiếc.
Bob

8
Không hoàn toàn chính xác; nó tốt để hướng dẫn Windows để tránh các địa chỉ nhất định (chính xác hơn, nhất định số khung trang). Chức năng được thiết kế cho bộ nhớ ECC, trong đó Windows có thể phát hiện các lỗi có thể xảy ra và đánh dấu các PFN đó là xấu, nhưng có thể thêm thủ công PFN vào danh sách: superuser.com/a/490522/117590 - không thực tế lắm. Vì vậy, phải, thay thế vẫn là lựa chọn tốt nhất: P
Bob

17

Windows BCD (Dữ liệu cấu hình khởi động) thực sự có một {badmemory}đối tượng. Dường như các địa chỉ bộ nhớ được "dự đoán là không thành công" bởi bộ nhớ ECC sẽ được liệt kê ở đây và không được sử dụng bởi hệ điều hành.

Đối {badmemory}tượng chấp nhận một phần tử BadMemoryList(loại BCD 0x1700000a), là danh sách các số nguyên có thể được nhập dưới dạng hex, cách nhau bởi khoảng trắng. Tôi đoán có thể chèn thủ công các địa chỉ bộ nhớ xấu được tìm thấy bởi memtest86 cho thành phần này - nhưng tôi chưa kiểm tra điều này. Rõ ràng, nó chấp nhận số khung của trang, là địa chỉ thực tế chia cho 4096. Thật không may, các địa chỉ / PFN này có thể không khớp với các số được báo cáo bởi chẩn đoán bộ nhớ. Chỉnh sửa thủ công có thể được thực hiện với Visual BCD Editor .

Trong mọi trường hợp, thẻ nhớ bị lỗi nên được thay thế như được chỉ ra bởi các câu trả lời khác. Đây chỉ là một ghi chú về một cách có thể để giải quyết vấn đề (tạm thời?).


Một hướng dẫn định dạng tốt hơn của tất cả mọi thứ bạn nói có sẵn ở đây . Mặc dù công việc tốt đẹp.
mirh

13

Windows BCD có {badmemorylist}{badmemoryaccess}các đối tượng. Bạn nên đặt các trang bộ nhớ đầu tiên thành xấu được phân tách bằng dấu cách (ví dụ bcdedit /set badmemorylist 1499543 1434007:) và trang thứ hai thành No( bcdedit /set badmemoryaccess No)

Hãy nhớ rằng kích thước trang bộ nhớ trong các cửa sổ thường 4KB

Đã thử nghiệm trong windows 7 và nó hoạt động tốt

Bạn có thể kiểm tra cài đặt của mình bằng Rammap bởi Sysiternals

PS tôi đã có thông tin đó từ "Windows Internals Book" chapter 10


13

Tôi gặp vấn đề về RAM trong máy tính bảng có SoC. Bộ nhớ được hàn hoặc tích hợp vào SoC và không thể thay thế.

Tôi đang ở Argentina và người bán đang ở Trung Quốc, và chi phí vận chuyển và thời gian, không có nghĩa gì để gửi bảo hành.

Tôi quản lý một vài hit.

Chìa khóa để truyền các tham số bộ nhớ bị hỏng là:

  1. địa chỉ trong memtest86 khớp địa chỉ được sử dụng trong Windows.
  2. phải đánh dấu các trang đầy đủ của 4KBytes.
  3. trong memtest 0x10000000tương ứng với 0x10000 trong Windows
  4. trong memtest 0x00001000tương ứng với 0x1 trong Windows
  5. có nghĩa là: Số trang trong windows loại bỏ 3 số thập lục phân memtest cuối cùng.
  6. có nghĩa là: các cửa sổ loại bỏ các số không ở bên trái.
  7. xem xét 5 và 6, để tránh lỗi trong số trang.
  8. tuyên bố đúng là: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAlỗi trong memtest từ 0x000B7000 đến 0x000BAFFF. Lưu ý rằng bạn không thể đặt một loạt các ký ức, nhưng tất cả các trang từng cái một
  9. không thể thêm các trang, tất cả các trang nên được đánh dấu trong cùng một lệnh. Nếu một trang mới, thêm ghi đè cũ. Tôi quản lý để thêm 4096 trang trong một lệnh duy nhất. Tôi đã không thử nó nhiều hơn.
  10. bcdedit /enum {badmemory}, hiển thị danh sách các trang được đánh dấu.
  11. bcdedit /set badmemoryaccess no ngăn chặn các trang được đánh dấu được sử dụng
  12. cần phải khởi động lại sau khi đánh dấu các trang và xóa quyền truy cập.

1
Tôi đã phải xóa khoảng trắng giữa lệnh /và lệnh để nó hoạt động, vì vậy thay vào bcdedit / enum {badmemory}đó, nó sẽ bcdedit /enum {badmemory}giống với các lệnh khác
flagg19

Nó hoạt động, nhưng thật không may, giới hạn cmd trên Windows bị giới hạn ở 8191 và tôi không thể chặn tất cả các trang bộ nhớ xấu. Tôi không thể tìm thấy một cách giải quyết tốt để giải quyết điều này. Có cách nào để ghi lại phạm vi của các trang? Tôi nên chặn tất cả các trang từ 0x714bc8 đến 0x71cbd0 là quá nhiều trang! Tôi đã làm gì vậy? Tôi đã chạy thử nghiệm đơn giản nhất (# 0 và # 1) và nó có phạm vi lỗi bộ nhớ hạn chế hơn. Nó chạy tốt cho đến nay, không còn màn hình xanh nữa. Nhưng tôi biết tôi đã không chặn mọi thứ cần thiết.
Felipe

3

Theo như tôi biết, cách duy nhất để làm điều này là sử dụng lệnh BurnMem có thể giới hạn một cách giả tạo số lượng RAM sử dụng.


2
Hmm .. đó là một lựa chọn thú vị. Có lẽ maxmem, vì rõ ràng burnmemkhông giới hạn địa chỉ vật lý tối đa trong khi maxmemđó. Vista và 7 tương đương sẽ là truncatememory. Mặc dù đây là một giải pháp khả thi, nhưng có một phương pháp chính xác hơn cho các trường hợp bộ nhớ bị lỗi ở giữa hoặc bắt đầu không gian địa chỉ và chặn mọi thứ sau khi không mong muốn?
Bob

@Bob - Lý do bạn không thể thay thế bộ nhớ xấu là lý do tại sao?
Ramhound

@Ramhound Tôi có thể, nếu tôi muốn. Nhưng điều đó sẽ mất thời gian. Ngay bây giờ, tôi đang chạy với một nửa bộ nhớ ban đầu, không tốt cho máy ảo của tôi. Để có được một mô-đun mới hoặc thay thế thực sự hoạt động có thể mất một vài tuần. Nếu một giải pháp phần mềm cho phép tôi làm điều này trong hai giờ hoặc ít hơn, tôi sẽ coi đó là thời gian chi tiêu tốt và một cái gì đó mới học được. Tôi sẽ chấp nhận câu trả lời này (bộ nhớ của tôi đã thất bại ngay ở cuối không gian địa chỉ) nhưng nếu ai đó có một giải pháp linh hoạt hơn, tôi sẽ thích điều đó hơn cho sự tái tạo trong tương lai.
Bob

@Bob - Chỉ cần đọc vào đây khá nhiều, có vẻ như không thể. Điều này là do BadRam sử dụng memtest để hướng dẫn kernel loại trừ các địa chỉ xấu khỏi bộ tải khởi động, Windows không thể làm điều này vì hiện tại không có cách nào để nó xử lý các địa chỉ xấu để loại trừ theo cách mà kernel đã vá BadRam có thể .
Oliver G

3

Nhìn vào tiện ích này: https://github.com/prsyahmi/BadMemory

Nó rất dễ sử dụng và hỗ trợ chặn phạm vi địa chỉ. Và bạn có thể sử dụng địa chỉ đầy đủ nhận được từ MemTest86 mà không cần xóa ba chữ số cuối.


2

THẬN TRỌNG !!! Windows có thể không khởi động được, hãy sẵn sàng để xây dựng lại BCD. Đối với trường hợp đó, hãy sử dụng Lệnh Promt trong Tùy chọn khởi động nâng cao. Tôi không biết tại sao nó không khởi động được nữa, dường như xảy ra ngẫu nhiên hoặc nếu bạn đưa quá nhiều Địa chỉ vào danh sách xấu.

bootrec /rebuild bcd
bcdedit /export c:\bcdbackup
attrib c:\boot\bcd -h -r -s
ren c:\boot\bcd bcd.old
bootrec /rebuild bcd

Đây là một dấu nhắc lệnh C ++ Chương trình nhận danh sách địa chỉ bộ nhớ liên tục trong tệp .txt sẵn sàng cho bcdedit /set badmemorylisthoặc bcdedit /set {badmemory} badmemorylist(không hoạt động trên Win7 đối với tôi)

Sử dụng bcdedit /set badmemoryaccess 0để từ chối truy cập.

Bạn có thể kiểm tra với EasyBCD trong Xem Cài đặt -> Chi tiết. Sau khi khởi động lại với kiểm tra với Rammap nếu không gian địa chỉ vật lý biến mất.

#include <cstdlib>
#include <iostream>
#include <fstream>

//converts hex into base10
unsigned long convertHexToIntBase10(char* inputHex)
{
    unsigned long hexValue = std::strtoul(inputHex, 0, 16);
    return hexValue;
}

int main(int argc, char* argv[])
{
    if(argc < 3){
        std::cerr << "Usage: MemoryPageListHex [Low Memory Adress] [High Memory Adress] in 4k Pages i.e. MemoryPageListHex 1bae50 1bb0e7 for 0x1bae50148 to 0x1bb0e7fe8" << std::endl;
        return 0;
    }
    auto lowAdr = convertHexToIntBase10(argv[1]);
    auto highAdr = convertHexToIntBase10(argv[2]);
    std::ofstream myfile;
    myfile.open ("MemoryAdress4k.txt");
    for (auto i=lowAdr; i<highAdr; i++){
        myfile << std::hex << "0x" << i << " ";
    }
    myfile.close();
    return 0;
}

1

Vâng. Có tham số khởi động để kiểm soát lượng bộ nhớ mà windows có thể sử dụng. Bạn chỉ có thể loại bỏ từ cuối không gian bộ nhớ. Xem bài viết msDN này để kiểm soát các tham số khởi động. Các tham số quan tâm là truncatememoryremovememory.


Cắt bớt và loại bỏ bộ nhớ dường như chỉ để cắt quyền truy cập RAM (bắt đầu từ một thiết bị đã cho hoặc hoạt động ngược từ cuối). Câu hỏi này là nhiều hơn về việc cung cấp phạm vi.
mirh

0

Bạn có thể thử tính năng này trong Windows 7, nhưng tôi không chắc nó sẽ hoạt động với con chip nào, hoặc nếu nó bỏ qua cùng một lượng. Tôi sẽ phải nhìn xung quanh để tìm ra điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.