學驅動從模組開始

2021-06-02 04:37:50 字數 3106 閱讀 6271

通用的makefile模板

ifeq ($(kernelrelease),)

#kerneldir ?= /home/lht/kernel2.6/linux-2.6.14

kerneldir ?= /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

modules:

$(make) -c $(kerneldir) m=$(pwd) modules

modules_install:

$(make) -c $(kerneldir) m=$(pwd) modules_install

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.phony: modules modules_install clean

else

obj-m := hello.o

endif

一、簡單的模組

#include #include module_license ("gpl");

int init_module (void)

void cleanup_module (void)

static void __exit hello_2_exit (void)

module_init (hello_2_init);

mo

三、引數的學習

#define driver_author "foobar"

#define driver_desc "a sample driver"

module_license ("gpl");

module_author (driver_author);

module_description (driver_desc);

module_supported_device ("testdevice");

static short int myshort = 1;

static int myint = 420;

static long int mylong = 9999;

static char *mystring = "blah";

static int array[2]= ;

static int arr_argc = 0;

module_param (myshort, short, 0000);

module_parm_desc (myshort, "a short integer");

module_param (myint, int, 0000);

module_parm_desc (myint, "an integer");

module_param (mylong, long, 0000);

module_parm_desc (mylong, "a long integer");

module_param (mystring, charp, 0000);

module_parm_desc (mystring, "a character string");

module_param_array (array, int, &arr_argc, 0000);

//module_param_array (array, int, arr_argc, 0000); //for kernel<2.6.10

module_parm_desc (array, "an array of integers");

static int __init hello_2_init (void)

static void hello_create_proc (void)

五、ioctl
#include #include #include #include #include #include #include #include "hello.h"

module_license ("gpl");

int hello_major = 250;

int hello_minor = 0;

int number_of_devices = 1;

char data[128]="\0";

struct cdev cdev;

dev_t dev = 0;

static int hello_open (struct inode *inode, struct file *file)

static int hello_release (struct inode *inode, struct file *file)

int hello_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)

return ret;

}struct file_operations hello_fops = ;

static void char_reg_setup_cdev (void)

static int __init hello_2_init (void)

char_reg_setup_cdev ();

printk (kern_info "hello_ioctl driver done\n");

return 0;

}static void __exit hello_2_exit (void)

module_init (hello_2_init);

module_exit (hello_2_exit);

測試程式:

int main (void) 

printf ("\n/dev/hello opened, fd=%d\n",fd);

ioctl (fd, hello_one);

ioctl (fd, hello_two);

close (fd);

printf ("/dev/hello closed :)\n");

return 0;

}

從0開始學spark

參考 local 模式 即單機模式,這種安裝加壓即可,具體安裝方法穿插在 standalone 模式 standalone 模式 即搭建 spark 集群,但不與其他框架整合,如 yarn,此時 spark 執行在集群中 基於 yarn 的 spark 集群部署 yarn 集群 spark 集群,此...

學linux,從Ubuntu開始

1.安裝過程出現0x00000000指令引用的0x00000000記憶體該記憶體不能為written 如果你安裝的是inux系統 需要 在設定 系統 處理器 啟用pae支援 我的就是這麼解決的。ubuntu常見命令 路徑相關命令 cd change directory 更改目錄。pwd print ...

從0開始學架構 推薦

程式設計師的成長繞不開架構設計,有時架構設計就像鴻溝一樣擋在程式設計師晉公升之路上,只要跨過去就可以海闊天空。但不少技術能力很強的程式設計師依然不能完全掌握架構設計,這與架構設計的思維方式和訓練機制與寫 有很大差異有關,加之人們對架構設計存在很多誤區,缺乏一套行之有效的架構設計方 就可能導致在實踐過...