Как использовать Readlink

Как использовать Readlink для получения значений.

1 ответ

Ответ:

Не делай этого

По крайней мере, не так, как вы предлагаете.

Вы указали решение здесь без указания того, что вы действительно хотите сделать [и почему?]. То есть каковы ваши потребности / требования? Предполагая, что вы получите это, что вы хотите сделать с именем файла? Вы опубликовали голый фрагмент своего пользовательского приложения, но не опубликовали ни одного кода своего ядра.

Как давний программист ядра, я могу сказать вам, что это не будет работать, не может работать, и это ужасный взлом. Существует огромное различие в методах, используемых внутри ядра и в пространстве пользователя.

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

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

Вы можете получить эквивалентные данные, но это немного сложнее, чем это. Если вы перехватываете read системный вызов внутри ядра, у вас [уже] есть доступ к current структура задачи и fd номер, используемый в звонке. Исходя из этого, вы можете найти структуру для данного открытого файла и получить все, что хотите, напрямую, без участия /proc совсем. Используйте это как отправную точку.

Обратите внимание, что для этого потребуется прочитать документацию ядра, источники драйверов файловой системы, системные вызовы и т. Д. Как заблокировать структуры данных и списки с помощью различных методов блокировки (например, RCU, блокировки rw, спин-блокировки). Кроме того, переменные для каждого процессора. Преимущества потоков ядра. Как правильно обходить необходимые списки и структуры, связанные с файловой системой, для получения необходимой информации. Все это, не вызывая блокировок, паники, ошибок по умолчанию, взаимоблокировок, UB на основе устаревших или противоречивых / динамически изменяющихся данных.

Вам нужно изучить все это, чтобы ознакомиться с тем, как ядро ​​работает, и понять это, прежде чем пытаться делать что-то подобное. Если бы вы имели, вы бы прочитали исходный код /proc водителей и уже известно, почему вещи не срабатывают.

В качестве предложения, забудьте все, что вы узнали о том, как работает приложение в пользовательском пространстве. Это не будет применяться здесь. Внутренне ядро ​​организовано совершенно иначе, чем то, к чему вы привыкли.

Вам не нужно использовать readlink внутри ядра в этом случае. Это то, как приложение пользовательского пространства должно было бы делать это, но в ядре это все равно, что проехать 100 миль, чтобы получить данные, которые у вас уже есть, и, как я упоминал ранее, даже не будет работать.

Другие вопросы по тегам