Показаны сообщения с ярлыком железо. Показать все сообщения
Показаны сообщения с ярлыком железо. Показать все сообщения

вторник, 25 февраля 2020 г.

Почему существуют тривиальные функции типа CopyRect и EqualRect?

Это перевод Why are there trivial functions like Copy­Rect and Equal­Rect? Автор: Реймонд Чен.

Если вы покопаетесь внутри user32, вы увидите там некоторые, казалось бы, тривиальные функции - такие как CopyRect и EqualRect. Зачем нам вообще нужны целые функции для того, что можно сделать с помощью операторов := и =?

Один байт = один доллар

Это перевод One byte used to cost a dollar. Автор: Реймонд Чен.

В те времена, когда программное обеспечение распространялось на дискетах (помните дискеты?), для Windows было правило: один байт стоит один доллар.

четверг, 5 сентября 2019 г.

Обновлено: Если FlushInstructionCache ничего не делает, почему я должен её вызывать?

Это перевод If FlushInstructionCache doesn’t do anything, why do you have to call it, revisited. Автор: Реймонд Чен.

Предполагается, что вы будете вызывать функцию FlushInstructionCache, когда вы генерируете или модифицируете исполняемый код в run-time - чтобы процессор при выполнении вашего сгенерированного/модифицированного кода читал бы написанные вами инструкции, а не старые инструкции, которые могут остаться в кеше команд процессора.

Ранее мы узнали, что в Windows 95 функция FlushInstructionCache не делает ничего, кроме возврата. Это потому, что простого вызова функции было достаточно, чтобы очистить кэш команд.

Но в Windows NT функция FlushInstructionCache выполняет реальную работу, поскольку ей необходимо уведомить все остальные процессоры о необходимости очищать их кэши.

Однако если вы посмотрите на Windows 10, то вы обнаружите, что функция FlushInstructionCache выглядит как версия для Windows 95: она ничего не делает.

В чём тут дело?

четверг, 27 июня 2019 г.

Почему функция GetVersion сообщает основную версию в младшем байте и младшую версию в старшем байте?

Это перевод Why does the Get­Version function report the major version in the low-order byte, and the minor version in the high-order byte? Автор: Реймонд Чен.

Лора Батлер задаёт вопрос: кому в голову пришла идея возвращать основную (major) версию в младшем байте, а младшую (minor) версию - в старшем байте функции GetVersion. Надо же делать наоборот: нужно возвращать основную версию в старшем байте и младшую версию в младшем байте, чтобы вы могли делать такое:
if ГипотетическаяУлучшеннаяGetVersion >= $030A then
begin
  // версия минимум 3.10
end;
Вместо этого сейчас основная версия возвращается в младшем байте, а младшая версия - в старшем байте, поэтому версия 3.10 возвращается как значение $0A03, что приводит к таким ошибкам:
if GetVersion >= $0A03 then
begin
  // неверная проверка на версию ≥ 3.10
end;
Почему номер версии возвращается таким странным образом?

понедельник, 21 января 2019 г.

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

Это перевод Why does the compiler generate memory operations on the full variable even though only one byte is involved? Автор: Реймонд Чен.

Когда-то я помогал с генерацией кода JIT компиляторе, и я заметил одну вещь: когда компилятору нужно было, скажем, установить старший бит в четырёхбайтовой переменной, он сделал так:
xor dword ptr [variable], 80000000h
вместо более компактного:
xor byte ptr [variable + 3], 80h
Эти две операции функционально эквивалентны: установка верхнего бита в четырёхбайтовом значении эквивалентна установке верхнего бита в однобайтовом значении - потому что младшие биты не зависят от операции.

Поддержка классического оборудования эмуляцией

Это перевод Keeping classic hardware alive through emulation. Автор: Реймонд Чен.

На конференции и выставке Windows 2000, которая совпала с запуском операционной системы, я посетил стенд emulators.com, где они с увлечением демонстрировали SoftMac 2000 - эмулятор Mac, работающий на Windows 2000.

пятница, 11 января 2019 г.

Зачем нужна красная зона? Я же могу просто использовать стек?

Это перевод Why do we even need to define a red zone? Can’t I just use my stack for anything? Автор: Реймонд Чен.

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

вторник, 20 ноября 2018 г.

Как однажды ядро Windows пыталось противостоять гамма-лучам, разрушающим кэш процессора

Это перевод For a brief period, the kernel tried to deal with gamma rays corrupting the processor cache. Автор: Реймонд Чен.

Однажды вот такой код был добавлен в часть ядра, которая возвращает систему из энергосберегающего режима:
;
; Сбрасывает кэш процессора, чтобы все побочные гамма-лучи (я не шучу),
; которые могли изменить биты кэша S1, игнорировались бы.
;
; Это не шутка. Это просили производители процессора.
; Я серьёзно.
;
invd

четверг, 21 марта 2013 г.

Заметки о VirtualAlloc с MEM_LARGE_PAGES

Это перевод Some remarks on VirtualAlloc and MEM_LARGE_PAGES. Автор: Реймонд Чен.

Если вы пытались запустить этот пример из MSDN, иллюстрирующий создание проекции файла с большими страницами, то, скорее всего, вы столкнулись с ошибкой ERROR_NOT_ALL_ASSIGNED ("Вызывающая сторона не обладает всеми необходимыми правами доступа.") при вызове Adjust­Token­Privileges. В чём проблема?

