Переключение контекста обработки исключений и SEH

В последнее время я кое-что читал об обработке исключений и .NET Framework, и это, кажется, еще больше запутало меня, чем когда я начинал.

В CLR через четвертое дополнение C #, которое я прочитал:

Кроме того, механизм обработки исключений .NET Framework построен с использованием механизма структурированной обработки исключений (SEH), предлагаемого Microsoft Windows. SEH обсуждался во многих ресурсах, в том числе в моей книге «Windows через C / C ++», 5-е изд. (Microsoft Press, 2007), который содержит три главы, посвященные SEH.

Вот где начинается мое замешательство. Если .Net Framework создается с использованием SEH, но используется ли он только для необработанного исключения или используется сразу же для всей обработки исключений в .NET, если да, то где CLR подходит, принимает очереди из SEH или он действует самостоятельно и использует SEH, если и когда Возникло необработанное исключение?.

Второй. Каким образом происходит переключение контекста из режима ядра в режим пользователя? Я знаю, когда создается поток (из CLR через C #)

Блок среды потока (TEB) TEB - это блок памяти, выделенный и инициализированный в пользовательском режиме (адресное пространство, к которому код приложения может быстро получить доступ). TEB занимает 1 страницу памяти (4 КБ на процессорах x86 и x64, 8 КБ на процессоре IA64). TEB содержит заголовок цепочки обработки исключений потока. Каждый блок try, в который входит поток, вставляет узел в начало этой цепочки; узел удаляется из цепочки, когда поток существует в блоке try. Кроме того, TEB содержит данные локального хранилища потока, а также некоторые структуры данных для использования интерфейсом графических устройств (GDI) и графикой OpenGL.

А также стек пользовательского режима и стек режима ядра. Но почему переключение контекста должно происходить в любой момент, если у них все необходимое для обработки находится в одном потоке?


person jquery auth    schedule 25.11.2010    source источник


Ответы (2)


Вот очень подробное объяснение того, как CLR обрабатывает исключения (я полагаю, одним из архитекторов CLR): http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

person Simon Mourier    schedule 25.11.2010
comment
Спасибо за ссылку, так как дополнительное чтение всегда полезно, хотя я знаю, что способ обработки исключений изменился в 2005 году, особенно в том, что касается того, как исключения теперь помещаются в оболочку, удобную для CLR. - person jquery auth; 25.11.2010
comment
Поскольку статья датирована 2003 годом, я полагаю, он говорит о CLR V2 (выпущенной в 2005 году), поскольку он был членом команды разработчиков CLR. Не знаю, действительно ли это изменилось с тех пор. - person Simon Mourier; 25.11.2010

[SEH] используется сразу же для всей обработки исключений в .NET.

да. Создание исключений .NET приводит к возникновению структурированного исключения Win32.

Почему переключение контекста должно происходить в любой момент, если все, что нужно для обработки, находится в одном потоке?

Когда вы генерируете исключение, ваш поток переходит в режим ядра и обратно, но задействован только один поток. Режим ядра - это не отдельный поток; это место, которое может посетить ваша ветка.

Все исключения Win32 должны передаваться через ядро. Например, инфраструктура отладчика находится в режиме ядра, и отладчику может потребоваться перехватить исключение до того, как его увидит код пользовательского режима.

person Tim Robinson    schedule 25.11.2010
comment
Спасибо! Я думаю, что могу неправильно понять режим ядра и пользовательский режим, я думал, что они принадлежат потоку. - person jquery auth; 25.11.2010