Отключить кеши L2/L1

Я пытаюсь отключить кеш внутренней и внешней памяти моего процессора, моя конфигурация указана выше: -DELL Precision WorkStation -Intel Core 2 Duo E6550 2,33 ГГц -Ubuntu 8.10

Я пытался отключить его через BIOS, но оказалось, что компьютеры DELL не позволяют пользователям получать доступ к кэш-памяти, тогда я нашел другой способ, это отключить кэш программно, в руководстве по архитектуре Intel A.3 указано, что регистр cr0 может установить, чтобы отключить кеш, установив бит 30, тогда я написал приведенный выше код:

инвд

мов еакс, cr0

mov eax,40000000H ;установить бит 30

мов cr0,eax

Программа успешно скомпилирована, но когда я пытаюсь запустить exe-файл, возникает ошибка сегмента (я использую NASM)

Кто-нибудь может мне помочь?


person Community    schedule 10.07.2009    source источник
comment
Почему, во имя Джеффа, ты хочешь это сделать?   -  person skaffman    schedule 10.07.2009
comment
Небольшая придирка: вы должны использовать ниже, где вы используете выше. Кстати, добро пожаловать в SO!   -  person RCIX    schedule 10.07.2009
comment
Извините за придирчивость, но мне пришлось отредактировать часть форума, так что это не форум. Но добро пожаловать.   -  person UnkwnTech    schedule 10.07.2009
comment
Дублируйте вопрос с ответом здесь: stackoverflow.com/q/28948542/822870   -  person David Balažic    schedule 28.12.2015


Ответы (8)


Обратите внимание, что даже если вы находитесь в кольце 0, потому что вы находитесь в ядре или запускаете свой инструмент в DOS в защищенном режиме и т. д., перемещение 0x40000000 в cr0 определенно приведет к катастрофа. Видите ли, управляющий регистр (cr0) управляет всевозможными вещами, влияющими на работу процессора, такими как включение подкачки, защищенный режим (не напрямую) и т. д. Если вы сбросите все эти биты, вы окажетесь в совершенно другом состоянии. среде и получение ошибки сегментации совсем не удивительно, если ранее у вас была включена подкачка страниц.

Вместо этого вы должны сделать это:

mov eax,cr0
or eax, 40000000H ;set bit 30 without clearing the others
mov cr0,eax
person Tamas Czinege    schedule 10.07.2009
comment
Он говорит, что ошибки seg на mov eax, cr0. - person RCIX; 10.07.2009
comment
@RCIX: Ваши навыки психической отладки великолепны. Единственное, что я вижу, это... когда я пытаюсь запустить exe-файл, это Seg Faults... - person erikkallen; 25.09.2009

Я нашел этот документ в контрольном реестре в Википедии. Это подтверждает ваши слова:

Регистр CR0 имеет длину 32 бита на процессорах 386 и выше. На процессорах x86-64 в длинном режиме он (и другие управляющие регистры) имеют длину 64 бита. CR0 имеет различные управляющие флаги, которые изменяют основную работу процессора. Бит Имя Полное имя Описание 31 PG Пейджинг Если 1, включить пейджинг и использовать регистр CR3, в противном случае отключить пейджинг 30 CD Cache отключить

Это привело меня к Руководству разработчика программного обеспечения для архитектур Intel 64 и IA-32. Там сказано, и я снова цитирую:

Большинство систем ограничивают доступ к системным регистрам (кроме регистра EFLAGS) прикладными программами. Однако могут быть спроектированы системы, в которых все программы и процедуры выполняются на самом привилегированном уровне (уровень привилегий 0). В таком случае прикладным программам будет разрешено изменять системные регистры.

Возможно, ваша программа семантически вернаВ вашем коде есть ошибка, которая, вероятно, приведет к зависанию машины, но даже если она будет исправлена, ее нужно будет запускать в режиме супервизора. Обратите внимание, что вам нужно or значение, чтобы не влиять на другие регистры (как отмечали другие).

person 1800 INFORMATION    schedule 10.07.2009

Это должно быть «или eax,40000000h», чтобы установить бит 30. Но в любом случае пользовательскому процессу не будет разрешено изменять регистры управления. Вам нужно будет внести изменения в ядро. Я не сомневаюсь, что есть какой-то системный вызов или интерфейс устройства, чтобы делать то, что вы хотите.

