Я считаю, что это концептуально ошибочный подход, если только я не пойму неправильно, о чем вы говорите.
Если я вас правильно понимаю, вы хотите взять один и тот же файл и скомпилировать его дважды: один раз как модуль и один раз как пользовательскую программу. Затем вы хотите запустить их обоих, чтобы они могли совместно использовать память.
Таким образом, очевидная проблема заключается в том, что, хотя программы исходят из одного и того же исходного кода, они все равно существуют как отдельные исполняемые файлы. Модуль не будет его собственным процессом: он будет вызываться только тогда, когда ядро запускается (то есть системные вызовы). Так что само по себе это не позволяет избежать системного вызова ерунды.
Лучшее решение зависит от вашей цели: вы просто хотите получить доступ к структурам данных ядра, потому что вам нужно что-то, чего вы обычно не можете получить? Или вы беспокоитесь о производительности и хотите получить доступ к этим структурам быстрее, чем системный вызов?
Для (1) вы можете создать символьное устройство или файл procfs. Обе они позволяют вашим программам пользовательского пространства проникнуть в ядро грязными мизинцами.
Для (2) вы находитесь в трудном положении, и проблема становится намного более неприятной (и более интересной). Чтобы решить проблему скорости, многое зависит от того, какие именно данные вы пытаетесь извлечь.
Помогает ли это?