Как получить имя чипа и адресуемую память в указанных архитектурах (x86, pic controller)?

Как получить имя чипа и адресуемую память в указанных архитектурах (x86, x64, pic controller) без биоса? У вас есть специальный регистр, в котором хранится доступный объем памяти?


person Resident    schedule 14.03.2013    source источник
comment
Какая? Вы ожидаете, что будет единое решение для двух сверхшироких семейств настольных/серверных/портативных процессоров и целого ряда миниатюрных микроконтроллеров?   -  person unwind    schedule 14.03.2013


Ответы (2)


Не уверен, насколько это актуально, но это может помочь указать вам правильное направление.

При использовании PicBasic с микроконтроллерами PicAxe (не микроконтроллерами PIC) в языке программирования было ключевое слово/оператор под названием «READSILICON».

И это действие READSILICON будет считывать неуказанную область кремния и возвращать значение, которое, в свою очередь, использовалось/использовалось для идентификации MCU.

Так может в вашей среде разработки есть подобная функция?

ПРИМЕЧАНИЕ. Поскольку тогда это была новая функция, ее поддерживали только более новые микроконтроллеры, а старые — нет.

person Zeddy    schedule 14.03.2013

В x86 имя чипа можно получить с помощью инструкции CPUID; статья Википедии о CPUID содержит пример кода для запроса марки процессора строка имени.

Основные сведения о CPUID см. в разделе Примечание к приложению Intel, на момент написания этой статьи идентификация строки бренда приведена в разделе 7.2.

В встроенной сборке GCC вы можете сделать:

unsigned int cpuid = 0x80000000;

__asm__ __volatile__("cpuid\n\t" : "+a" (cpuid));
if (cpuid >= 0x80000004) { // brand name query supported
    union { char brandstr[48]; unsigned int i[12] } i;
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[0]), "=b" (i.i[1]), "=c"(i.i[2]), "=d"(i.i[3])
        : "a"(0x80000002));
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[4]), "=b" (i.i[5]), "=c"(i.i[6]), "=d"(i.i[7])
        : "a"(0x80000003));
    __asm__ ("cpuid\n\t"
        : "=a"(i.i[8]), "=b" (i.i[9]), "=c"(i.i[10]), "=d"(i.i[11])
        : "a"(0x80000004));
    printf ("This CPU brand name is: %48s\n", i.brandstr);
} else {
    printf ("This x86 CPU doesn't support brand name queries\n");
}

Определение структуры/размера памяти без BIOS на машинах x86 практически невозможно, так как большая часть способов сделать это непосредственно на оборудовании очень специфична для комбинаций ЦП/чипсет и руководств разработчиков поставщиков (BKCD - Руководство разработчика BIOS и ядра) обычно предоставляет только частичные ссылки на это в общедоступной (не требуется NDA) версии. Документированный способ — запросить эту информацию у ACPI BIOS.

person FrankH.    schedule 14.03.2013