Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня продолжаем рассматривать вопросы памяти.
Параграф 5.5
Использование функции mmap для динамического выделения памяти
Использование функции mmap для работы с файлами, отображенными в память, не ограничивают ее возможности. Функция может быть использована просто для выделению памяти, как альтернатива функции brk. Рассмотрим возможные подходы в ее использовании.
Если использовать функцию mmap с флагом MAP_ANONYMOUS = 32 то функция будет игнорировать во-первых, дескриптор файла, обычно ему присваивают значение 1, во-вторых, последний аргумент — смещение внутри файла. В результате память указанного размера будет выделена и функция возвратит адрес начала это памяти, и она может быть использована по усмотрению данной программы.
В листинге 53 представлена программа, которая выделяет память с помощью mmap и далее осуществляется запись и чтение из этой области.
Пояснение к программе из листинга 53.
1. Программа похожа на программу из листинга 52, где показано отображение файла в память. Я просто убрал те части, которые, которые имеют отношение к файлу. Кроме того, программа пишет в выделенную область и читает из нее.
2. В программа есть два одинаковых закомментированных фрагмента Проверка 1 и Проверка 2. Они служат для проверки того, что память действительно выделяется. Если снять комментарии с первого фрагмента, то программа не сможет писать в выделенную область, а если снять комментарии со второго фрагмента, то программа не сможет читать из выделенной области. Оба фрагмента это вызов системной функции munmap, которая закрывает выделенную область.
Программа может откомпилирована с помощью последовательности командами
as --64 l49.s -o l49.o
ld -s l49.o -o l49
Таким образом функция mmap оказалась альтернативой для функции brk для выделения динамической памяти.
Важное замечание.
Функция mmap допускает еще один способ, позволяющий выделять память без обращения к файлу, и без использования флага MAP_ANONYMOUS. Можно открыть устройство /dev/zero, как обычный файл. Полученный дескриптор дескриптор использовать как дескриптор файла. Данный файл является бесконечным источников нулевых байтов. Туда же можно записывать бесконечно большие цепочки символов. Таким образом данное устройство в сущности может использовать для создания фиктивного файла произвольного размера. Открыв этот файл и используя функцию mmap мы получим тот же результат, что и при использовании флага MAP_ANONYMOUS. В некоторых unix-подобных системах такой способ выделения динамической памяти с помощью функции mmap может оказаться единственным.
На сегодня все. Подписываемся на мой канал Old Programmer и ставьте "лайки". А я продолжаю заниматься книгой Ассемблер для Linux 64.
<--Глава 5. Параграф 5.4 -->Глава 6. Параграф 6.1
#программирование #программисты #assembler #ассемблер #языки программирования