do_mmap_pgoff для других процессов - PullRequest
3 голосов
/ 11 ноября 2011

В системном вызове ядра Linux я хочу отобразить область памяти аналогично вызову mmap из пользовательского режима.Если бы я хотел отобразить регион для текущего процесса, я мог бы просто использовать do_mmap_pgoff.Однако вместо этого я хочу отобразить регион в другом процессе, работая в режиме ядра.do_mmap_pgoff предполагает / знает, что это отображение для текущего процесса и не допускает ничего другого.

Я планирую выполнить репликацию do_mmap_pgoff для получения дополнительных аргументов, указывающих task_struct и mm_struct любого процесса, который я хочуна карту.Тем не менее, это очень нежелательно, так как я должен вручную пройти через многие функции в исходном коде ядра и по сути сделать дубликаты этих функций, чтобы они больше не предполагали, что выполняют работу от имени current.

Есть лилучший способ отобразить память в процессе, отличном от current при работе в режиме ядра?

1 Ответ

1 голос
/ 11 ноября 2011

Не удивительно, что эти функции в исходном коде ядра предполагают, что они изменяют отображение текущего процесса, и что он не изменился за 20 лет существования Linux.Есть причина, почему процессы не изменяют отображения памяти других процессов.

Это очень "не UNIXY".

Если вы уточните, что вы пытаетесь достичь, то, возможно, люди могут предложить более UNIX-й способ для этого.

В любом случае, чтобы сосредоточиться на данном вопросе, если вы неЯ не хочу выполнять большие изменения в коде mm / *, поэтому я предлагаю вам применить обходной путь:

  1. Найдите контекст, в котором вы можете заставить свой код ядра работать в контексте целевого процесса.Например, по модульному принципу - файл /sys или /proc.Или немодульным способом: измените системный вызов, который вызывается часто, или другой путь кода - например, код обработки сигнала.
  2. Реализация «RPC», исходный процесс может поставить в очередь запроспри изменении отображения в Затем он может находиться в спящем режиме до тех пор, пока целевой процесс не войдет в этот контекст и не выполнит запрос, пробуждая исходный процесс, когда он завершит изменение своего собственного отображения.Фактически это эмуляция «удаленного» вызова на do_mmap_pgoff(), и она может быть реализована с использованием механизмов, представленных в linux / wait.h.
...