ubuntu下的driver编译环境构建以及第一个字符驱动:helloworld

ubuntu下是可以进行一些驱动开发和调试的,编译driver所依赖的kernel header其实Ubuntu也是有提供的。

一、安装kernel header:

1.1获取Ubuntu的内核版本号:

uname -r

我这里的运行结果:

  5.4.0-42-generic

1.2 安装

 那么,直接安装对应的kernel header就可以执行如下命令:

sudo apt install linux-headers-`uname -r`

安装成功后,可以分别在/usr/src和/lib/modules/下找到对应内核版本号的目录:

如我这里就是:

/lib/modules/5.4.0-42-generic

/usr/src/5.4.0-42-generic

 二、makefile

makefile是很重要的一个环节,配置如下:

obj-m += char_hello.o

CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/build

all:
	$(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
	$(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

 三、字符驱动:hello world

#include <linux/init.h>
#include <linux/module.h>

int hello_init(void)
{
    printk("Hello, world\n");
    return 0;
}
void hello_exit(void)
{
    printk("Goodbye, Hello world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("bigcatio");
MODULE_DESCRIPTION("A good start");
MODULE_VERSION("0.0.1");

 执行make命令后,即可在目录下产生char_hello.ko,再执行sudo insmod char_hello.ko即可加载好第一个字符驱动。

sudo insmod char_hello.ko

 

此时,在终端里并不会看到hello world的信息。需要再执行如下命令:

sudo dmesg -c

 结果如下:

 

[ 1326.583627] Hello, world
[ 1326.583673] Hello, world

 

此外还可以执行命令modinfo char_hello.ko来查看ko中的相关信息。

modinfo char_hello.ko

 结果如下:

filename:       /home/bcc/coding_bigcatio/driver_build_under_ubuntu/./char_hello.ko
version:        0.0.1
description:    A good start
author:         bigcatio
license:        GPL
srcversion:     8636B623A76BDC7801FFE25
depends:        
retpoline:      Y
name:           char_hello
vermagic:       5.4.0-53-generic SMP mod_unload 

 

posted @ 2020-11-22 21:48  稀里糊涂的胡闹  阅读(479)  评论(0)    收藏  举报