вторник, 20 марта 2012 г.

Добро пожаловать в эру пост-PC

Это перевод Welcome to the Post PC Era. Автор: Jeff Atwood.

В чём была оригинальная миссия Microsoft?
В 1975 году Гейтс и Аллен создают компанию с названием Microsoft. Как и большинство вновь создаваемых предприятий, Microsoft начинает свою историю с небольших масштабов, но имеет глобальную цель — компьютер на каждый рабочий стол и в каждый дом.

пятница, 24 июня 2011 г.

И опять же: это может быть и не разгон

Это перевод Then again, it might not be overclocking after all. Автор: Реймонд Чен.

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

пятница, 18 марта 2011 г.

С включенным hyperthreading все процессоры - виртуальные

Это перевод When hyperthreading is enabled, all the processors are virtual. Автор: Реймонд Чен.

Частая проблема с ответом на технические вопросы - люди иногда задают вопросы, на которые нельзя ответить, потому что вопрос основывается на недопонимании. Что особенно расстраивает, люди настаивают, чтобы им отвечали на их вопрос, даже хотя вы пытаетесь объяснить им, насколько их вопрос неверен.

четверг, 17 марта 2011 г.

Вы, вероятно, не захотите запускать Windows или приложения напрямую с вашей USB флешки

Это перевод You probably don't want to run programs directly off your USB memory drive. Автор: Реймонд Чен.

Вы, вероятно, не захотите запускать Windows или приложения напрямую с вашей USB флешки, даже если вы можете это сделать.

понедельник, 14 марта 2011 г.

О невозможности поддержки железа, которое больше никто не выпускает

Это перевод On the inability to support hardware that nobody makes any more. Автор: Реймонд Чен.

Windows Vista не будет поддерживать очень старые DVD приводы (вся информация ниже была любезно предоставлена мне командой разработки драйверов оптических накопителей).

четверг, 30 сентября 2010 г.

суббота, 7 августа 2010 г.

Один на миллион - redux

Это перевод One in a million redux. Автор: Ларри Остерман.

Я упомянул свой пост "Один на миллион - это в следующий вторник" в разговоре с женой на следующий день, и она спросила меня: "Так что, ты рассказал там про часы в персоналках"?

И меня озарило, что я этого не сказал. Чёрт! Поэтому: вот этот рассказ. На самом деле, это довольно любопытно.

вторник, 4 мая 2010 г.

"Симметричность" в симметричной многопроцессорности действительно означает "симметричность"

Это перевод The "symmetric" in symmetric multiprocessing really means "symmetric". Автор: Реймонд Чен.

Семейство операционных систем Windows NT поддерживает SMP - симметричную многопроцессорность. И "симметричную" здесь означает именно симметричность. Все процессоры обязаны иметь одинаковую скорость, одинаковый множитель и одинакового производителя. Они должны быть идентичными друг другу по всем параметрам. Это логичный вывод из взаимозаменяемости процессоров при переключении потоков с одного процессора на другой.

воскресенье, 18 апреля 2010 г.

четверг, 11 марта 2010 г.

Где-то там есть куча разогнанных машин...

Это перевод There's an awful lot of overclocking out there. Автор: Реймонд Чен.

Часть нашей команды просматривает отчёты о проблемах Windows, которые люди отправляют нам, нажимая кнопку "Отправить отчёт" в диалоге вылета программы. И оказывается, что огромное количество отчётов вообще не имеют смысла.

среда, 17 февраля 2010 г.

Почему команда Win64 выбрала модель LLP64?

Это перевод Why did the Win64 team choose the LLP64 model? Автор: Реймонд Чен.

Участник Beer28 написал на Channel 9: "Я не могу себе представить, что у многих программ могут быть проблемы с изменением размерности типов". Я усмехнулся и сделал пометку, чтобы написать пост о модели данных Win64.

Команда Win64 выбрала модель данных LLP64, в которой все целочисленные типы остаются 32-х разрядными и только указатели расширяются до 64-х бит. Почему?

В дополнении к причинам, данными на той странице, другой причиной было сохранение совместимости хранимых (persistence) форматов данных. Например, часть заголовка bitmap-файла определяется такой записью:
type
PBitmapInfoHeader = ^TBitmapInfoHeader;
{$EXTERNALSYM tagBITMAPINFOHEADER}
tagBITMAPINFOHEADER = packed record
biSize: DWORD;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: DWORD;
biSizeImage: DWORD;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
TBitmapInfoHeader = tagBITMAPINFOHEADER;
{$EXTERNALSYM BITMAPINFOHEADER}
BITMAPINFOHEADER = tagBITMAPINFOHEADER;
Если бы Longint расширился с 32-х бит до 64-х, то для 64-х разрядных программ стало бы невозможным чтение bitmap-файлов (прим.пер.: напомню, пост идёт о Windows; в Delphi мы пока не имеем 64-х разрядного компилятора, хотя всё идёт к тому, что в Delphi будет так же).

Кроме файлов у нас есть и других форматы. В дополнение к очевидным вещам типа RPC и DCOM, для передачи информации между процессами могут также использоваться двоичные BLOB реестра и блоки разделяемой памяти. Если процесс-источник и процесс-назначение будут различной разрядности, то любое изменение размерности целых приведёт к несовпадению форматов.

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