LINUX.ORG.RU

mmap в разных процессах


0

0

В 1-ом процессе:

fdd = open("/dev/...", O_RDWR) // OK
reg = (unsigned int *) mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_SHARED, fdd, 0);  // OK
Далее передаю reg в другой процесс и там хочю его замапить:
reg1 = (unsigned int *) mmap(reg, PAGE_SIZE, PROT_READ | PROT_WRITE | MAP_ANONYMOUS, MAP_SHARED, 0, 0); - ОШИБКА (-1)

Что не так ?
anonymous

Ответ на: комментарий от dilmah

> а с чего ты взял что reg что-либо значит в другом процессе?

Я передал значение reg (написал reg во 2-ом, чтоб подчеркнуть, что значеня одинаковы). И использую его, как стартовый адрес для mmap. Т.е. хочю, чтоб кусок памяти с адреса reg был замаплен для 2-х процессов.

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

Кроме того, никто тебе не обещает, что даже с MAP_FIXED память замапится.

mv ★★★★★
()

Не знаю, что должно получиться из этой программы, но MAP_ANONYMOUS вроде был флаго, его нужно писать вместе с MAP_SHARED, и в этом случае системе не нужен файловый дискриптор, хотя его советуют делать не "0", а "-1" для лучшей совместимости.

mky ★★★★★
()

Так-же может случится, что указанный адрес (диапазон) во втором процессе уже используется, и туда замапить ты ничего не сможешь. Вопрос: зачем тебе совпадение адресов в контексте нескольких процессов?

fmjs
()
Ответ на: комментарий от anonymous

> Я передал значение reg (написал reg во 2-ом, чтоб подчеркнуть, что значеня одинаковы). И использую его, как стартовый адрес для mmap. Т.е. хочю, чтоб кусок памяти с адреса reg был замаплен для 2-х процессов.

т.е. ты передаешь reg из одного процесса в другой, и таким образом надеетесь, что во втором процессе получите доступ к тому, что лежит в первом, по адресу reg?

Почитайте для начала какой-нибудь учебник аля "системное программирование для чайников", в частности про адресные пространства процессов, и организацию виртуальной памяти в UNIX-ах.

fmjs
()

А прально ли будет сделатьтак: создаю шаред мем, маплю туда 1-ым процессом устройство (т.е. первым аргументом в mmap(sh_mem, ...) задаю нач. адрес шаред мем) и потом юзаю эту область несколькими процессами ???

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

>А прально ли будет сделатьтак: создаю шаред мем, маплю туда 1-ым процессом устройство (т.е. первым аргументом в mmap(sh_mem, ...) задаю нач. адрес шаред мем) и потом юзаю эту область несколькими процессами ???

Адрес вам mmap и так вернет, вам необязательно его вообще задавать фиксированным. И что вам мешает сделать mmap в разных процессах - в каждом по разу? Зачем вам из разных процессов использовать адресные пр-ва других процессов?

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

> Адрес вам mmap и так вернет, вам необязательно его вообще задавать фиксированным

Но, если задам, ничего ж страшного, тем более шареный.

> И что вам мешает сделать mmap в разных процессах

Не хотелось бы устройство открывать несколько раз...

> Зачем вам из разных процессов использовать адресные пр-ва других процессов?

А что здесь крименального ?

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

>Но, если задам, ничего ж страшного

Если только по этому адресу ничего случайно не окажется.

>тем более шареный.

Что значит "шареный"? Адресные пространства процессов независимы. И ни один адрес одного не имеет никакого значения для другого процесса. Даже для одной и той же программы в памяти процесса библиотеки могут по разным адресам расположиться при двух последовательных запусках.

>Не хотелось бы устройство открывать несколько раз...

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

Вы можете передать дескриптор открытого файла в другой процесс в стиле передачи mach port rights (man cmsg), или через fork.

Вы можете получить тот же кусок памяти в другом процессе для этой же программы через fork.

В конце-концов можно из одного процесса читать память другого процесса (man ptrace, man 5 proc / mem), но в обычных условиях это не рекомендуется, поскольку очень медленно и непереносимо.

>А что здесь крименального ?

Основная идея разделения на процессы в ОС - изоляция.

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

P.S. Насчет копирования подобных vma через fork не уверен, а уточнять лень, так что проверяйте. :)

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

> Вы можете передать дескриптор открытого файла в другой процесс в стиле передачи mach port rights (man cmsg), или через fork.

Если бы это был mach, то все было-бы проще простого, vm_read - и вот у нас память удаленного процесса ;)

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

>Если бы это был mach, то все было-бы проще простого, vm_read - и вот у нас память удаленного процесса ;)

Угу. Только handle(порт) все равно нужно достать где-нибудь. В Linux это тоже будет один вызов pread после открытия /proc/pid/mem. А в Win - ReadProcessMemory. Но читать так память, отображенную драйвером - очень странная идея. Я бы даже сказал злой хак. :)

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

> Угу. Только handle(порт) все равно нужно достать где-нибудь. В Linux это тоже будет один вызов pread после открытия /proc/pid/mem. А в Win - ReadProcessMemory. Но читать так память, отображенную драйвером - очень странная идея. Я бы даже сказал злой хак. :)

не помню названия, есть у mach-а и функция вроде "смапь мне вон тот участок вон того процесса", ей аналога на винде/линухе вроде нема ;)

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