Выделение определенного адреса в Linux - PullRequest
1 голос
/ 06 апреля 2011

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

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

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

См. Справочную страницу mmap: http://linux.die.net/man/3/mmap

0 голосов
/ 07 апреля 2011

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

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

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

См. этот пост .

...