lseek - системный вызов. И это конкретное ядро. Вы должны реализовать эту функцию для своего устройства и добавить в структуру «file_operations» драйвера устройства в вызове llseek.
В структуре file_operation все связанные с устройством функции будут сопоставлены с соответствующими системными вызовами. Подобно чтению, записи, открытию все будет связано с конкретным кодом драйвера устройства. Поэтому всякий раз, когда вы вызываете эти функции, ядро запускает код драйвера устройства, связанный с вызовом. Если драйвер устройства никогда не выполняет вызов, соответствующее значение будет указано как NULL. В этом случае, если вы вызываете указанный NULL вызов, вызов будет всегда терпеть неудачу.
Но в lseek, если ссылка структуры 'file_operations' равна NULL, ядро будет работать с указателем структуры файла в позицию файла. Это может привести к непредсказуемым результатам. Но в любом случае вызов будет работать (согласно драйверам устройств Linux из публикации o'relley).
Так что я не уверен, что представляет собой настоящую проблему. Поэтому, если вы еще не реализовали вызов lseek, выполните его и попробуйте еще раз.
Да, так оно и есть. Что вы пробовали? –
@BasileStarynkevitch Итак, что мне делать, чтобы заставить драйвер устройства поддерживать lseek? – yangsuli
Я не эксперт в области ядра. Вы читали http://www.makelinux.net/ldd3/chp-16-sect-2 –