6K подписчиков

Программирование на GAS в Linux x86-64. Использование функции mmap для динамического выделения памяти (книга)

Продолжаем публикацию книги о программирование на языке ассемблера (GAS) в операционной системе Linux (x86-64). Сегодня продолжаем рассматривать вопросы памяти.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021
Книга "Ассемблер для Linux"
Old Programmer4 июля 2021
Из записок старого программиста. Притчи о компьютерных жителях. Товарищ Комманд Ком, Диггер и отец Виндовс...
Old Programmer31 июля 2020

Параграф 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.

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer27 мая 2021

<--Глава 5. Параграф 5.4 -->Глава 6. Параграф 6.1

Фрагмент программы l49.s
Фрагмент программы l49.s

#программирование #программисты #assembler #ассемблер #языки программирования