MST
星途 面试题库

面试题:C语言函数指针与回调机制在操作系统内核模块中的应用

在一个简单的操作系统内核模拟场景中,有不同类型的设备驱动模块,每个驱动模块都有自己的初始化、读、写等操作函数。内核需要通过函数指针和回调机制来调用这些设备驱动的相应函数。请你设计一个C语言的框架,展示如何在内核中管理这些设备驱动的函数指针,并实现通过回调机制调用不同设备驱动的特定操作,同时要考虑到模块的动态加载与卸载等复杂情况。
17.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义设备驱动操作函数指针类型
typedef void (*init_func_t)();
typedef int (*read_func_t)(void *buf, int len);
typedef int (*write_func_t)(const void *buf, int len);

// 定义设备驱动结构体
typedef struct {
    const char *name;
    init_func_t init;
    read_func_t read;
    write_func_t write;
} device_driver_t;

// 全局变量,用于存储已加载的设备驱动
device_driver_t *loaded_drivers[100];
int driver_count = 0;

// 加载设备驱动模块
int load_driver(const char *name, init_func_t init, read_func_t read, write_func_t write) {
    if (driver_count >= 100) {
        printf("无法加载更多驱动,已达上限\n");
        return -1;
    }
    loaded_drivers[driver_count] = (device_driver_t *)malloc(sizeof(device_driver_t));
    if (!loaded_drivers[driver_count]) {
        printf("内存分配失败\n");
        return -1;
    }
    loaded_drivers[driver_count]->name = strdup(name);
    loaded_drivers[driver_count]->init = init;
    loaded_drivers[driver_count]->read = read;
    loaded_drivers[driver_count]->write = write;
    driver_count++;
    return 0;
}

// 卸载设备驱动模块
int unload_driver(const char *name) {
    for (int i = 0; i < driver_count; i++) {
        if (strcmp(loaded_drivers[i]->name, name) == 0) {
            free((void *)loaded_drivers[i]->name);
            free(loaded_drivers[i]);
            for (int j = i; j < driver_count - 1; j++) {
                loaded_drivers[j] = loaded_drivers[j + 1];
            }
            driver_count--;
            return 0;
        }
    }
    printf("未找到名为 %s 的驱动\n", name);
    return -1;
}

// 调用设备驱动的初始化函数
void call_init(const char *name) {
    for (int i = 0; i < driver_count; i++) {
        if (strcmp(loaded_drivers[i]->name, name) == 0) {
            if (loaded_drivers[i]->init) {
                loaded_drivers[i]->init();
            }
            return;
        }
    }
    printf("未找到名为 %s 的驱动\n", name);
}

// 调用设备驱动的读函数
int call_read(const char *name, void *buf, int len) {
    for (int i = 0; i < driver_count; i++) {
        if (strcmp(loaded_drivers[i]->name, name) == 0) {
            if (loaded_drivers[i]->read) {
                return loaded_drivers[i]->read(buf, len);
            }
            return -1;
        }
    }
    printf("未找到名为 %s 的驱动\n", name);
    return -1;
}

// 调用设备驱动的写函数
int call_write(const char *name, const void *buf, int len) {
    for (int i = 0; i < driver_count; i++) {
        if (strcmp(loaded_drivers[i]->name, name) == 0) {
            if (loaded_drivers[i]->write) {
                return loaded_drivers[i]->write(buf, len);
            }
            return -1;
        }
    }
    printf("未找到名为 %s 的驱动\n", name);
    return -1;
}

// 示例设备驱动1的操作函数
void driver1_init() {
    printf("驱动1初始化\n");
}
int driver1_read(void *buf, int len) {
    printf("驱动1读操作\n");
    return 0;
}
int driver1_write(const void *buf, int len) {
    printf("驱动1写操作\n");
    return 0;
}

// 示例设备驱动2的操作函数
void driver2_init() {
    printf("驱动2初始化\n");
}
int driver2_read(void *buf, int len) {
    printf("驱动2读操作\n");
    return 0;
}
int driver2_write(const void *buf, int len) {
    printf("驱动2写操作\n");
    return 0;
}

int main() {
    // 加载驱动1
    load_driver("driver1", driver1_init, driver1_read, driver1_write);
    // 加载驱动2
    load_driver("driver2", driver2_init, driver2_read, driver2_write);

    // 调用驱动1的初始化函数
    call_init("driver1");
    // 调用驱动2的读函数
    call_read("driver2", NULL, 0);

    // 卸载驱动1
    unload_driver("driver1");

    return 0;
}
  1. 函数指针类型定义:定义了 init_func_tread_func_twrite_func_t 分别表示设备驱动的初始化、读、写操作函数指针类型。
  2. 设备驱动结构体device_driver_t 结构体用于存储设备驱动的名称以及对应的操作函数指针。
  3. 全局变量loaded_drivers 数组用于存储已加载的设备驱动,driver_count 记录已加载驱动的数量。
  4. 加载与卸载函数
    • load_driver 函数负责将新的设备驱动加载到系统中,分配内存并存储相关信息。
    • unload_driver 函数用于卸载指定名称的设备驱动,释放相关内存并调整数组。
  5. 回调调用函数
    • call_initcall_readcall_write 函数根据设备驱动名称调用相应的初始化、读、写操作函数。
  6. 示例驱动函数:定义了 driver1_initdriver1_readdriver1_writedriver2_initdriver2_readdriver2_write 作为示例设备驱动的操作函数。
  7. 主函数:在 main 函数中演示了加载、调用和卸载设备驱动的过程。