<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2russianfull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>Not a kernel guy</title>
	
	<link>http://blog.not-a-kernel-guy.com</link>
	<description>... in the Windows kernel team</description>
	<pubDate>Sat, 29 Nov 2008 01:32:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/not-a-kernel-guy" type="application/rss+xml" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/not-a-kernel-guy" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fnot-a-kernel-guy" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Работаем сегодня?</title>
		<link>http://blog.not-a-kernel-guy.com/2008/11/28/375</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/11/28/375#comments</comments>
		<pubDate>Sat, 29 Nov 2008 01:32:07 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[default]]></category>

		<category><![CDATA[Юмор]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=375</guid>
		<description><![CDATA[Утро пятницы. 9:30. Большая часть населения Штатов все еще переваривает вчерашнюю индейку с картошкой и прочие излишества праздничного стола. В магазинах бушует Черная пятница. На улицах Сиэтла - парад в честь прибытия Санты Клауса. И в этот момент человек пишет:
А сегодня вообще рабочий день-то?
]]></description>
			<content:encoded><![CDATA[<p>Утро пятницы. 9:30. Большая часть населения Штатов все еще переваривает <a href="http://en.wikipedia.org/wiki/Thanksgiving">вчерашнюю индейку с картошкой</a> и прочие излишества праздничного стола. В магазинах бушует <a href="http://en.wikipedia.org/wiki/Black_Friday_(shopping)">Черная пятница</a>. На улицах Сиэтла - <a href="http://www.king5.com/topstories/stories/NW_112808WAB_holiday_parade_KS.ea0837c.html">парад в честь прибытия Санты Клауса</a>. И в этот момент человек пишет:</p>
<blockquote><p>А сегодня вообще рабочий день-то?</p></blockquote>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=1wKhKG"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=1wKhKG" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=dMPIn"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=dMPIn" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/11/28/375/feed</wfw:commentRss>
		</item>
		<item>
		<title>Иногда люди воспринимают вещи слишком буквально.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/11/24/374</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/11/24/374#comments</comments>
		<pubDate>Tue, 25 Nov 2008 07:31:32 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[itblogs]]></category>

		<category><![CDATA[Wow64]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/11/24/374</guid>
		<description><![CDATA[На днях свалился в inbox вопрос:
The documentation for QueueUserApc states &#34;an APC cannot be queued from a 64-bit process to a 32-bit process or vice versa.&#34;
However on Vista Ultimate x64, we can queue a user APC from a 32-bit process to a 64-bit process. In our test application the 64-bit recipient crashes, we haven&#8217;t explored [...]]]></description>
			<content:encoded><![CDATA[<p>На днях свалился в inbox вопрос:</p>
<blockquote><p>The documentation for <a href="http://msdn.microsoft.com/en-us/library/ms684954(VS.85).aspx">QueueUserApc</a> states &quot;an APC cannot be queued from a 64-bit process to a 32-bit process or vice versa.&quot;</p>
<p>However on Vista Ultimate x64, we <i>can </i>queue a user APC from a 32-bit process to a 64-bit process. In our test application the 64-bit recipient crashes, we haven&#8217;t explored why just yet, but the point is that the operation should not succeed and the 64-bit application&#8217;s APC queue should never have the APC inserted.</p>
<p>Is it an OS bug?</p>
</blockquote>
<blockquote><p>Документация к функции QueueUserApc утверждает, что асинхронный вызов процедуры (APC) не может быть запрошен из 64-х битного процесса для выполнения в 32-х битном и наоборот.</p>
<p>Однако на Vista Ultimate x64 мы <i>можем</i> выполнить асинхронный вызов пользовательского режима из 32-х битного процесса в 64-х битном процессе. В нашем тестовом приложении 64-х битный получатель падает и мы еще не выяснили почему, но дело в том, что операция (QueueUserApc) не должна завершаться успешно и асинхронный вызов не должен вставляться в очередь вызовов 64-х разрядного процесса.</p>
<p>Это баг ОС?</p>
</blockquote>
<p>Вопрос примечателен тем, что это уже третье письмо на эту тему за последние два месяца, хотя функция QueueUserApc далеко не самая широко используемая функция Win32. Не иначе какой настойчивый клиент эту функцию мучает. <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Для начала разберемся, что такое асинхронные вызовы процедур (APC). Те кто знает могут смело пропустить этот абзац. Windows NT поддерживает специальное состояние заблокированного потока &#8211; &#8220;alertable wait&#8221;. Чтобы переключиться в это состояние поток может использовать &#8220;Ex&#8221; версии &#8220;WaitFor&#8221; функций или функции асинхронного ввода-ввода. Это состояние примечательно тем, что поток может быть в любой момент разбужен, при этом управление будет передано по произвольному (заранее согласованному) адресу. Эта возможность используется ядром для уведомления приложения о завершении операции ввода-вывода. К примеру, если в <a href="http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtWriteFile.html">NtWriteFile</a> передан не нулевой ApcRoutine, то по завершении операции ядро вызовет ApcRoutine именно с помощью механизма асинхронных вызовов.</p>
<p>Функция QueueUserApc позволяет воспользоваться этим механизмом в своих корыстных целях. Эта функция ставит запрос на выполнение APC процедуры в определённом потоке. Процедура будет вызвана (возможно, вместе с другими процедурами) в контексте целевого потока, как только тот переключиться в состояние alertable wait. Небольшая, по важная тонкость заключается в том, что адрес процедуры может быть любым. Функция никак не гарантирует его правильность. Если адрес процедуры неверен, то целевой поток, скорее всего, упадет с кодом access violation. При этом поток, вызвавший QueueUserApc, продолжит работу, как ни в чем не бывало.</p>
<p>Далее, поскольку 32-х и 64-х битные процессы используют разную ширину адреса, то с вызовом 64-х разрядных процедур из 32-х битного кода возникают вполне понятные сложности. 32-х битный код просто не имеет возможности передать 64-х битный адрес в QueueUserApc. Передать 32-х адрес возможно, но возникают другие сложности. Например, как отличить адрес 32-х битного кода от адреса 64-х битного также расположенного ниже границы 4GB. </p>
<p><em>Полезная ссылка для тех, кто интересуется деталями: </em><a title="http://www.nynaeve.net/?p=202" href="http://www.nynaeve.net/?p=202"><em>http://www.nynaeve.net/?p=202</em></a></p>
<p>Вернемся теперь к оригинальному вопросу. Формально, тот факт, что QueueUserApc позволяет поставить вызов в очередь потока с другой разрядностью, можно назвать ошибкой. Хотя на самом деле это скорее ошибка в документации, которая должна была бы утверждать, что &#8220; что асинхронный вызов процедуры (APC) <i>не следует</i> запрашивать из 64-х битного процесса для выполнения в 32-х битном и наоборот.&#8221; Небольшая разница, но какой эффект.</p>
<p>Дело в том, что QueueUserApc просто не имеет возможности проверить разрядность целевого потока во всех случаях. Чтобы это было возможно процесс целевого потока должен быть доступен с уровнем доступа <a href="http://msdn.microsoft.com/en-us/library/ms684880(VS.85).aspx">PROCESS_QUERY_INFORMATION или PROCESS_QUERY_LIMITED_INFORMATION</a>. Проверить соответствие разрядности можно в ядре, но там мешает тот факт, что система как раз должна уметь вызывать 32-х битные APC из 64-х разрядного кода. В результате, разработчики Wow64 решили, что овчинка не стоит выделки, и такая проверка не была реализована. Текущая реализация этой функции такова, что вызов процедуры в потоке другой разрядного практически гарантированно приводит к падению целевого потока.</p>
<p>Позвольте, скажете вы, но как же так? Получается, что 32-х разрядно приложение может запросто нарушить работу 64-х разрядных приложений? Это же дыра? На самом деле эта дыра не чуть не больше чем в случае, когда разрядности потоков совпадают. Как я уже говорил, вызывающий поток может передать любой в том числе не корректный адрес, что немедленно приводит к краху целевого потока. Вызывающий поток должен иметь уровень доступа <a href="http://msdn.microsoft.com/en-us/library/ms686769(VS.85).aspx">THREAD_SET_CONTEXT</a> к целевому потоку, что означает, что вызывающая сторона и так имеет полный контроль над целевом потоком.</p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=JnqQ7n"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=JnqQ7n" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=KrS7n"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=KrS7n" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/11/24/374/feed</wfw:commentRss>
		</item>
		<item>
		<title>Первое прямое наблюдение экзопланеты!</title>
		<link>http://blog.not-a-kernel-guy.com/2008/11/13/373</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/11/13/373#comments</comments>
		<pubDate>Fri, 14 Nov 2008 06:50:26 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[default]]></category>

		<category><![CDATA[Астрономия и космос]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2008/11/13/373</guid>
		<description><![CDATA[Офигительная новость. Астрономам удалось увидеть планету, вращающуюся вокруг другой звезды. Не вычислить по колебаниям яркости или лучевой скорости материнской звезды, а именно увидеть. Первым отличился Хаббл:
 
На снимке виден Фомальгаут B &#8211; планета, вращающаяся вокруг звезды Фомальгаут, и пояс обломков и пыли &#8211; остатки формирования планет.
Но и это еще не всё. Другая группа исследователей с [...]]]></description>
			<content:encoded><![CDATA[<p>Офигительная <a href="http://blogs.discovermagazine.com/badastronomy/2008/11/13/huge-exoplanet-news-items-pictures/">новость</a>. Астрономам удалось увидеть планету, вращающуюся вокруг другой звезды. Не вычислить по колебаниям яркости или лучевой скорости материнской звезды, а именно <i>увидеть</i>. Первым <a href="http://www.nasa.gov/mission_pages/hubble/science/fomalhaut.html">отличился Хаббл</a>:</p>
<div class="fig"><img src="http://farm4.static.flickr.com/3001/3026603168_a57722cf33_o.jpg" /> </div>
<p>На снимке виден Фомальгаут B &#8211; планета, вращающаяся вокруг звезды Фомальгаут, и пояс обломков и пыли &#8211; остатки формирования планет.</p>
<p>Но и это еще не всё. <a href="http://www.gemini.edu/node/11151">Другая группа исследователей с помощью 8-ми метрового телескопа Gemini North 8</a> сфотографировала <i>две</i> планеты, вращающиеся вокруг <i>другой</i> звезды. </p>
<div class="fig"><img src="http://www.gemini.edu/images/stories/press_release/pr2008-8/fig2.jpg" /> </div>
<p>И наконец, <a href="http://www.keckobservatory.org/article.php?id=231">10-ти метровый Keck смог увидеть третью планету с этой же системе</a>:</p>
<div class="fig"><img src="http://www.keckobservatory.org/images/article_pictures/231_403.jpg" />&#160;</div>
<p> <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' /> </p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=utNOPo"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=utNOPo" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=9HkUn"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=9HkUn" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/11/13/373/feed</wfw:commentRss>
		</item>
		<item>
		<title>PDC: Отзывы о Windows 7.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/10/28/370</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/10/28/370#comments</comments>
		<pubDate>Wed, 29 Oct 2008 05:07:20 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[itblogs]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[Странное]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=370</guid>
		<description><![CDATA[Почитываю отзывы о показанной на PDC Windows 7. Нахваливают. Боже, и эти же самые люди ругали Vista. Куда катится мир? 
]]></description>
			<content:encoded><![CDATA[<p>Почитываю отзывы о показанной на <a href="http://www.microsoftpdc.com/">PDC</a> Windows 7. Нахваливают. Боже, и эти же самые люди ругали Vista. Куда катится мир? <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=p95coI"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=p95coI" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=DGxFm"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=DGxFm" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/10/28/370/feed</wfw:commentRss>
		</item>
		<item>
		<title>Как работает «раскрутчик» стека в x64.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/10/27/364</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/10/27/364#comments</comments>
		<pubDate>Tue, 28 Oct 2008 05:39:31 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[itblogs]]></category>

		<category><![CDATA[amd64]]></category>

		<category><![CDATA[Обработка исключений]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=364</guid>
		<description><![CDATA[В комментариях к предыдущем посте про исключения верно заметили, что exception chain в TEB используется только в x86 коде. И x64, и ia64 exception chain не используют вообще. Как же, в таком случае, выполняется «раскрутка» стека при обработке исключения?
Когда создавалась архитектура x64, её создатели не хотели повторять ошибки прошлого и наступать на те же грабли, [...]]]></description>
			<content:encoded><![CDATA[<p>В комментариях к предыдущем посте про исключения верно заметили, что exception chain в TEB используется только в x86 коде. И x64, и ia64 exception chain не используют вообще. Как же, в таком случае, выполняется «раскрутка» стека при обработке исключения?</p>
<p>Когда создавалась архитектура x64, её создатели не хотели повторять ошибки прошлого и наступать на те же грабли, на которые наступили их предшественники. В частности для x64 существует <a href="http://msdn.microsoft.com/en-us/library/ms794533.aspx">стандарт соглашения о вызовах</a>, который регламентирует:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794534.aspx">Выравнивание типов и структур</a>;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794547.aspx">Правила использования регистров процессора</a>;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794656.aspx">Порядок передачи параметров</a>;</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794332.aspx">Точный формат кадра стека</a> (stack frame);</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794319.aspx">Виды функций</a>, <a href="http://msdn.microsoft.com/en-us/library/ms794615.aspx">пролог и эпилог функций</a>;
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms794615.aspx">Порядок обработки исключений</a> и <a href="http://msdn.microsoft.com/en-us/library/ms794681.aspx">алгоритм «раскрутки» стека</a>.</li>
</ul>
<p>Чем это лучше того, что твориться в мире x86 кода? Стандартный формат кадра стека позволяет получать достоверную трассировку стека в любой момент времени, при условии, конечно, что компилятор генерирует код соответствующий соглашению о вызовах и если информация о состоянии процессора корректна. При этом абсолютно не используются символы (.pdb). Сравните это с x86, где совершенно корректный код может запросто свести с ума любой отладчик.</p>
<p>Далее, все функции делятся на два типа: «frame» и «leaf». К первым относится любая функция вызывающая другие функции, сохраняющая nonvolatile регистры или использующая исключения. Функции, динамически выделяющие память в стеке с помощью _alloca, также относятся к этой категории. Все остальные – это «leaf» функции. Для каждой «frame» функции компилятор генерирует её описание (function entry), где подробно описываются все действия, выполняемые в прологе функции: от выделения места в стеке до списка сохраняемых регистров вместе с их смещениями в стеке. Пример можно посмотреть, выполнив в отладчике команду “.fnent &lt;symbol&gt;”:</p>
<pre><code class="no-highlight">0:000&gt; .fnent notepad!WinMain
Debugger function entry 00000000`01f48250 for:
(00000000`ff296dd4)   notepad!WinMain   |  (00000000`ff296fd0)   notepad!UpdateStatusBar
Exact matches:
    notepad!WinMain = &lt;no type information&gt;

BeginAddress      = 00000000`00006dd4
EndAddress        = 00000000`00006fc9
UnwindInfoAddress = 00000000`0000dcc0

Unwind info at 00000000`ff29dcc0, 14 bytes
  version 1, flags 0, prolog 14, codes 8
  frame reg 0, frame offs 0
  00: offs 14, unwind op 4, op info 6
  01: offs 12, unwind op 0, op info 0
  02: offs 14, unwind op 4, op info 5
  03: offs 11, unwind op 0, op info 0
  04: offs 14, unwind op 4, op info 3
  05: offs 10, unwind op 0, op info 0
  06: offs 14, unwind op 2, op info d
  07: offs 10, unwind op 0, op info 7</code></pre>
<p>Более подробно об этом можно почитать <a href="http://msdn.microsoft.com/en-us/library/ms794374.aspx">здесь</a>. Имея подобное описание «раскрутчик» стека может достоверно определить границы кадров функций в стеке и восстановить значение non-volatile регистров в каждом кадре в любой момент времени.</p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=keonDu"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=keonDu" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=b2uZm"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=b2uZm" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/10/27/364/feed</wfw:commentRss>
		</item>
		<item>
		<title>Undefined instruction.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/10/20/361</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/10/20/361#comments</comments>
		<pubDate>Tue, 21 Oct 2008 05:33:56 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[itblogs]]></category>

		<category><![CDATA[x86]]></category>

		<category><![CDATA[Ассемблер]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=361</guid>
		<description><![CDATA[Набор команд x86-совместимых процессоров за годы эволюции набрал немалое количество всякой экзотики. Один из примеров такой экзотики – инструкция UD2. Задача этой инструкции состоит в том, чтобы… быть несуществующей инструкцией. Выполнение UD2 всегда приводит к генерации исключения «Invalid opcode». Отличие UD2 от любой другой несуществующей инструкции в том, что эта инструкция гарантированно не станет корректной [...]]]></description>
			<content:encoded><![CDATA[<p>Набор команд x86-совместимых процессоров за годы эволюции набрал немалое количество всякой экзотики. Один из примеров такой экзотики – инструкция UD2. Задача этой инструкции состоит в том, чтобы… быть несуществующей инструкцией. Выполнение UD2 всегда приводит к генерации исключения «Invalid opcode». Отличие UD2 от любой другой несуществующей инструкции в том, что эта инструкция гарантированно не станет корректной инструкцией в будущем.</p>
<p>Интересна  мнемоника этой команды. Суффикс «2» подразумевает, что есть еще и как минимум UD1 или UD, но ни Intel ни AMD не описывают такой инструкцию. Поиск по интернету показывает, что некоторые компиляторы поддерживают (или поддерживали) <em>три</em> варианта этой команды:</p>
<ul>
<li>UD0 (0F FF)</li>
<li>UD1 или UD2B (0F B9) </li>
<li>UD2 или UD2A (0F 0B)</li>
</ul>
<p>Ни одна из этих команд не является корректной командой, но все они по-разному описывается в документации Intel и AMD. Инструкции UD0 (0F FF) соответствует пустая ячейка в таблице двухбайтных команд. Т.е. эта инструкция не определена сейчас, но может быть переопределена  в будущем.</p>
<p>Мнемоника UD1 не упоминается в “Programmer’s Manual”, но комбинация 0F B9 указана в таблице двухбайтных инструкций как «Undefined instruction opcode» и, соответственно, она не может быть переопределена впоследствии. Кроме этого указывается, что за 0F B9 должен следовать ModRM байт, определяющий расширение этой инструкции. Впрочем, все возможные комбинации ModRM байта в сочетании с кодом инструкции 0F B9 всё равно объявлены как «Undefined instruction». Закавыка правда в том, что в примерах, найденных в интернете, за 0F B9 не следует ничего. Кому верить – не понятно.</p>
<p>UD2, похоже, наиболее полно описанный вариант «неопределенной инструкции». Она занимает ровно два байта, её мнемоника легализована и она прочно занимает свою ячейку в таблице двухбайтных команд.</p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=ufMGVI"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=ufMGVI" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=YnJzm"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=YnJzm" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/10/20/361/feed</wfw:commentRss>
		</item>
		<item>
		<title>А что, собственно, происходит, когда бросается исключение?</title>
		<link>http://blog.not-a-kernel-guy.com/2008/10/15/355</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/10/15/355#comments</comments>
		<pubDate>Thu, 16 Oct 2008 02:46:41 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[itblogs]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[Обработка исключений]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=355</guid>
		<description><![CDATA[Нет, ну в общих чертах понятно - процессор генерирует исключение, операционная система находит нужный обработчик и вызывает его. А что происходит, если посмотреть подробнее? В Windows происходит примерно следующее.
Выполняя поток команд, процессор проверят возможность выполнения каждой инструкции, корректность её аргументов и все остальные факторы, влияющие на корректность выполнения кода. В случае если команда не может [...]]]></description>
			<content:encoded><![CDATA[<p>Нет, ну в общих чертах понятно - процессор генерирует исключение, операционная система находит нужный обработчик и вызывает его. А что происходит, если посмотреть подробнее? В Windows происходит примерно следующее.</p>
<p>Выполняя поток команд, процессор проверят возможность выполнения каждой инструкции, корректность её аргументов и все остальные факторы, влияющие на корректность выполнения кода. В случае если команда не может быть выполнена (деление на ноль, обращение к несуществующей странице, несоответствие уровня привилегий и т.д.), процессор генерирует исключение – вызывает один из обработчиков, зарегистрированных операционной системой в IDT (Interrupt Dispatch Table).</p>
<p>При вызове обработчика процессор делает сразу несколько вещей: переключается в режим ядра (Ring 0), переключает указатель стека на ядерный стек и сохраняет предыдущие указатели команд и стека в ядерном стеке.</p>
<div class="fig"><img src="http://blog.not-a-kernel-guy.com/wp-content/uploads/2008/10/exception_ring0_transition.png" alt="Transition to Ring0" /></div>
<p>Получив контроль, обработчик исключения сохраняет остальные регистры процессора в стеке и выполняет действия, специфичные для конкретного исключения. Например, обработчик Page Fault Exception запрашивает подкачку страницы у Memory Manager. Если обработчику удалось  разрешить проблему, вызвавшую генерацию исключения, обработчик восстанавливает сохраненное состояние процессора и выполняет возврат в пользовательский код (Ring 3). В противном случае, в дело вступает диспетчер исключений.</p>
<p>Диспетчер исключений размещает структуру CONTEXT в пользовательском стеке и копирует туда сохранённое состояние регистров из ядерного стека. Туда же сохраняется текущее состояние Floating Point регистров. Информация об исключении записывается в структуру EXCEPTION_RECORD. Далее, диспетчер подменяет адрес возврата в пользовательский код адресом диспетчера исключений пользовательского режима и выполняет возврат в Ring 3.</p>
<p>Windows поддерживает специальную структуру, TEB (Thread Environment Block), где хранятся локальные данные потока. Эта структура  доступна из Ring 3 через сегмент FS (или GS для x64). В самом начале этой структуры хранится указатель на список вложенных блоков “__try” и соответствующих им блоков “__except” и “__finally”. Компилятор генерирует код, добавляющий элемент в этот список при входе в блок “__try” и удаляющий при выходе из блока. <em>(Примечание: справедливо только для x86. 64-х битный код &#8220;раскручивает&#8221; стек пользуясь сгенерированным компилятором описанием кода.)</em></p>
<div class="fig"><img src="http://blog.not-a-kernel-guy.com/wp-content/uploads/2008/10/exception_chain.png" alt="Transition to Ring0" /></div>
<p>Получив управление, диспетчер исключений пользовательского режима по очереди опрашивает обработчики из списка, позволяя каждому из них обработать данное исключение. Найдя обработчик, согласившийся обработать исключение, диспетчер исключений выполняет «раскрутку» стека (Stack Unwinding) и передает управление выбранному обработчику. Этот механизм довольно детально описывался во всевозможных статьях о том, как работает SEH (Structured Exception Handling) (например <a href="http://www.rsdn.ru/article/baseserv/except.xml">здесь</a> или <a href="http://www.nynaeve.net/?p=113">здесь</a>), так что я не буду останавливаться на этом детально. «Раскрутчик» стека отслеживает текущее состояние (указатель стека и команд, состояние регистров) в локальной копии структуры CONTEXT. По окончанию обработки исключения, состояние из структуры CONTEXT загружается в процессор, завершая обработку исключения.</p>
<p>И это только поверхностное описание. <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=zl53KU"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=zl53KU" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=6NW6m"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=6NW6m" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/10/15/355/feed</wfw:commentRss>
		</item>
		<item>
		<title>Спам в комментариях.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/10/12/353</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/10/12/353#comments</comments>
		<pubDate>Sun, 12 Oct 2008 23:07:34 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[default]]></category>

		<category><![CDATA[Спам]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=353</guid>
		<description><![CDATA[Количество спама в комментариях выходит за всякие разумные рамки. К счастью 99% процентов спама успешно отлавливается спам фильтрами, так что совсем отключать комментирование в блоге пока не хочется. Но частенько в спам попадают и те комментарии, которые, строго говоря, спамом не являются. Именно для авторов этих комментариев и предназначена эта страничка.
]]></description>
			<content:encoded><![CDATA[<p>Количество спама в комментариях выходит за всякие разумные рамки. К счастью 99% процентов спама успешно отлавливается спам фильтрами, так что совсем отключать комментирование в блоге пока не хочется. Но частенько в спам попадают и те комментарии, которые, строго говоря, спамом не являются. Именно для авторов этих комментариев и предназначена <a href="http://blog.not-a-kernel-guy.com/%D1%81%D0%BF%D0%B0%D0%BC-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D1%8F%D1%85">эта страничка</a>.</p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=8cqQWV"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=8cqQWV" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=LPEAm"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=LPEAm" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/10/12/353/feed</wfw:commentRss>
		</item>
		<item>
		<title>Успешный запуск Falcon-1.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/09/29/346</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/09/29/346#comments</comments>
		<pubDate>Tue, 30 Sep 2008 05:21:24 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[default]]></category>

		<category><![CDATA[Астрономия и космос]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=346</guid>
		<description><![CDATA[А тем временем в замке у шефа… в смысле компания SpaceX провела успешный запуск макета полезной нагрузки на орбиту с помощью своей ракеты Falcon-1. Можно сказать эпохальное событие – первая частная ракета, способная вывести полезную нагрузку на орбиту Земли. На очереди – отладка Falcon-9 и, дай бог, запуск пилотируемого Dragon.

Эх, накопить бы немного деньжат – [...]]]></description>
			<content:encoded><![CDATA[<p>А тем временем в замке у шефа… в смысле <a href="http://blog.wired.com/wiredscience/2008/09/space-x-did-it.html">компания SpaceX провела успешный запуск макета полезной нагрузки на орбиту с помощью своей ракеты Falcon-1</a>. Можно сказать эпохальное событие – первая частная ракета, способная вывести полезную нагрузку на орбиту Земли. На очереди – отладка Falcon-9 и, дай бог, запуск пилотируемого Dragon.</p>
<div class="fig"><a href="http://blog.wired.com/wiredscience/2008/09/space-x-did-it.html"><img src="http://blog.not-a-kernel-guy.com/wp-content/uploads/2008/09/orbit.jpg" alt="Falcon-1 launch." /></a></div>
<p>Эх, накопить бы немного деньжат – в космос слетать. Или маленький остров в Тихом океане купить. :-/</p>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=rLJNkA"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=rLJNkA" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=XJIxl"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=XJIxl" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/09/29/346/feed</wfw:commentRss>
		</item>
		<item>
		<title>Цитатка.</title>
		<link>http://blog.not-a-kernel-guy.com/2008/09/29/342</link>
		<comments>http://blog.not-a-kernel-guy.com/2008/09/29/342#comments</comments>
		<pubDate>Mon, 29 Sep 2008 21:16:26 +0000</pubDate>
		<author>alexeypa@gmail.com (Not a kernel guy)</author>
		
		<category><![CDATA[default]]></category>

		<category><![CDATA[Странное]]></category>

		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/?p=342</guid>
		<description><![CDATA[С forum.exler.ru:
Поясняю - прямой угол плоскости одной точки - это такой угол (в частности) , для которого выплняется условие равенства одного n-мерного объекта, получающегося ЕДИНСТВЕННО пересечением двух одноразмерных объектов одного порядка и оба объекта пересечения не относится к данному углу одновременно, которые выше порядка объекта угла ровно на 1 единицу, другому объекту одного с углом [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://forum.exler.ru/t/140647/p/16967778">С forum.exler.ru</a>:</p>
<blockquote><p>Поясняю - прямой угол плоскости одной точки - это такой угол (в частности) , для которого выплняется условие равенства одного n-мерного объекта, получающегося ЕДИНСТВЕННО пересечением двух одноразмерных объектов одного порядка и оба объекта пересечения не относится к данному углу одновременно, которые выше порядка объекта угла ровно на 1 единицу, другому объекту одного с углом порядка размерности, получаемого ЕДИНСТВЕННО пересечением двух одноразмерных объектов одного порядка и оба объекта пересечения не относится к данному углу одновременно, которые выше порядка объекта угла ровно на 1 единицу и эти 2*N объектов должны быть НЕ РАВНЫ между собой (как частный вариант - все 4 объекта НЕ равны между собой).</p></blockquote>
<p>Во как! 8-/</p>
<p>Update: Там еще и иллюстрация есть:</p>
<div class="fig"><img src="http://forum.exler.ru/uploads/129/post-1222704180.jpg" alt="" /></div>

<p><a href="http://feeds.feedburner.com/~a/not-a-kernel-guy?a=9jeRTV"><img src="http://feeds.feedburner.com/~a/not-a-kernel-guy?i=9jeRTV" border="0"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/not-a-kernel-guy?a=A5pWl"><img src="http://feeds.feedburner.com/~f/not-a-kernel-guy?i=A5pWl" border="0"></img></a>
</div>]]></content:encoded>
			<slash:comments>0</slash:comments> 
		<wfw:commentRss>http://blog.not-a-kernel-guy.com/2008/09/29/342/feed</wfw:commentRss>
		</item>
	<feedburner:awareness xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://api.feedburner.com/awareness/1.0/GetFeedData?uri=not-a-kernel-guy</feedburner:awareness></channel>
</rss>
