Как выполняется concurrency в сборке Intel x86?

Мне любопытно узнать, как можно координировать одновременное программное обеспечение на сборке Intel x86. Интересны как потоки, так и сопрограммы с урожайностью.

Я понимаю, что это не практично делать в сборке, но мне просто интересно.

Ответ 1

Если вы говорите о пространстве пользователя, так же, как вы это делаете, например, C. То есть вы вызываете pthread_create() (или что-то вроде API "создать новый поток" в вашей ОС) с соответствующими аргументами (включая адрес новой функции "main" ) и от вас.

Если вы говорите об уровне bare-bones без ОС, чтобы помочь вам, вы выделите блок памяти (из ранее выделенного распределителя памяти) для стека нового потока, настройте периодический таймер tick, который запускает (ваш ранее написанный) код планировщика, который сохраняет содержимое регистра и переключает между вашими стеками потоков и т.д.

Как это сделать с ASM вместо C? Ну, кроме намного более пота и слез, в основном то же самое.

Ответ 2

На процессорах X86 многопроцессорная (и многопоточная) связь осуществляется через APIC (расширенные программируемые контроллеры прерываний) http://en.wikipedia.org/wiki/Intel_APIC_Architecture.

Когда ОС запускается, только один логический процессор использует код ОС, чтобы подтвердить прежнее поведение одного процессора.

ОС использует APIC для отправки "SIPI" (Interper Interrupt Interrupt Interrupt) для каждого другого потока.
Каждый поток просыпается и обновляет область памяти, поэтому основной поток знает, сколько процессоров ему нужно работать.
После того, как каждый поток объявляет о себе, он переходит в низкое энергопотребление, прерывистое состояние.

В случае, когда ОС хочет что-то запустить на этом логическом процессоре, он имеет текущий процессор, отправляющий IPI (InterProcessor Interrupt) через APIC.
Когда задача выполнена, логический процессор может вернуться в состояние малой мощности, ожидая следующего прерывания.