struct mutex lock;//定義互斥鎖
mutex_init
(mutex)
/*
* 功能:阻塞式上互斥鎖,搶不到就一直阻塞
*/mutex_lock(struct mutex *lock)
/*
* 功能:非阻塞式上互斥鎖,搶不到也會返回往下走
* 返回值;成功搶到鎖:1 沒搶到鎖:0
*/int mutex_trylock(struct mutex *lock);
/*
* 功能:阻塞,可被中斷
*/ mutex_lock_interruptible(lock)
void mutex_unlock(struct mutex *lock);
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct class *cls = null;
#include "mycmd.h"
static int major = 0;
static int minor = 0;
const int count = 6;
#define devname "demo"
static struct cdev *demop = null;
#define kmax 1024
static int counter = 0;
static char kbuf[kmax];
static atomic_t tv;
static struct mutex lock;//定義互斥鎖
//開啟裝置
static int demo_open(struct inode *inode, struct file *filp)
memset(kbuf, 0, kmax);
counter = 0;
return0;}
//關閉裝置
static int demo_release(struct inode *inode, struct file *filp)
//讀裝置
//ssize_t read(int fd, void *buf, size_t count)
static ssize_t demo_read(struct file *filp, char __user *buf, size_t size, loff_t *offset)
if(counter < size)
if(copy_to_user(buf, kbuf, size))
mutex_unlock(&lock);//解開互斥鎖
return size;
}//寫裝置
static ssize_t demo_write(struct file *filp, const char __user *buf, size_t size, loff_t *offset)
ssleep(30);
if(size > kmax)
if(copy_from_user(kbuf, buf, size))
counter = size;
mutex_unlock(&lock);//解開互斥鎖
return counter;}/*
* read/write param
* read status
* contrl device
*/static long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
, };
struct karg *usrarg;
switch(cmd)
usrarg = (struct karg *)arg;
if(copy_to_user(usrarg, &karg, sizeof(karg)))
printk(kern_info "cmdr: %s : %s : %d ---done.\n", __file__, __func__, __line__);
break;
case cmdw:
printk(kern_info "cmdw: %s : %s : %d\n", __file__, __func__, __line__);
if(_ioc_size(cmd) != sizeof(karg))
usrarg = (struct karg *)arg;
if(copy_from_user(&karg, usrarg, sizeof(karg)))
printk(kern_info "cmdw: %d : %s\n", karg.kval, karg.kbuf);
break;
default:;};
return0;}
static struct file_operations fops = ;
static int __init demo_init(void)
//2. init cdev obj
cdev_init(demop, &fops);
ret = alloc_chrdev_region(&devnum, minor, count, devname);
if(ret)
major = major(devnum);
//3. register cdev obj
ret = cdev_add(demop, devnum, count);
if(ret)
cls = class_create(this_module, devname);
if(is_err(cls))
for(i = minor; i < (count+minor); i++)
}// init atomic_t
atomic_set(&tv, 1); //初始化原子變數
// init mutex
mutex_init(&lock); //初始化互斥鎖
//get command and pid
printk(kern_info "(%s:pid=%d), %s : %s : %d - ok.\n",
current->comm, current->pid, __file__, __func__, __line__);
return
0;err_step2:
for(--i; i >= minor; i--)
class_destroy(cls);
err_step1:
unregister_chrdev_region(devnum, count);
err_step:
cdev_del(demop);
//get command and pid
printk(kern_info "(%s:pid=%d), %s : %s : %d - fail.\n",
current->comm, current->pid, __file__, __func__, __line__);
return ret;
}static void __exit demo_exit(void)
class_destroy(cls);
unregister_chrdev_region(mkdev(major, minor), count);
cdev_del(demop);
}module_init(demo_init);
module_exit(demo_exit);
module_license("gpl");
module_author("farsight");
module_description("demo for kernel module");
字元裝置驅動第八課 讀寫鎖
忙等鎖,臨界區盡量不休眠。rwlock init lock write lock lock write unlock lock read lock lock read unlock lock 搶得到就搶。搶不到鎖也返回往下走,一般下面會對其返回值做判斷 功能 嘗試上讀鎖,不管搶到鎖還是搶不到鎖都返回...
字元裝置驅動第八課 自旋鎖
原始碼目錄下include linux spinlock.hstatic spinlock t lock 定義乙個自旋鎖spin lock init lock spin lock lock spin unlock lock include include include include includ...
字元裝置驅動第八課 file
裝置驅動中的操作方法集中所有的函式,第乙個引數都是struct file filp。這個結構體中有個成員,專門標識阻塞和非阻塞。struct file f u struct path f path 路徑 struct inode f inode cached value const struct f...