Прототипы статических функций в модулях ядра - PullRequest
2 голосов
/ 10 октября 2019

Я читаю LKM руководство по разработке и столкнулся со следующим примером, когда пишу драйвер устройства :

/*  
 *  Prototypes - this would normally go in a .h file
 */
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

То, что меня смутило, это то, что он предлагаетпоместите static non - inline объявлений в заголовочный файл. В чем причина этого?

Если мы не должны использовать эти функции, связанные с драйвером, где угодно, кроме как в

struct file_operations fops = {
    .open = device_open,
    .release = device_release,
    .read = device_read,
    .write = device_write
};

static int init_module(void){
    int register_result = register_chrdev(&fops);
    //...
}

во время инициализации модуля, тогда мы можем просто поместить их статические определенияпрямо здесь, избегая объявления прототипов. В противном случае они должны (должны?) Быть объявлены с внешней связью.

1 Ответ

2 голосов
/ 10 октября 2019

Абсолютно нет необходимости помещать static non- inline объявления в отдельный файл заголовка.

В случае очень сложных определений драйверов device_* методы могут быть расположены в разных исходных файлах(и определение структуры file_operations может быть также размещено в его собственном исходном файле), но в этом случае спецификатор static должен быть удален.

...