Тема: Битая память (RAM) и vm.blacklist

Здравствуйте !  big_smile

У меня битая, испорченная память.
Если в BIOS включить полный тест памяти, то при загрузки компьютера появляется сообщение "Memory fail".
Запуск теста памяти Memtest-86 показывает ошибки по четырям адресам.

Узнал что в FreeBSD имеется возможность исключения адресов из использования.

Нашёл такое сообщение в www.opennet.ru :

17.04.2005 21:12  Использование дефектных блоков памяти в FreeBSD

В CVS дерево FreeBSD включен код, позволяющий использовать FreeBSD на машинах имеющих частично поврежденные модули памяти.

Сбойные области определяются при помощи memtest и исключаются из адресного пространства VM используя sysctl переменную vm.blacklist.

-------------------------------------------------------------------

Попытался на другом компьютере c нормальной памятью в виртуальной компьютере (VirtualBox) настроить переменную vm.blacklist чтобы потом подключить винчестер своего компьютера и настроить свою FreeBSD.

-------------------------------------------------------------------

У меня FreeBSD 7.0-RELEASE (три CD).

Загружался с ядром Generic :

# uname -a
FreeBSD  7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008    
[email protected]:/usr/obj/usr/src/sys/GENERIC  i386

-------------------------------------------------------------------

Как оказалось просто так переменная vm.blacklist не включается. Появляется такая ошибка :

# sysctl vm.blacklist
sysctl: unknown oid 'vm.blacklist'

-------------------------------------------------------------------

В настройках ядра для компиляции в /usr/src/sys/i386/conf/ не нашёл никаких слов blacklist.

В source коде ядра в файле /usr/src/sys/vm/vm_pageq.c есть место использования vm.blacklist :

    list = getenv("vm.blacklist");

Функция getenv ("man getenv") возвращает значения из Environment Variables List.

В функции vm_page_blacklist_lookup есть такой вызов функции strtoq :

        bad = strtoq(pos, &cp, 0);

На основании "man strtoq" выяснил что адреса для переменной vm.blacklist могут быть указаны в шестнадцатиричном виде "0x12345678" и десятичном.

Также в этом файле указано что если адрес страницы памяти указан правильно то должно появиться сообщения типа "Skipping page with pa 0x".

Как я понял в качестве чисел переменной vm.blacklist нужно указывать номера страниц памяти.

В x86 компьютерах адрес страницы равен 4 килобайтам. Отсюда вывел что адрес
HEX A98B5C = Dec 11111260
11111260 / 4048 = 2744,8764822134387351778656126482
т.е. страница памяти 2744

(Адрес HEX A98B5C находится в районе 10.5 MB.)

-------------------------------------------------------------------

Если в /boot/loader.conf указать

vm.blacklist="2744"

то никаких сообщений вообще не заметил !!!

Если в /boot/loader.conf указать

set vm.blacklist="2744"

даёт ошибку до появления загрузочного меню :

Warning: syntax error on file /boot/loader.conf
set vm.blacklist="2744"
    ^

Если в /boot/loader.conf указать

kernel_options="vm.blacklist=2744"

ничего не даёт.

Если в /etc/rc.conf указать vm.blacklist=2744
то при загрузке множесто раз пишется :

vm.blacklist=2744: not found

Искал сообщения с помощью таких команд :

dmesg | grep skip
dmesg | grep blacklist
cat /var/log/messages | grep skip
cat /var/log/messages | grep blacklist

-------------------------------------------------------------------

Только не надо предложений купить новую память.   :evil:

Если в операционной системе есть определённая функция то она должна быть использована.   :!:

Просто надо разобраться как её использовать.

Куда надо указывать vm.blacklist ?  :?:

Как же назначать переменную vm.blacklist ?  :?:

2

Re: Битая память (RAM) и vm.blacklist

