Автор: ТоварищЪ , 15 октября 2007
Делаю модуль для BIOS, который реализует Simple Boot Flag (опции загрузки ОС). Этот флаг один байт записываю в CMOS по адресу 50h. Записываю в CMOS один байт по адресу 50h. При загрузке Виста выдает сообщение об ошибке CMOS checksum. Видимо его нужно посчитать и записать. Всё что я знаю - это то, что в CMOS хранятся два checksum: standart и extended. Standart - это сумма с 10h по 2Dh, и хранится он в 2Eh 2Fh. А кто знает про extended?
Содержимое данного поля является приватным и не предназначено для показа.

BBCode

  • HTML-теги не обрабатываются и показываются как обычный текст
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.

maco

18 лет 4 месяца назад

Вот документ, может подойдет.
CMOS 3Eh - AMI - Extended CMOS Checksum, High Byte
Note: this checksum covers locations 34h - 3Dh, but is not used by some
later AMI BIOSes

CMOS 3Fh - AMI - Extended CMOS Checksum, Low Byte
Note: this checksum covers locations 34h - 3Dh, but is not used by some
later AMI BIOSes

CMOS 7Ah - AWARD - EXTENDED CMOS CHECKSUM (high byte)
Note: Award's extended checksum is the arithmetic sum of all the bytes
from 40h (64 decimal) through 79h (121 decimal). [42h-79h for v4.50G]

CMOS 7Bh - AWARD - EXTENDED CMOS CHECKSUM (low byte)
Note: Award's extended checksum is the arithmetic sum of all the bytes
from 40h (64 decimal) through 79h (121 decimal). [42h-79h for v4.50G]

Strelets

18 лет 4 месяца назад

В разных биосах - по разному.

Вот цитата из исходных текстов эмулятора EMU.



void CCmos::checksum_cmos()

{

 unsigned i;

 Bit16u sum;

 

 sum = 0;

 for (i = <font color="#000000"><font color="#0000ff">0x10</font>; i <= </font><font color="#0000ff">0x2d</font>; ++i)

  sum += s.reg[i];


 s.reg[<font color="#ff0000">0x2e</font>] = (sum >> 8) & 0xff; // checksum high

 s.reg[<font color="#ff0000">0x2f</font>] = (sum & 0xff);      // checksum low

 

 sum = 0;


//#if BX_SUPPORT_ACORP

// for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x7a</font>; ++i)

//  sum += s.reg[i];

//

// s.reg[<font color="#ff0000">0x7b</font>] = (sum >> 8) & 0xff; // checksum high

// s.reg[<font color="#ff0000">0x7c</font>] = (sum & 0xff);      // checksum low

//#else


 for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x79</font>; ++i)

  sum += s.reg[i];


 s.reg[<font color="#ff0000">0x7a</font>] = (sum >> 8) & 0xff; // checksum high

 s.reg[<font color="#ff0000">0x7b</font>] = (sum & 0xff);      // checksum low


//#endif




// // For i815 Award BIOS

// for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x7C</font>; ++i)

//  sum += s.reg[i];

//

// s.reg[<font color="#ff0000">0x7D</font>] = (sum >> 8) & 0xff; // checksum high

// s.reg[<font color="#ff0000">0x7E</font>] = (sum & 0xff);      // checksum low

}



Координаты второй КС можно попытаться определить методом сравнения дампов CMOS после выполнения атомарных изменений в SETUP.



Спасибо за документик, maco, и Strelets за код! 

Да, эта часть CMOS у всех разная, даже одного производителя - от версии к версии. В моем случае расклад такой: extended checksum 37+38+..+3D(+40+41+..+XX) => 3E(H),3F(L)

Как оказалось, ошибку выдает злосчастный ErrorLog, этот же модуль и делает подсчет checksum. 

А в EFI BIOS в CMOS писать уже не нужно, и ACPI таблицу делать тоже не надо, там просто нужно установить стандартную переменную. 

Мне сказали, что на эту ошибку можно не обращать внимания, пока двигаюсь дальше 

lsvmo

18 лет 3 месяца назад

Доброго времени суток!

В тему CMOS,  проблема в следующем. Считываю все ячейки памяти CMOS в двух случаях через 70 и 71 порты: из под ДОС и в момент инициализации платы расширения (код вставлен в BIOS платы расширения ) . Но во втором случае при внесении изменений в CMOS в BIOS Setup, в считанных данных не отображаются изменения, а в DOS отображаются. В чем может быть пробема. 

P.S. На старых компьютерах все срабатывает нормально, а на новых на некоторых возникают такие глюки. В частности на Intel 965RY.

Root

18 лет 3 месяца назад

Но во втором случае при внесении изменений в CMOS в BIOS Setup, в считанных данных не отображаются изменения, а в DOS отображаются

что под этим подразумевается? Поподробнее плиз. В шарады играть у меня сейчас охоты нет совсем...

lsvmo

18 лет 3 месяца назад

Подразумевается следующее.


Программа имеет цикл от 0 до 80h соответтственно запись и чтение по портам 70h и 71h (как везде и написано, их используют, чтобы считать значение ячеек CMOS). Есть .com-файл под DOS, он выводит считанные значения ячеек памяти CMOS. Тот же самый код вставлен в код BIOS инициализации платы PCI-расширения. Собственно, здесь даже не важно куда вставлен код, я его вставлял и в рабочий код платы, то есть код выполняющийся после того как все устройства расширения найдены и инициализированы. Так вот запускаем и то и то. Считываем ячейки памяти CMOS.  Затем заходим по Del (или F2, у кого как) в BIOS Setup. Меняем там что-нибудь, например выключаем наличие CD-ROM в компьютере или меняем порядок дисков для загрузки. Выходим, сохраняя новые значения. Далее опять смотрим результаты работы кода BIOS платы расширения и результаты .com-файла из под DOS. В последнем случае меняются зачения определенных ячеек, а в первом случае на экран выводятся те же значения, что и до изменения настроек в BIOS Setup.

Надеюсь, стало более понятно.

Root

18 лет 3 месяца назад

видимо, банально не верен Ваш исходный тезис, что БИОС обновляет CMOS сразу после выбора пункта меню Save & Exit в программе CMOS Setup. Реально же судя по всему это происходит после того, как отработают все БИОСы карт расширений, сразу перед или во время формирования и записи ECSD и DMI

lsvmo

18 лет 3 месяца назад

Так ведь в том то и дело, что это происходит постоянно, а не только сразу после изменения параметров. ТО есть выключаешь компьютер, включаешь, а там опять та же проблема, как будто он читает какие-то умолчальные значения...

Кстати, а область ESCD как-нибудь доступна программно? Также как CMOS через 70 и 71 порты?

Старые версии БИОСа записывали конфигурацию в CMOS, современные - пишут во Флеш. Может быть в Вашем случае изменение порядка загрузки не пишеться в CMOS, т.е. не связано с ним.

lsvmo

18 лет 3 месяца назад

ТоварищЪ,

пожалуйста, поподробнее или ссылки какие-нибудь... В какой флеш? В тот же, что и BIOS хранит?... (Я только начинающий, хотя и пролопатил кучу книг.)