Указатель в качестве параметра в Linux коде ядра - PullRequest
0 голосов
/ 19 февраля 2020
Недавно я прочитал код ядра linux, чтобы увидеть, как он выглядит. Я понимаю только основы c указателей.
Итак, я наткнулся на это объявление функции: -
kernel_write(struct file *file, const void *buf, size_t count,loff_t *pos)
Что означает struct file * file ?

Основано на моем понимание, struct file * file означает, что вы передаете указатель, который указывает на блоки памяти, содержащие несколько file структур?

Вот диаграмма для визуализации моего понимания: -

diagram

Является ли мое понимание точным или я действительно ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Существует несколько причин использовать указатель в качестве параметра.

  1. Указатель указывает на массив элементов. Вам нужно знать, сколько элементов, поэтому для указания размера массива должен быть параметр count или size. Параметр buf является массивом, а параметр count указывает, насколько он велик.
  2. Указатель используется, чтобы избежать копирования огромной структуры через стек. Функции получают копию переданного им элемента. Если структура действительно большая, то копирование всей структуры - плохая идея, но передача указателя - гораздо меньшая вещь, поэтому это лучшая идея.
  3. Указатель используется, чтобы позволить функции изменять переданное значение к этому. Функции получают копию переданного им элемента. Таким образом, изменение параметра изменяет только копию, а не оригинал. Если указатель передан, вы не можете изменить, куда указывает указатель, но вы можете изменить то, на что указывает указатель.

В показанном вами конкретном примере я не могу сказать, передают ли они указатель file потому что им нужно изменить содержимое структуры (# 3) или потому что структура действительно большая, и они беспокоятся о том, сколько места в стеке займет копия (# 2). Но это почти наверняка НЕ ​​массив (# 1), потому что нет параметра размера или количества, чтобы сказать, насколько велик массив (это означает, что указатель может указывать только на одну структуру).

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

0 голосов
/ 19 февраля 2020

Нет, это не правильно. В этом контексте этот указатель указывает ровно на один struct file. Продвигать его и пытаться прочитать вторую было бы неопределенным поведением, и это особенно плохо, когда это происходит в ядре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...