user567879
user567879

Reputation: 5349

Using structures to set the functions

While writing kernel modules/drivers, most of the time some structures are initialized to point to some specific functions. As a beginner in this could someone explain the importance of this.

I saw the struct file_operations while writing the character device driver

Also I found that eventhough the functions are declared they are not implemented always. Could anyone help on that too. For example, in the kernel source: kernel/dma.c, eventhough

static const struct file_operations proc_dma_operations = {
    .open       = proc_dma_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};

are defined, only proc_dma_open is implemented.

Upvotes: 0

Views: 380

Answers (3)

The functions seq_read, seq_lseek and single_release are declared in the kernel source file linux-3.1.6/include/linux/seq_file.h and defined in the kernel source file linux-3.1.6/fs/seq_file.c. They are probably common to many file operations.

Upvotes: 1

Francois
Francois

Reputation: 330

Pointers to functions are a very powerful tool in the C language that allows for real-time redirect of function calls. Most if not all operating systems have a similar mechanism, like for example the infamous INT 21 functions 25/35 in the old MS-DOS that allowed TSR programs to exist.

In C, you can assign the pointer to a function to a variable and then call that function through that variable. The function can be changed either at init time based on some parameters or at runtime based on some behavior.

Here is an example:

int fn(int a)
{
   ...
   return a;
}

...

int (*dynamic_fn)(int);
...
dynanic_fn = &fn;
...
int i = dynamic_fn(0);

When the pointer "lives" in a structure that can be passed to system calls, this is a very powerful feature that allows hooks into system functions.

In object oriented languages, the same kind of behavior can be achieved by using reflection to instantiate classes dynamically.

Upvotes: 0

Nikolai Fetissov
Nikolai Fetissov

Reputation: 84239

If you ever played with object-oriented languages like C++, think of file_operations as a base class, and your functions as being implementations of its virtual methods.

Upvotes: 1

Related Questions