2015-08-10 9 views
1

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

ответ

2

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

Другая причина, по которой вы недостижима: создание файла proc с именем, которое соответствует уже существующему файлу, не удастся.

Update (как вопрос стал более конкретным)

Ядро не проверяет адреса, передаваемые ему из модулей. Он просто использует эти адреса, например, функцию звонков.

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

+0

Вы можете сделать это, но придать ему другое имя или суффикс, например mod_0, mod_1 и т. Д., Но тогда я думаю, этого достаточно, чтобы ядро ​​отличало конкретный модуль, создавший файл proc. – omer

+0

Я могу задать несколько другой вопрос: при вызове _italic_create_proc_read_entry() вы должны предоставить функцию, которая будет вызываться при чтении файла proc. ядро просто регистрирует эту функцию как функцию чтения для этого файла, независимо от того, в каком модуле он находится, и загружен ли этот модуль (игнорируйте тот факт, что если модуль выгружен, запись proc должна быть удалена)? – omer

+1

О, вы лучше отредактируете свой текущий вопрос, чтобы сообщить об этом. Но ответ прост: ядро ​​не проверяет, какой модуль определяет переданную ему функцию. Все модули и ядро ​​ядра расположены с одинаковым адресным пространством и могут делать что угодно. – Tsyvarev