Дублирующая функциональность для извлечения размера строки кэша с помощью cpuid - PullRequest
2 голосов
/ 20 сентября 2019

Я изучил документацию cpuid и обнаружил 2 различных документированных способа получения размера строки кэша:

  1. eax = 0x04, ecx = $cache_level

Таким образом, размер строки кэшав $cache_level будет храниться в EBX[11:0] битах

eax = 0x80000006

Таким образом, размер строки кэша будет сохранен на ECX[7:0], а лист не зависит от уровня кэша.

ВОПРОС: В чем причина добавления информации о размере строки кэша в лист 0x80000006 и почему она не зависит от уровня кэша?У меня есть подозрение, что «правильный» способ получить размер строки кэша - eax = 0x04, ecx = $cache_level.

1 Ответ

7 голосов
/ 20 сентября 2019

Intel и AMD (и VIA и ...) - это разные компании;и (к сожалению) в этом не участвуют независимые органы стандартизации, ничто не заставляет вендоров сотрудничать между ними, и ничто не мешает поставщикам устраивать большие беспорядки, пытаясь заставить друг друга выглядеть плохо.

Когда AMD создала "CPUID,leaf 0x80000006 ", они сделали простую вещь - предположили, что размер строки кэша одинаков для всех кэшей, и поместили это в поле.

Однако (по крайней мере, в теории) каждый отдельный кэш может иметь разные«размер строки»;поэтому, когда Intel создала «CPUID, лист 0x00000004», они сделали это так, чтобы (теоретически) каждый отдельный кеш мог сообщать разный «размер строки».

Правильный способ - создать беспорядок, который решит проблему поставщика.беспорядок.В частности,для процессоров AMD вы можете использовать «CPUID, лист 0x80000006», если можете;а для процессоров Intel (и, думаю, для процессоров VIA) вы, возможно, захотите использовать «CPUID, leaf 0x00000004»;и во всех случаях, когда вы не можете (например, из-за того, что процессор слишком стар, чтобы поддерживать метод вендора), вы в конечном итоге сталкиваетесь с еще одним большим беспорядком (например, с использованием эвристики и / или использованием «vendor: family: model: stepping» для поискаинформация в статической базе данных).

Конечно, помимо этого, вы должны учитывать ошибки;это означает, что нужно просмотреть около сотни «обновлений спецификаций» и «Руководств для разработчиков BIOS и ядра», чтобы выяснить, нужны ли / где «обходные пути для особых случаев».

Примечание 1: Всевыше не слишком сложно, если единственное, что вас волнует, это размер строки кэша;но чем больше информации вы хотите, тем хуже она становится (например, если вы заботитесь о размере каждого кэша, то вам следует ожидать примерно в 10 раз больше хлопот и в 10 раз больше нагрузки на обслуживание).

Примечание 2. В идеале ОС должна предоставлять «предварительно очищенную информацию о процессоре»;чтобы его нужно было обновлять только в одном месте, и чтобы обычному программному обеспечению не приходилось иметь дело с бессмысленными «различиями поставщиков», ошибками, отсутствующей или противоречивой информацией;и прямое использование инструкции CPUID будет запрещено (по соображениям удобства, корректности и безопасности).К сожалению, ни одна из существующих ОС не обеспечивает этого.

...