第六章 字元裝置

2021-08-20 07:53:22 字數 3027 閱讀 4833

記錄一下 建立乙個簡單的字元裝置的編碼過程

前提準備:已經編譯好的linux核心

進入../drivers/char/目錄

這裡存放著這字元裝置驅動

mkdir globalmem 建立乙個我們新建驅動的目錄並進入

新建globalmem.c檔案,清單如下

#include #include #include #include #include #include #define globalmem_size 0x1000

#define mem_clear 0x1

#define globalmem_major 230

static int globalmem_major=globalmem_major;

module_param(globalmem_major,int,s_irugo);

struct globalmem_dev

;struct globalmem_dev *globalmem_devp;

static int globalmem_open(struct inode *inode,struct file *filep)

static int globalmem_release(struct inode *inode,struct file *filep)

static long globalmem_ioctl(struct file *filep,unsigned int cmd,unsigned long arg)

return 0;

}static ssize_t globalmem_read(struct file *filep,char __user * buf,size_t size,loff_t * ppos)

if(count>globalmem_size-p)

if(copy_to_user(buf,dev->mem+p,count))

else

return ret;

}static ssize_t globalmem_write(struct file *filp, const char __user * buf,size_t size, loff_t * ppos)

return ret;

}static loff_t globalmem_llseek(struct file *filp, loff_t offset, int orig)

if ((unsigned int)offset > globalmem_size)

filp->f_pos = (unsigned int)offset;

ret = filp->f_pos;

break;

case 1:

if ((filp->f_pos + offset) > globalmem_size)

if ((filp->f_pos + offset) < 0)

filp->f_pos += offset;

ret = filp->f_pos;

break;

default:

ret = -einval;

break;

}return ret;

}static const struct file_operations globalmem_fops = ;

static void globalmem_setup_cdev(struct globalmem_dev *dev,int index)

static int __init globalmem_init(void)

if(ret<0)

return ret;

globalmem_devp = kzalloc(sizeof(struct globalmem_dev),gfp_kernel);

if(!globalmem_devp)

globalmem_setup_cdev(globalmem_devp,0);

return 0;

fail_malloc:

unregister_chrdev_region(devno,1);

return ret;

}module_init(globalmem_init);

static void __exit globalmem_exit(void)

module_exit(globalmem_exit);

module_author("ztt");

module_license("gpl v2");

新建makefile檔案,清單如下:

config_module_sig=n

kvers = $(shell uname -r)

# kernel modules

obj-m += globalmem.o

build: kernel_modules

kernel_modules:

make -c /lib/modules/$(kvers)/build m=$(curdir) modules

clean:

make -c /lib/modules/$(kvers)/build m=$(curdir) clean

然後在建立的目錄下執行命令 make  

編譯驅動,會在該目錄下生成globalmem.ko檔案

載入該模組 insmod globalmem.ko

執行 cat /proc/devices

可以看到新定義的字元裝置驅動,主裝置號為230

執行命令:mknod  /dev/globalmem c 230 0 

建立「/dev/globalmem」裝置節點

通過執行:

echo "hello world" > /dev/globalmem               驗證裝置的寫

cat  /dev/globalmem                                           驗證裝置的讀#輸出hello world

進入/sys/module/可以找到globalmem目錄 使用tree命令 可觀察其目錄結構

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...

第六章總結

6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...