person George Phillips    schedule 10.07.2009

Вам нужно будет сделать это из драйвера в Windows или Linux, так как только ядро ​​​​работает на ступени 0, и я не думаю, что вы можете сделать это для одного процесса, вам придется сделать это для всех из них.

Я предполагаю, что вы пытаетесь выполнить запись в память без кэширования?

Возможно, вы хотите изучить инструкции по очистке кеша, если пытаетесь сделать страшный многопоточный код?

person Spence    schedule 10.07.2009

Я был бы удивлен, если бы какой-либо код, работающий в пользовательском режиме, смог бы это сделать — это была бы адская DoS-атака.

person Pavel Minaev    schedule 10.07.2009
comment
Точно такой же эффект может быть достигнут с помощью тщательно сконструированной программы пользовательского режима, например, программы, которая выделяет 64 МБ памяти и продолжает чтение/запись случайных страниц внутри нее. - person Tamas Czinege; 10.07.2009
comment
Программа пользовательского режима, подобная описанной DrJokepu, не будет настолько разрушительной, как отключение кэша. Каждый активный процесс получает квант времени ЦП, измеряемый в миллисекундах, что составляет миллионы наносекунд и многие миллионы циклов ЦП. Этого времени вполне достаточно для того, чтобы загрузить какой-нибудь полезный контент в кеш, прежде чем вредоносный процесс удалит его обратно. - person ScottJ; 07.11.2009

Я думаю, что вы должны войти в систему как root, чтобы сделать это. Мне было интересно, почему вы хотите отключить кеш, по всей вероятности, отключение L1 и L2 приведет к блокировке компьютера.

person user133018    schedule 10.07.2009

На самом деле, кажется, ошибка Seg во второй инструкции (mov eax, cr0), я только что пытался прокомментировать все остальные инструкции, и это дало ошибку seg.... Но я до сих пор не знаю, почему??

Я также пытался скомпилировать/запустить его на уровне выполнения 0 (командная строка telinit 1 от имени пользователя root), но он все равно выдает ошибки...

Мне интересно, не защищен ли тогда управляющий регистр 0 (cr0) от записи...?

person Community    schedule 10.07.2009
comment
уровень запуска 0 не совпадает с кольцом 0; кольцо 0 является самим ядром операционной системы. ваш код должен работать как часть ядра операционной системы (например, как драйвер), в противном случае вы, вероятно, будете работать в кольце 3, что означает, что вы не можете получить доступ к регистрам управления. runinit 0 не решит проблему, так как ваша среда выполнения останется в пользовательском пространстве. - person Tamas Czinege; 10.07.2009
comment
ну, вы были правы, с masm32.com/board / говорят, что Ring 0 должен быть способом установить cr0 (они используют одну и ту же программу mov eax,cr0...) Кто-нибудь знает, как запустить файл в режиме Ring 0? - person ; 10.07.2009
comment
Мохо - обычно нельзя. Предполагая, что вы хотите сделать это в Linux, вам нужно поместить его в модуль ядра: dirac.org/linux/writing/lkmpg/2.6/lkmpg-2.6.0.html - person Tamas Czinege; 10.07.2009

Наконец-то я смог отключить кеш, запустив код как Ring0. Спасибо, DrJokepu, ссылка, которую вы мне дали, была именно тем, что мне было нужно.. но у меня новая проблема, потому что когда я вставляю новый модуль, который отключает кеш, работает решетка, мне просто нужно вставить мой файл .ko, и вызывается процедура init, в которой написан мой код. но теперь я хотел бы снова включить кеш программно. Он должен работать с записью процедуры clean, которая сбрасывает cr0 и вызывает ее при удалении модуля с помощью rmmod, но на самом деле это ничего не делает ...Я могу проверить в cat /proc/modules, и он действительно удалил его, но, видимо, он не вызвал мою чистую процедуру перед удалением....

помощь?

person Community    schedule 22.07.2009
comment
Новая проблема, новый вопрос! Также отметьте ответ, который вам помог. - person Bombe; 25.09.2009