Могу ли я написать ассемблерный код для каждого ядра? - PullRequest
3 голосов
/ 16 января 2012

Кто-нибудь будет так любезно продемонстрировать, как код сборки Intel может представлять разные потоки, над которыми работают разные ядра? Я полагаю, у вас нет одного файла сборки на поток / ядро?

РЕДАКТИРОВАТЬ: Позвольте мне перефразировать: если я хочу написать ассемблер на разных ядрах процессора, могу ли я контролировать то, что происходит на ядре X, и связь между каждым ядром (точно так же, как можно контролировать значения регистров на ядре)

Ответы [ 5 ]

1 голос
/ 16 января 2012

Итак, вы хотите запустить поток без помощи ОС.

На последних процессорах Intel вы запускаете второе ядро ​​через функции ACPI.Функция выдает IPI (Interprocessor Interrupt) остановленному логическому процессору, затем она начинает выполнять код (новый поток) по адресу, указанному как часть IPI.

Если вы действительно хотите увидеть goryподробности, пример на http://lxr.linux.no/#linux+v3.2/arch/x86/kernel/smpboot.c#L477.

Дополнительные сведения и документация содержатся в Руководстве разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, том 3 (Руководство по системному программированию), глава 8.6.Поскольку Intel постоянно меняет ссылку, вы можете найти ее в Google.

1 голос
/ 16 января 2012

На уровне сборки потоки выглядят так же, как и любой другой код. Некоторые инструкции имеют семантику, которая полезна в контексте потоков, например LOCK CMPXCHG, который выполняет атомарное сравнение и обмен. Но в общем случае потоки создаются и управляются с помощью вызовов операционной системы, и вы обычно не видите «слесарного дела». Вы просто передаете одну из своих функций в API создания потока, и она начинает выполняться параллельно (или чередуется) с текущим кодом. Остальное зависит от вас.

В ОС многопоточность реализуется путем переворота стека и других регистров в ответ на прерывания таймера. Как таковой здесь нет кода операции «создать поток».

0 голосов
/ 16 января 2012

Да, вы можете. Вам нужно написать свою собственную ОС, чтобы сделать это с абсолютным контролем. Это часть функции ОС, и количество возможностей сделать это доступным вам зависит от ОС.

0 голосов
/ 16 января 2012

Так как это MASM, я думаю, вы используете Windows.Вы звоните CreateThread , передавая адрес процедуры запуска потока (и некоторые другие вещи).

Некоторые соответствующие сообщения: http://www.google.co.uk/search?q=createthread+site:masm32.com

Обновление

Вы по-прежнему ограничены тем, что дает вам ОС.Например, вы можете вызвать SetThreadAffinityMask или SetThreadIdealProcessor .Как отмечают Марсело Кантос и Ханс Пассант, потоки реализуются ОС, а не процессором, поэтому вам нужно общаться с этой ОС.

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

0 голосов
/ 16 января 2012

Все зависит от вашей архитектуры - Windows? Linux? Mac OS? И вообще потоки будут управляться вашей операционной системой, как и на языке более высокого уровня. С точки зрения вашего кода, вам нужно попросить операционную систему создать поток, используя те же API, которые вы использовали бы в C.

По сути, создание потока - это то, о чем вы просите хост-ОС, и это одна и та же базовая концепция, пишете ли вы C, сборку, C #, Objective-C или что-то подобное.

...