вторник, 16 февраля 2010 г.

Почему описатели ядра всегда кратны четырём?

Это перевод Why are kernel HANDLEs always a multiple of four?. Автор: Реймонд Чен.

Не слишком хорошо известно, что два младших бита любого описателя ядра (также: дескриптора или HANDLE) всегда равны нулю; другими словами, их численное представление всегда кратно четырём. Заметьте, что это применимо только к описателям объектов ядра; это не так для псевдо-описателей (типа GetCurrentProcess) или описателей других типов (описатели USER или GDI, мультимедийные дескрипторы...). Описателями ядра являются те вещи, которые вы можете передать в функцию CloseHandle.

Доступность младших двух битов кроется в заголовочном файле ntdef.h:
//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
//

#define OBJ_HANDLE_TAGBITS 0x00000003L
То, что как минимум один младший бита всегда равен нулю, также неявно указывается функцией GetQueuedCompletionStatus, описание которой говорит, что вы можете установить младший бит описателя события для подавления уведомления порта. Чтобы это работало, необходимо, чтобы младший бит произвольного описателя изначально всегда был равен нулю.

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

1 комментарий:

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.

Примечание. Отправлять комментарии могут только участники этого блога.