Size: a a a

Ассемблер

2021 March 31

ST

Saenro T in Ассемблер
Обсуждали ж недавно: https://t.me/ChatAssembler/78297
источник

АШ

Алексей Шведов... in Ассемблер
Кролик
а мож ты знаешь как сканировать сайты с п.м своего кода?
Вопрос был бы легче, без "п.м"
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
А, ну да, там же слева метки. Очевидно, что не на BTS идёт прыжок.
Я вот боюсь спросить, а кем вы работаете, если не секрет?
Инженером Интел? :3
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Короче, младший бит по адресу EAX - это флаг занятости КС. При попытке входа в КС этот бит проверяется и одновременно устанавливается. Если КС занята, то там как была 1, так и осталось, но мы получили инфу о её занятости CF=1. Если свободна, то мы установили 1, получив инфу о том, что она свободна (CF=0).

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

Кроме BTS используется также XADD и XCHG (без префикса, т.к. префикс LOCK в этой инструкции срабатывает по умолчанию). Для разных целей используют CMPXCHG (в т.ч. 8B, 16B) и логические/арифметические инструкции (чтобы атомарно выполнить какую-то операцию над переменной из нескольких потоков, не входя в критическую секцию - обычно этот вход нужен, когда нужно сделать блок каких-то операций). В плюсах для этого используется шаблон atomic.
Не ясно только три момента:
Что за размер линии Кеша?
Что за шаблон атомарности?
И почему эта реализация (а это всего лишь спинлок в ядре 4.19)
Синхронизации использует не привычный Лок иксчендж, а вот однобитовый контейнер?
источник

КП

Котеечко Пухнастиньк... in Ассемблер
И ещё не ясно зачем такая котовасия с префиксами lock
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Типа тут он сам срабатывает а тут он сам не срабатывает а тут его нельзя писать
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Но то уже мысли в слух
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Ещё момент по поводу высокоуровневый логики Try* префикса. Часто вижу в ядре такие речевые обороты как Try, likely, unlikely.

На ум приходит, что это в целях оптимизации, так как смысловое значение соответствует логике кода. Но только каким образом в коде машинном может быть тот же *маловероятно* префикс интерпретирован процессору?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Котеечко Пухнастиньке
Не ясно только три момента:
Что за размер линии Кеша?
Что за шаблон атомарности?
И почему эта реализация (а это всего лишь спинлок в ядре 4.19)
Синхронизации использует не привычный Лок иксчендж, а вот однобитовый контейнер?
1. Читай про кэш. Он состоит из "линий" по 64 байта (обычно).
2. Есть такой шаблонный класс atomic.
3. А какая разница? Что такое 4.19 ?

Котовасия вот зачем.
bts фактически состоит из нескольких операций: прочитать значение из памяти, установить бит, записать обратно. Если второе ядро, работая параллельно, вклинится в этот процесс, то результат нарушится. Например, первое ядро прочитало значение из памяти, там 0. Пока оно его модифицировало, второе ядро тоже прочитало и там до сих пор находится 0. Что получилось в итоге? Оба прошли в критическую секцию. LOCK делает так, что пока первый процессор не выполнит всю инструкцию, второй будет ждать.
XCHG — единственная инструкцию, которая блокирует шину всегда, т.е. наличие префикса LOCK никак на её работу не влияет.
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Ааа
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Тверь ясно за момент по поводу xchg
источник

КП

Котеечко Пухнастиньк... in Ассемблер
На счёт необходимость блокировки аппаратного уровня в примитивах синхронизации я понимал что она есть)
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Не понимал просто почему так выборочно типа)
Ну вроде бы ясно , спасибо от души
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Кстати, по п.2.
Во-первых, в одном QWORD можно разместить 64 бита блокировки (для разных КС). Но так делать, конечно, не айс, потому что LOCK будет заставлять ждать второе ядро даже в том случае, если оно пытается войти в другую секцию, ибо обращение идёт всегда к одной ячейке памяти
Во-вторых, bt [rax],0 явно короче, чем
mov edx,1
xchg [rax],rdx
test edx,edx
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Котеечко Пухнастиньке
Не понимал просто почему так выборочно типа)
Ну вроде бы ясно , спасибо от души
Что выборочно?
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Что выборочно?
Ну xchg атомарен всегда
источник

КП

Котеечко Пухнастиньк... in Ассемблер
А mov - нельзя залочить
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
MOV нельзя, потому что там одна операция — запись. Он атомарен (со сноской). И он ничего не возвращает (флаги не меняет и пр).
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Кстати, по п.2.
Во-первых, в одном QWORD можно разместить 64 бита блокировки (для разных КС). Но так делать, конечно, не айс, потому что LOCK будет заставлять ждать второе ядро даже в том случае, если оно пытается войти в другую секцию, ибо обращение идёт всегда к одной ячейке памяти
Во-вторых, bt [rax],0 явно короче, чем
mov edx,1
xchg [rax],rdx
test edx,edx
Вот вот это важно для мозга, спасибо +++++
источник

КП

Котеечко Пухнастиньк... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
MOV нельзя, потому что там одна операция — запись. Он атомарен (со сноской). И он ничего не возвращает (флаги не меняет и пр).
Тогда че в цикле будет каша, если юзать просто мов и 2 треда
источник