Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
u8 revision; // номер версии, Revision level, 0
u8 length; // размер служебного каталога в 16-байтных параграфах
u8 checksum; // контрольная сумма, дополняет все байты до 0
u8 reserved[5]; // зарезервировано, заполняется нулями
} fields;
char chars[16];
};
Рассмотрим функцию, которая производит поиск служебного заголовка BIOS32.
int pci_find_bios(void)
{
union bios32 *check; // служебный каталог BIOS32
u8 sum;
int i, length;
Сканируем область памяти BIOS в диапазоне адресов 0xe0000 и 0xfffff в поисках сигнатуры «_32_» и служебного каталога BIOS32:
for (check = (union bios32 *) __va(0xe0000);
check <= (union bios32 *) __va(0xffff0); ++check) {
if (check->fields.signature != BIOS32_SIGNATURE) continue;
Поиск выполняется относительно нижней границы адресного пространства ядра 0xC0000000, на что указывает макрос __va(0xe0000) и __va(0xffff0).
Этот макрос определен в файле include/page.h следующим образом:
#define __PAGE_OFFSET 0xC0000000 // нижняя граница адресного пространства ядра
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
Если сигнатура найдена – определяем размер служебного каталога BIOS32 в байтах:
length = check->fields.length * 16;
if (!length) continue;
Считываем контрольную сумму и определяем номер версии реализации:
sum = 0;
for (i = 0; i < length ; ++i)
sum += check->chars[i];
if (sum != 0)
continue;
if (check->fields.revision != 0) {
printk("PCI: unsupported BIOS32 revision %d at 0x%p ",