linuxドライバの作成とテストの簡単な指導


一、まず3つのファイルを作成し、それぞれ
1、以下は簡単なドライバの例で、ファイル名はledです.c
#include 
#include 
#include 
#include 
#include 


static int  led_device_open(struct inode *inode, struct file *file);
static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos);
static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos);

struct file_operations driver_options = {
	.open = led_device_open,
    .read = led_device_read,
    .write = led_device_write
};

static int device_number = 0;

static int  led_device_open(struct inode *inode, struct file *file)
{
	printk("led open
"); return 0; } static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos) { printk("led write
"); return 0; } static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos) { printk("led read
"); return 0; } MODULE_LICENSE("GPL"); static int __init led_init(void) { device_number = register_chrdev(0, "led_drv", &driver_options); if (device_number < 0) { printk("sorry, register char device failed!"); return -1; } printk("led driver initialized!
"); return 0; } static void __exit led_exit(void) { unregister_chrdev(device_number, "led_drv"); printk("led driver exit!
"); } module_init(led_init); module_exit(led_exit);

2、駆動コンパイルファイルMakefile
KERN_DIR=/lib/modules/4.15.0-43-generic/build
all:
		make -C $(KERN_DIR) M=`pwd` modules
clean:
		make -C $(KERN_DIR) M=`pwd` modules clean
		rm -rf modules.order

obj-m += led.o

最初の行は、カーネルソースディレクトリであり、バージョンによって異なります.
例はunbantuのバージョンです.どのバージョンがlinuxでuname-aで表示できるか
3、ドライバテスタ、test_と命名led.c
#include 
#include 
#include 
#include 

int main(void)
{
	int val=1;
	printf("this is led drive test
"); int fd = open("/dev/leddev",O_RDWR); if(fd<0) { printf("can't open led device
"); } write(fd, &val, 4); return 0; }

二、コンパイル及びテスト方法1.このディレクトリはlinuxサーバ2に転送されます.makeコンパイルを実行します.コンパイルが完了するとledが生成されます.koファイル3.実行ko. ドライバ4をインストールする.cat/proc/devices|grep led_drvは、システムが割り当てたデバイス番号snを表示します.(注:「led_drv」はled.cに登録されているデバイス名です)
三、デバイスファイル1を作成し、以下のコマンドを実行し、デバイスファイルを作成する.(注snは、前のステップで調べたデバイス番号であり、整形数字である)mknod leddev c sn 0 2、前のステップで生成したleddevを/devディレクトリにコピーする
四、テスト1.次のコマンドを実行して、テストプログラムgcc-o test_をコンパイルします.led test_led.c  2. 次のコマンドを実行してテストプログラムを実行します./test_led
五、カーネルメッセージの表示とドライバのアンインストール
1.カーネルメッセージdmesgを確認するには、次のコマンドを実行します.
中括弧内はタイムスタンプ、後はledというメッセージが表示されるはずです.cのメッセージ[122,9543.190380]led driver initialized![1229550.950369] led open [1229550.950374] led write
2.rmmod ledを実行し(ここではkoを付けないことに注意)、ledをアンインストールする.ko駆動アンインストールに成功すると、dmesgがカーネルメッセージを表示すると、以下の内容が表示されます[128,368.334598]led driver exit!