0%

基于WSL开发内核模块

WSL内核更换为自定义版本(解决微软安装的内核版本源码找不到的问题)

  • 编译自定义内核参考连接
  • 替换自定义内核参考
  • 效果
    • 图 1
    • 注意,config-wsl文件中的CONFIG_LOCALVERSION="-microsoft-wsl"可以修改

      模块的安装和卸载

  • 安装:sudo insmod <模块文件名>
  • 卸载:rmmod <模块文件名>
  • 查看模块信息 modinfo <模块文件名>
  • 参考链接
  • 打开系统日志可见效果;
  • 图 2

    在/proc下创建文件并且通过读写该文件实现与内核的交互

  • 参考链接
  • 参考链接
  • 参考连接
  • 上述参考链接由一些错误之处,比如需要include #include <linux/uaccess.h>
    • proc_ops的结构体ing不是file_operations,而是自己的结构
      struct proc_ops procOps = 
      {
      .proc_open = demo_open,
      .proc_write = demo_set,
      // .read = seq_read,

      };
  • create_proc_entry函数往往找不到需要替换成proc_create函数
  • single_open实际上是simple_open等等
  • 需要自己通过查看相应的头文件进行修正

    添加内核服务器并连接

  • 参考链接
  • 参考链接
  • 基本方法与创建Socket类似,用户需要自己定义一个内核端口号用于跟用户程序通信,用户程序只要跟相同端口号通信即可。

内核线程的创建

  • 参考链接
  • 主要是
    struct task_struct *kthread_create(int (*threadfn)(void *data),
    void *data,
    const char namefmt[], ...);
  • int wake_up_process(struct task_struct *tsk);
  • 两个函数
  • 因为使用kthread_create创建线程之后并不会立即开始执行,需要通过wake_up_process函数使其开始执行才可以。

内核互斥锁等

  • 参考链接
    #include <linux/mutex.h>
  • 加锁
    void mutex_lock(struct mutex *lock);
  • 解锁
    void mutex_unlock(struct mutex *lock);

    内核动态内存分配

  • 参考链接
    static __always_inline void *kmalloc(size_t size, gfp_t flags)

    内核延时

  • 参考链接

源码地址