14.2 Building Modules with Static Probes

Note

This example requires that you link the module against a version of Unbreakable Enterprise Kernel Release 3 (UEK R3) that supports the DTrace modules.

A bug in the current implementation means that a module containing SDT probes must be built from two or more source files.

The following Kbuild and Makefile are used to build the example pseudo driver module revdev.ko and a test program named testrevdev.

Kbuild

bj-m            += revdev.o

revdev-y        := rev_dev.o rev_mod.o

Makefile

KERNEL_DIR = /lib/modules/`uname -r`/build

modules:: testrevdev

install:: modules_install

testrevdev: testrevdev.c
        gcc -o testrevdev testrevdev.c

%::
        $(MAKE) -C $(KERNEL_DIR) M=`pwd` $@

The source file for testrevdev is testrevdev.c.

testrevdev.c

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEVICE_FILE "/dev/revdev"

int main() {
    char buf[81];
    int i, fd, n;

    if ((fd = open(DEVICE_FILE, O_RDWR)) != 0) {
        perror("open");
        exit(1);
    }

    i=0;
    while (1) {
        (i++)%20;
        printf("Write: ");
        scanf(" %80[^\n]", buf);
        n = strlen(buf);
	if (!strncmp(buf, "exit", 4))
            break;
	else if (!strncmp(buf, "ioctl", 5))
            ioctl(fd,128,i);
        else {
            write(fd, buf, n);
            read(fd, buf, n);
            buf[n]='\0';
            printf(" Read: %s\n", buf);
        }
    }

    close(fd);
    exit(0);
}

When run, testrevdev reads a string that you enter, writes the string to the revdev device, and reads the reversed string from the device.

If the input string begins with ioctl, the program calls ioctl on the open file descriptor, which invokes the device's unlocked_ioctl routine. An input string that begins with exit terminates the program.

To build the module and test program, use the make command:

# make
make -C /lib/modules/`uname -r`/build M=`pwd` modules
make[1]: Entering directory `/usr/src/kernels/3.8.13-version.el6uek.x86_64'
  CC [M]  /root/revdev/rev_dev.o
  CC [M]  /root/revdev/rev_mod.o
  SDTSTB  /root/revdev/revdev.sdtstub.S
  AS [M]  /root/revdev/revdev.sdtstub.o
  LD [M]  /root/revdev/revdev.o
  Building modules, stage 2.
  MODPOST 1 modules
  SDTINF  /root/revdev/revdev.sdtinfo.c
  CC      /root/revdev/revdev.mod.o
  CTF
  LD [M]  /root/revdev/revdev.ko
make[1]: Leaving directory `/usr/src/kernels/3.8.13-version.el6uek.x86_64'