[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Программирование процессов ядра

Программирование процессов ядра подробно рассматривается в книге AIX 5L Version 5.1 Kernel Extensions and Device Support Programming Concepts. В настоящем разделе обсуждаются только основные особенности при программировании процессов ядра в многопроцессорных системах.

При обращении к ряду важных ресурсов часто необходима сериализация. Для сериализации обращений нитей к ресурсам в среде процесса можно применять функции блокировки, однако они не обеспечивают защиту от одновременного доступа в среде прерываний. Ранее функции ядра обеспечивали последовательный доступ к данным на уровне прерываний, запрещая прерывания с помощью функции ядра i_disable. Однако этот способ неприменим в многопроцессорной среде. Следовательно, в новом или перенесенном коде должны применяться службы ядра disable_lock и unlock_enable, которые помимо контроля прерываний применяют простые блокировки. Эти службы можно применять и в однопроцессорных системах: в этом случае они используют только службы прерываний, без блокировок. Более подробная информация по этому вопросу приведена в разделе Locking Kernel Services книги AIX 5L Version 5.1 Kernel Extensions and Device Support Programming Concepts.

Драйверы устройств по умолчанию запускаются в логической однопроцессорной среде, в т.н. последовательном режиме. Большинство хороших драйверов для однопроцессорных систем работают в этом режиме без какой-либо модификации, однако для наиболее полного использования преимуществ многопроцессорной среды их необходимо тщательно проверить и при необходимости изменить. Наконец, службы ядра, предназначенные для работы с таймерами, теперь должны возвращать значения, поскольку в многопроцессорной среде работа этих служб не всегда завершается успешно. Следовательно, в новом или перенесенном коде необходимо предусмотреть проверку возвращаемых значений этих функций. Более подробная информация по этому вопросу приведена в разделе Using Multiprocessor-Safe Timer Services книги AIX 5L Version 5.1 Kernel Extensions and Device Support Programming Concepts.

32- и 64-разрядная адресация

В AIX приложения могут быть либо 32-, либо 64-разрядными.

32-разрядное приложение - это приложение, выполняемое в среде с 32-битовыми адресами, т.е. максимальный объем адресуемой памяти (виртуального адресного пространства) составляет 4 Гб.

64-разрядное приложение - это приложение, выполняемое в среде с 64-битовыми адресами, благодаря чему объем адресуемой памяти значительно увеличивается (свыше миллиарда гигабайт).

При создании приложения необходимо выбрать его разрядность. 32-разрядные приложения могут выполняться в любых системах RS/6000, а 64-разрядные - только в 64-разрядных. И 32-разрядные, и 64-разрядные приложения (а также библиотеки) можно компилировать и компоновать как в 32-разрядных, так и в 64-разрядных системах.

Производительность

При создании 32-разрядного и 64-разрядного приложения из одного и того же исходного кода 64-разрядное приложение будет того же или большего размера по сравнению с 32-разрядным и будет работать не быстрее (а часто даже медленнее), если только оно не использует возможности 64-разрядной адресации для повышения производительности. Следовательно, в большинстве случаев следует создавать 32-разрядные приложения. Исключение составляют ситуации, в которых 64-разрядная адресация необходима или значительно повышает производительность. Поэтому инструменты разработки приложений по умолчанию создают 32-разрядные объекты и приложения.

Применение 64-разрядной адресации позволяет значительно повысить производительность приложений, обрабатывающих большие объемы данных, независимо от того, создаются ли эти данные самим приложением или же считываются из файлов. Повышение производительности в этом случае обусловлено тем, что 64-разрядное приложение может поместить в адресное пространство такой объем данных (созданных в рамках структур данных или отображенных в память), который слишком велик для 32-разрядного адресного пространства. Это преимущество проявляется в случаях, когда объем данных измеряется гигабайтами.

Описанное повышение производительности объясняется двумя причинами. Во-первых, отображение файлов в память позволяет значительно сократить число системных вызовов, связанных с чтением и записью файлов. Во-вторых, объем физической памяти в 64-разрядных системах может значительно превышать объем адресного пространства 32-разрядного приложения, поэтому 64-разрядные приложения могут полностью использовать весь доступный объем физической памяти.

64-разрядные объекты и типы архивных файлов

64-разрядные библиотеки и приложения могут создаваться только из 64-разрядных объектов. 64-разрядный объект - это объект (64-разрядного формата XCOFF), созданный в ходе компиляции или ассемблирования в 64-разрядном режиме. (Под этим подразумевается не запуск компилятора или ассемблера в 64-разрядной среде, а просто создание в ходе компиляции или ассемблирования 64-разрядных, а не 32-разрядных объектов.) В версиях AIX до 4.3 поддерживался только 32-разрядный формат XCOFF.

Невозможно создать объект или приложение, включающее в себя как 32-разрядные, так и 64-разрядные объектные файлы. Системная библиотека содержит и 32-разрядные, и 64-разрядные объектные файлы. Компоновщик выбирает из библиотеки объекты, соответствующие установленному режиму компоновки (32 или 64 разряда), и создает объект или приложение соответствующего типа.

Предусмотрено два типа архивных файлов. Файлы первого типа не могут быть 64-разрядными и их объем не может превышать 2 Гб. В версиях AIX до 4.3 поддерживался только этот тип архивных файлов. Файлы второго типа могут быть как 32-, так и 64-разрядными; их объем не ограничен 2 гигабайтами.

Отличия 64-разрядной среды выполнения от 32-разрядной

Помимо длины адреса, 64-разрядная среда (или режим) отличается от 32-разрядной по следующим параметрам:

Размеры всех базовых типов языка С, за исключением типа long и указателей, при компиляции в 32-разрядном и 64-разрядном режимах совпадают.

Инструменты для разработки 64-разрядных приложений

В AIX поддерживаются все стандартные инструменты разработки, тестирования и отладки 64-разрядных приложений.

Команды yacc, lex и lint работают с исходным кодом, предназначенным для компиляции как в 32-разрядном, так и в 64-разрядном режимах.

Компиляторы языков C и Фортран, а также ассемблер, поддерживают создание 32- и 64-разрядных объектов. Компоновщик также может создавать как 32-разрядные, так и 64-разрядные объекты и приложения.

Команды make, ar, strip, dump, nm, prof, gprof, lorder, ranlib, size, strings и sum работают как с 32-разрядными, так и с 64-разрядными объектами и приложениями.

Команды dbx и xldb позволяют отлаживать как 32-разрядные, так и 64-разрядные приложения.

Перенос исходного кода из 32-разрядной среды в 64-разрядную

При подготовке исходного кода 32-разрядного приложения к компиляции в 64-разрядном режиме для создания 64-разрядного приложения следует выполнить следующие действия:

При переносе исходного кода из 32-разрядной среды компиляции в 64-разрядную можно указать флаг -t команды lint для обнаружения фрагментов, подлежащих изменению.

Разработка 64-разрядных приложений

Почти все API (интерфейсы прикладных программ) для 32-разрядных приложений существуют и в 64-разрядном варианте. Исключение составляют некоторые библиотеки для 32-разрядных приложений, которые подлежат замене или не рекомендованы к использованию: в 64-разрядном режиме их API отсутствуют.

Имена типов, глобальных переменных, макрокоманд препроцессора и предопределенных констант в 32-разрядном и 64-разрядном режимах совпадают. Однако их размеры и значения (а для структурных типов - и состав) в 32-разрядном и 64-разрядном режимах могут не совпадать вследствие различий в объеме адресного пространства и реализации базовых типов.

Имена функций API, типы их параметров и возвращаемых значений в 32-разрядном и 64-разрядном режимах совпадают. Однако размеры (а для структурных типов - и состав) параметров и возвращаемых значений в 32-разрядном и 64-разрядном режимах могут не совпадать вследствие различий в объеме адресного пространства и реализации базовых типов.

Разработка 64-разрядных библиотек

Библиотеки должны предоставлять 64-разрядным приложениям те же функции, что и 32-разрядным. Это облегчает перенос приложений из 32-разрядной среды в 64-разрядную. Для упрощения переноса приложений следует сохранить имена функций, типы их параметров и возвращаемых значений, заданные в 32-разрядной библиотеке.

При выборе типа параметров и возвращаемых значений следует исходить из того, что они представляют. Если параметр или значение представляют размер объекта в адресном пространстве, то их тип должен быть производным от типа С "long". В противном случае тип параметра или значения должен быть производным от типа C "char", "short", "int" или "long long", в зависимости от максимально возможного значения. (Размеры этих типов в 32-разрядном и 64-разрядном режимах совпадают.)

Библиотеки должны содержать как 32-разрядные, так и 64-разрядные объектные файлы для поддерживаемых API. Это значительно сокращает объем работы по переносу файлов make при переносе приложений из 32-разрядной среды в 64-разрядную. В системных библиотеках объектные файлы для 32- и 64-разрядных приложений хранятся в одном архивном файле.

32-разрядные приложения могут загружать только 32-разрядные объекты. 64-разрядные приложения могут загружать только 64-разрядные объекты. Для API загрузки объектов необходимо поместить 32-разрядную и 64-разрядную версии объекта в разные файлы.

Разработка 64-разрядных расширений ядра

Расширения AIX выполняются в 32-разрядном режиме, если загружено 32-разрядное ядро, и в 64-разрядном режиме, если загружено 64-разрядное ядро.

Расширения ядра, не рассчитанные на работу с 64-разрядными приложениями, поддерживают только 32-разрядные приложения. Попытка 64-разрядного приложения выполнить системный вызов для расширения ядра, не поддерживающего 64-разрядные приложения, закончится неудачей. Определить, поддерживает ли данное расширение ядра 64-разрядные приложения, можно при его загрузке с помощью процедуры sysconfig: при этом устанавливается флаг SYS_64BIT.

Поддержка 64-разрядных приложений расширениями ядра включает в себя два аспекта:

Первый аспект - это новые службы ядра, предназначенные для работы с 64-разрядными адресами. Для проверки 64-разрядного адресного пространства и выполнения операций над ним предназначены службы: as_att64 , as_det64, as_geth64, as_puth64, as_seth64 и as_getsrval64 .

Для копирования данных в 64-разрядное адресное пространство и из него - следующие службы: copyin64, copyout64, copyinstr64, fubyte64, fuword64, subyte64 и suword64.

Для отображения промежуточной памяти в 64-разрядное адресное пространство оперативной памяти - служба: xmattach64.

Для отображения в физическую память - службы: rmmap_create64 и rmmap_remove64.

Основное отличие этих служб от их 32-разрядных аналогов состоит в использовании 64-разрядных пользовательских адресов вместо 32-разрядных.

Служба IS64U определяет, является ли процесс (и его адресное пространство) 32-разрядным или 64-разрядным.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]