2011-04-06 6 views
0

Я хотел бы выделить память в Linux в процессе по определенному адресу. На самом деле я хотел бы сделать что-то вроде: У меня будет количество процессов. Каждый процесс вызовет функцию инициализации в библиотеке (написанной мной), которая будет выделять некоторую память в адресном пространстве процесса (который будет хранить информацию, относящуюся к процессу). Это будет выполняться каждым процессом.Выделение определенного адреса в Linux

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

Проблема заключается в том, что я не могу сохранить адрес памяти, выделенной в адресном пространстве процесса в библиотеке (даже не в статическом указателе, поскольку есть число процессов), и я даже не хочу, чтобы программа пользователя сохраняла этот адрес , Я просто не хочу, чтобы пользовательская программа знала, что в их адресном пространстве выделена библиотека, выделенная библиотекой. Функция библиотеки будет абстракцией для них, и они должны просто использовать их.

Возможно ли преодолеть эту проблему. Я думал, что всякий раз, когда какой-либо процесс вызывает функцию инициализации библиотеки, которая выделяет память, память всегда распределяется по одному и тому же адресу (скажем, 10000) во всем процессе, независимо от всех других вещей.

Так что любая функция библиотеки, которая хочет получить доступ к этой памяти можно легко сделать с помощью: char *p=10000;

, а затем доступа, который будет доступ в адресное пространство процесса, который называется библиотечную функцию.

+1

Вопрос немного расплывчатый. У вас есть конкретный пример использования? –

+0

Почему библиотека не может отслеживать распределения?Например, в динамическом списке. – jwd

ответ

4

Не 100% я получил то, что вы стремитесь, но если вы хотите отобразить память в определенном наборе адреса вы можете использовать флаг MAP_FIXED в MMAP():

«Когда MAP_FIXED установлен в тростнике аргумент, реализация проинформирована о том, что значение pa должно быть точно указано. Если MAP_FIXED установлен, mmap() может возвращать MAP_FAILED и устанавливать errno на [EINVAL]. Если запрос MAP_FIXED успешный, сопоставление, установленное mmap() заменяет любые предыдущие сопоставления для страниц процесса в диапазоне [pa, pa + len) ».

Смотрите страницу ММАП человек: http://linux.die.net/man/3/mmap

+3

Просто будьте осторожны, потому что MMAP_FIXED возьмет на себя все, что уже существует по этому адресу. Трудно узнать, из библиотеки, если в процессе уже что-то отображается. – jwd

0

Ваш вопрос не делает чувство. Поскольку вы сформулировали свой вопрос, глобальная переменная в вашей библиотеке будет работать нормально.

Возможно, вы говорите, что «один процесс может загрузить/выгрузить вашу библиотеку, а затем снова загрузить библиотеку и получить адрес на втором загрузке». Может быть, вы говорите: «Есть 2 библиотеки, и каждая библиотека нуждается в одном адресе». Просто. Используйте setenv() и getenv(). Они будут хранить/извлекать все, что может быть представлено в виде строки в переменной, имеющей PROCESS WIDE SCOPE .... i.e все библиотеки могут видеть одни и те же переменные среды. Просто преобразуйте свой адрес в строку (itoa), используйте setenv(), чтобы сохранить его в переменной среды с именем «__SuperSecretGlobalAddress__», а затем используйте getenv() для извлечения значения.

Когда ваша программа запускается, копия среды оболочки создается для вашего процесса. getenv и setenv и модифицировать эту копию. Вы не можете изменить среду оболочки с помощью этих функций.

См. this post.

Смежные вопросы