За последние две-три недели узнал много нового...

За последние две-три недели узнал много нового про архитектуру amd64. Во-первых, я наткнулся сначала на документ, а затем на аналогичный раздел в MSDN, где толково описаны не только соглашения о вызовах (этого добра везде навалом), но и дано детальное описание того, как должен выглядеть стек функции, как происходит раскрутка стека, что такое и зачем нужны пролог и эпилог функции. Полезный документ, особенно если нужно разобраться как работает stack unwinder.

Во-вторых, пришлось плотно познакомиться с тем, как именно работает переключение контекста на amd64 и x86, на кой нужны trap и exception frames и сопутствующие прелести ядра NT. С удивлением узнал, например, что функция переключения контекста работает совсем не так, как я себе это раньше представлял. То есть я думал, что когда происходит переключение контекста, то сначала сохраняется состояние регистров процессора для текущего потока, переключаются стеки и сопутствующие структуры, а затем восстанавливается состояние регистров нового потока. Оказалось, что регистры сохранять/восстанавливать по большей части не нужно, так как они сохраняются автоматически в силу выполнения правил соглашения о вызовах. Часть регистров сохраняется вызывающей функцией (любой), друга часть - вызываемой (тоже любой) и на долю функции переключения контекста практически ничего не остаётся.

В общем, я сейчас в состоянии «О сколько нам открытий чудных…». Только времени на написание постов в журнал не остаётся. :-(

comments powered by Disqus