В виндоусе тоже можно, есть программа softice (http://en.wikipedia.org/wiki/SoftICE) с ее помощтю можно заблакирывать какие угодно участки памяти.

Добавлено спустя     7 минут   41 секунду:
А по указанной ссылке написано что FreeBSD 6 а у вас 7

а тут исходничег http://fxr.watson.org/fxr/source/vm/vm_ … v=FREEBSD7

3

Re: Битая память (RAM) и vm.blacklist

Попробовал указать в файле /boot/device.hints

vm.blacklist="2744,11111260,0xA98B5C"

После загрузки ОС команда kenv выдаёт наличие этой переменной.

Но никаких сообщений не появляется :

cat /var/log/messages | grep skip
cat /var/log/messages | grep blacklist

------------------------------------------------------------

Загружаю ОС в режиме :

1. Boot FreeBSD [default]

------------------------------------------------------------

Проверил есть ли ядре код файла /usr/src/sys/vm/vm_pageq.c :

# cat /boot/kernel/kernel | grep -a vm.blacklist

В выводе этой команды было десяток строк разных слов среди которых присутствовало  "vm.blacklist" и "Skipping page with pa 0x"

------------------------------------------------------------

При загрузке в режиме

5. Boot FreeBSD with verbose logging

никаких сообщений касательно vm.blacklist не заметил.

------------------------------------------------------------

Внимательнее посмотрев на файл /usr/src/sys/vm/vm_pageq.c  заметил там такой код

if (pa == trunc_page(bad))

а в файле \usr\src\sys\i386\include\param.h

#define PAGE_SHIFT    12        /* LOG2(PAGE_SIZE) */
#define PAGE_SIZE    (1<<PAGE_SHIFT)    /* bytes/page */
#define PAGE_MASK    (PAGE_SIZE-1)
#define trunc_page(x)        ((x) & ~PAGE_MASK)

и сделал вывод что надо указывать адреса битых байтов а не адреса страниц.

------------------------------------------------------------

Вот часть содержимого файла /usr/src/sys/vm/vm_pageq.c :

....
/*
 *    vm_page_blacklist_lookup:
 *
 *    See if a physical address in this page has been listed
 *    in the blacklist tunable.  Entries in the tunable are
 *    separated by spaces or commas.  If an invalid integer is
 *    encountered then the rest of the string is skipped.
 */
static int
vm_page_blacklist_lookup(char *list, vm_paddr_t pa)
{
    vm_paddr_t bad;
    char *cp, *pos;
    for (pos = list; *pos != '\0'; pos = cp) {
        bad = strtoq(pos, &cp, 0);
        if (*cp != '\0') {
            if (*cp == ' ' || *cp == ',') {
                cp++;
                if (cp == pos)
                    continue;
            } else
                break;
        }
        if (pa == trunc_page(bad))
            return (1);
    }
    return (0);
}
...
/*
 *    vm_page_startup:
 *
 *    Initializes the resident memory module.
 *
 *    Allocates memory for the page cells, and
 *    for the object/offset-to-page hash table headers.
 *    Each page cell is initialized and placed on the free list.
 */
....
    /*
     * Add every available physical page that is not blacklisted to
     * the free lists.
     */
    cnt.v_page_count = 0;
    cnt.v_free_count = 0;
    list = getenv("vm.blacklist");
    for (i = 0; phys_avail[i + 1] != 0; i += 2) {
        pa = phys_avail[i];
        last_pa = phys_avail[i + 1];
        while (pa < last_pa) {
            if (list != NULL &&
                vm_page_blacklist_lookup(list, pa))
                printf("Skipping page with pa 0x%jx\n",
                    (uintmax_t)pa);
            else
                vm_phys_add_page(pa);
            pa += PAGE_SIZE;
        }
    }
    freeenv(list);
....

------------------------------------------------------------

А по этой ссылке полный файл /usr/src/sys/vm/vm_pageq.c :
http://fxr.watson.org/fxr/source/vm/vm_ … v=FREEBSD7

------------------------------------------------------------

SatanaClause
Сегодня 16:43:15

В виндоусе тоже можно, есть программа softice (http://en.wikipedia.org/wiki/SoftICE) с ее помощтю можно заблакирывать какие угодно участки памяти.

Попробую Softice.

Так что делать-то, какие есть идеи ?  wink

4

Re: Битая память (RAM) и vm.blacklist

Идей нет... я так не извращаюсь... Вообще можно память свапом заменить smile

5

Re: Битая память (RAM) и vm.blacklist

У меня есть идея.
поменять неисправные чипы.:D