Делаю модуль для BIOS, который реализует Simple Boot Flag (опции загрузки ОС). Этот флаг один байт записываю в CMOS по адресу 50h. Записываю в CMOS один байт по адресу 50h. При загрузке Виста выдает сообщение об ошибке CMOS checksum. Видимо его нужно посчитать и записать. Всё что я знаю - это то, что в CMOS хранятся два checksum: standart и extended. Standart - это сумма с 10h по 2Dh, и хранится он в 2Eh 2Fh. А кто знает про extended?
Вот документ, может подойдет.
В разных биосах - по разному.
Вот цитата из исходных текстов эмулятора EMU.
void CCmos::checksum_cmos()
{
unsigned i;
Bit16u sum;
sum = 0;
for (i = 0x10; i <= 0x2d; ++i)
sum += s.reg[i];
s.reg[0x2e] = (sum >> 8) & 0xff; // checksum high
s.reg[0x2f] = (sum & 0xff); // checksum low
sum = 0;
//#if BX_SUPPORT_ACORP
// for (i = 0x40; i <= 0x7a; ++i)
// sum += s.reg[i];
//
// s.reg[0x7b] = (sum >> 8) & 0xff; // checksum high
// s.reg[0x7c] = (sum & 0xff); // checksum low
//#else
for (i = 0x40; i <= 0x79; ++i)
sum += s.reg[i];
s.reg[0x7a] = (sum >> 8) & 0xff; // checksum high
s.reg[0x7b] = (sum & 0xff); // checksum low
//#endif
// // For i815 Award BIOS
// for (i = 0x40; i <= 0x7C; ++i)
// sum += s.reg[i];
//
// s.reg[0x7D] = (sum >> 8) & 0xff; // checksum high
// s.reg[0x7E] = (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 таблицу делать тоже не надо, там просто нужно установить стандартную переменную.
Мне сказали, что на эту ошибку можно не обращать внимания, пока двигаюсь дальше
Доброго времени суток!
В тему CMOS, проблема в следующем. Считываю все ячейки памяти CMOS в двух случаях через 70 и 71 порты: из под ДОС и в момент инициализации платы расширения (код вставлен в BIOS платы расширения ) . Но во втором случае при внесении изменений в CMOS в BIOS Setup, в считанных данных не отображаются изменения, а в DOS отображаются. В чем может быть пробема.
P.S. На старых компьютерах все срабатывает нормально, а на новых на некоторых возникают такие глюки. В частности на Intel 965RY.
что под этим подразумевается? Поподробнее плиз. В шарады играть у меня сейчас охоты нет совсем...
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Подразумевается следующее.
Программа имеет цикл от 0 до 80h соответтственно запись и чтение по портам 70h и 71h (как везде и написано, их используют, чтобы считать значение ячеек CMOS). Есть .com-файл под DOS, он выводит считанные значения ячеек памяти CMOS. Тот же самый код вставлен в код BIOS инициализации платы PCI-расширения. Собственно, здесь даже не важно куда вставлен код, я его вставлял и в рабочий код платы, то есть код выполняющийся после того как все устройства расширения найдены и инициализированы. Так вот запускаем и то и то. Считываем ячейки памяти CMOS. Затем заходим по Del (или F2, у кого как) в BIOS Setup. Меняем там что-нибудь, например выключаем наличие CD-ROM в компьютере или меняем порядок дисков для загрузки. Выходим, сохраняя новые значения. Далее опять смотрим результаты работы кода BIOS платы расширения и результаты .com-файла из под DOS. В последнем случае меняются зачения определенных ячеек, а в первом случае на экран выводятся те же значения, что и до изменения настроек в BIOS Setup.
Надеюсь, стало более понятно.
видимо, банально не верен Ваш исходный тезис, что БИОС обновляет CMOS сразу после выбора пункта меню Save & Exit в программе CMOS Setup. Реально же судя по всему это происходит после того, как отработают все БИОСы карт расширений, сразу перед или во время формирования и записи ECSD и DMI
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Так ведь в том то и дело, что это происходит постоянно, а не только сразу после изменения параметров. ТО есть выключаешь компьютер, включаешь, а там опять та же проблема, как будто он читает какие-то умолчальные значения...
Кстати, а область ESCD как-нибудь доступна программно? Также как CMOS через 70 и 71 порты?
Старые версии БИОСа записывали конфигурацию в CMOS, современные - пишут во Флеш. Может быть в Вашем случае изменение порядка загрузки не пишеться в CMOS, т.е. не связано с ним.
ТоварищЪ,
пожалуйста, поподробнее или ссылки какие-нибудь... В какой флеш? В тот же, что и BIOS хранит?... (Я только начинающий, хотя и пролопатил кучу книг.)
Отправить комментарий