Skip to content

Latest commit

 

History

History
33 lines (23 loc) · 1.9 KB

introduction.md

File metadata and controls

33 lines (23 loc) · 1.9 KB

Kernel Module Examples

BSD Kernel Loadable (KLD)

For English, see _introduction.EN.md.

Kernel Loadable Module

Kernel FreeBSD bersifat modular. Modularitas ini membuat sebagian besar fungsionalitas kernel (device driver, filesystem, dsb) dapat dimuat (load) dan dibongkar (unload) saat runtime tanpa perlu membangun ulang ataupun me-restart kernel. Sebuah KLD adalah object code yang berisi implementasi fungsionalitas tersebut.

Setiap KLD mendaftarkan sebuah event_handler, fungsi yang dipanggil oleh kernel saat terjadi event tertentu terhadap module — paling umum adalah MOD_LOAD (module dimuat) dan MOD_UNLOAD (module dibongkar). Informasi module (nama dan event handler) didaftarkan melalui struktur moduledata_t dan macro DECLARE_MODULE().

static int event_handler (struct module * m, int evt_type, void *arg)
{
    switch (evt_type)
    {
        case MOD_LOAD:   /* inisialisasi */   break;
        case MOD_UNLOAD: /* pembersihan */    break;
        default: return EOPNOTSUPP;
    }
    return 0;
}

static moduledata_t kld_data = { "nama_module", event_handler, NULL };
DECLARE_MODULE(nama_module, kld_data, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);

Device Drivers

Seperti Unix pada umumnya, FreeBSD merepresentasikan device sebagai file khusus di /dev, dikelola oleh devfs. Sebuah character device driver mendaftarkan sekumpulan operasi (open, close, read, write, ioctl, dst) melalui struktur struct cdevsw, kemudian membuat device node dengan make_dev() saat module dimuat, dan menghapusnya dengan destroy_dev() saat module dibongkar.

Berbeda dengan Linux yang mengekspos major/minor number secara eksplisit ke userland, FreeBSD modern (5.0+) tidak lagi mengharuskan driver menentukan major/minor secara manual — make_dev() menciptakan node device langsung di /dev dengan nama yang ditentukan, dan kernel mengelola identitas device secara internal.