Файл как в KLM, так и в пользовательском пространстве - PullRequest
1 голос
/ 01 апреля 2012

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

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

Может кто-нибудь дать мне более подробную информацию об этом подходе.Я не мог найти что-либо в Google по этому поводу.

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

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

Если я вас правильно понимаю, вы хотите взять один и тот же файл и скомпилировать его дважды: один раз как модуль и один раз как пользовательскую программу. Затем вы хотите запустить их обоих, чтобы они могли совместно использовать память.

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

Лучшее решение зависит от вашей цели: вы просто хотите получить доступ к структурам данных ядра, потому что вам нужно что-то, чего вы обычно не можете получить? Или вы беспокоитесь о производительности и хотите получить доступ к этим структурам быстрее, чем системный вызов?

Для (1) вы можете создать символьное устройство или файл procfs. Обе они позволяют вашим программам пользовательского пространства проникнуть в ядро ​​грязными мизинцами.

Для (2) вы находитесь в трудном положении, и проблема становится намного более неприятной (и более интересной). Чтобы решить проблему скорости, многое зависит от того, какие именно данные вы пытаетесь извлечь.

Помогает ли это?

0 голосов
/ 01 апреля 2012

Есть два способа сделать это, наиболее распространенным является то, что называется символьным устройством, а другой - блочным устройством (то есть чем-то «дискообразным»).

Вот руководство о том, как создавать драйверы, которые регистрируют chardevs.

...