Create Kernel Driver

From bibbleWiki
Jump to navigation Jump to search

Introduction

This seems like a way to create a VM for kernel development so thought I might take some notes

Setup Multipass

Install

snap install multipass

Create box

multipass shell

Edit /etc/ssh/sshd_config and change

KbdInteractiveAuthentication yes

Reload daemon

sudo systemctl daemon-reload

restart daemon

sudo systemctl restart ssh.service

set passwd

sudo passwd ubuntu

get IP (never knew this)

hostname -I

Setup VS Code

Go to extensions and in remote development extension. Connect via ssh

Restart Multipass

List what we have

multipass list

For this we just type

multipass shell

Install Software for Driver Development

To do this

sudo apt update
sudo apt upgrade
sudo apt install build-essential linux-headers-$(uname -r) kmod

Making Driver

Linux treats everything like a file and lets you do the following

  • Open
  • Close
  • Read
  • Write
  • Seek

You can create a

  • Char Device e.g. uart
  • Block Device e.g. fs, drive
  • Network Device e.g. nic

How it works

User space, talks to kernel space, using system calls. The device drivers implement, two types of systems calls, one type file operations, the other hardware management or ioctl.

Basic Module

Here is the basic set up

// Write kernel module for pyjama
#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("bibble");
MODULE_DESCRIPTION("Our first module");

static int pyjama_module_init(void) {
  printk("Helllo world\n");
  return 0;
}

static void pyjama_module_exit(void) {
  printk("Bye world\n");
}

module_init(pyjama_module_init) module_exit(pyjama_module_exit)

Proc Filesystem

We now need to make an entry in /proc using the api in proc_fs.h. This involves

  • create a proc_ops entry
  • calling proc_create with proc_ops entry