LINUX.ORG.RU

Адрес памяти, возвращенной mmap()


0

1

Можно ли в программе на Си считать адрес виртуальной памяти, которую вернула mmap() - неизменным?
Может ли изменяться со временем значение, которое вернула malloc() или mmap()? Всмысле, «плавают» ли блоки по памяти? Логика подсказывает, что это недопустимо.

Второй вопрос - есть ли в Линукс аналог виндовой функции GetLargestFreeMemRegion()?

★★★★★

1. Да.

2. хз.

mv ★★★★★
()

Второй вопрос - есть ли в Линукс аналог виндовой функции GetLargestFreeMemRegion()?

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

I-Love-Microsoft ★★★★★
()

Единственная ситуация когда меняется начало блока памяти — это realloc()

Ну и mremap()

Насчёт наибольшего блока — тут вообще не понятно зачем тебе это надо. На 64 битных там кагбе очень большой блок тебе могут дать. А смысл? Посмотри в сторону jemalloc. Может там чо есть.

mmarkk
()

второе есть на уровне ядра. Если очень нужно, можно модуль написать, который бы выделял и хранил.

hibou ★★★★★
()
Ответ на: комментарий от hibou

Правда, оно может выделить такой кусок только на стадии загрузки. Потом уже никак.

hibou ★★★★★
()

есть ли в Линукс аналог виндовой функции GetLargestFreeMemRegion

Зачем в Linux этот дикий костыль? В linux можно выделить сколько хочешь памяти одним куском, а уж как ядро будет подсовывать свободные страницы и мапить в твой кусок - это забота ядра.

no-such-file ★★★★★
()

1. Если remap (в смысле - munmap, а потом опять mmap) не делать - то да. А еще есть «срывающая крышу» функция remap_file_pages(…).

2. Ядро выделяет при malloc какую-то страницу, а затем, по мере необходимости, добавляет новые страницы памяти. Блоки никуда не «плавают».

3. Нет такой функции (да и не нужна она). Однако, можно выделить, скажем, гигабайт оперативы, забить ее нулями, а потом пройтись по блоку в поисках наиболее большого куска. Только на уровне пользователя такое сделать невозможно.

Eddy_Em ☆☆☆☆☆
()

pacify

Можно ли в программе на Си считать адрес виртуальной памяти, которую вернула mmap() - неизменным?

да

pacify

Всмысле, «плавают» ли блоки по памяти?

физически - не только плавают, но часто вообще не существуют, или лежат в свопе. Но вам это важно?

drBatty ★★
()

а как т.с. себе это представляет? допустим я сделал malloc/mmap и сохранил указатель в куче разных структур и прочих мест. а потом бац! адрес поменялся. сегфолтиться что-ли теперь?

nanoolinux ★★★★
()
Ответ на: комментарий от Eddy_Em

Блоки никуда не «плавают».

Ок. Понял.

pacify ★★★★★
() автор топика
Ответ на: комментарий от pathfinder

Присоединяюсь к вопросу. Зачем оно нужно?

Переписываю виндовый код, чтоб работало под Линукс. Приходится все эти вещи проверять.

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.