乙個硬體裝置會被多個程序同時使用,這就是併發,併發會導致裝置亂序。例如scull裝置就有可能在a 程序正在執行scull_read 函式(但尚未執行完)的時候就被b 程序打斷,而b 程序執行的是scull_write 函式,當a 程序再次被執行的時候它讀到的東西就不再是它以前應該讀到的東西。要解決這個問題,就必須保證當scull_read 或scull_write 在執行時不被打斷,這就需要併發控制。linux 核心提供給驅動程式進行併發控制的手段主要有3 種,分別為原子變數、自旋鎖和訊號量。
1.原子操作
#include
#include
#include
#include
#include
#include
module_license (
"gpl");
#define chrdev_major 201
#define chrdev_minor 2
#define chrdev_name "chrdev"
struct cdev mycdev;
dev_t dev_id;
atomic_t m =
atomic_init(1
);1、定義並初始化乙個原子變數
static
intchrdev_open
(struct inode *inode,
struct file *file)
return0;
}static
intchrdev_close
(struct inode *inode,
struct file *file)
static
struct file_operations ops =
;static
int __init hello_init (
void
)else
}else
return0;
}static
void __exit hello_exit (
void
)module_init (hello_init)
;module_exit (hello_exit)
;
2.測試檔案
include "stdio.h"
#include
"fcntl.h"
#include
"stdlib.h"
#include
"unistd.h"
intmain
(int argc,
char
*ar**)
printf
("open success\n");
loop:
printf
("please input a value(-1 tp quit)\n");
scanf
("%d"
,&value);if
(value ==-1
)else
return0;
}同時執行兩個這樣的檔案,當乙個開啟後另乙個開啟就會失敗,起到互斥的作用
驅動程式的載入機制
裝置 驅動程式的載入過程如下 圖所示 1.當在oal 中的oeminit 執行時,需要啟動乙太網除錯 串列埠除錯等除錯服務 2.oal可能需要配置和列舉乙個匯流排,如 pci匯流排,以便操作乙個用於除錯的裝置 3.oal負責將這個資源資訊放到乙個登錄檔鍵,並使驅動程式可訪問它。然後,device.e...
Linux核心併發機制 原子操作
很多人會問這樣的問題,linux核心中提供了各式各樣的鎖機制到底有何作用?追根到底其實是由於作業系統中存在多程序對共享資源的併發訪問,從而引起了程序間的競態。這其中包括了我們所熟知的smp系統,多核間的相互競爭資源,單cpu之間的相互競爭,中斷和程序間的相互搶占等諸多問題。所謂的原子操作,就是該操作...
Linux驅動程式之poll機制
使用非阻塞i o的應用程式通常會使用select 和poll 系統呼叫查詢是否可對裝置進行無阻塞的訪問,這兩個系統呼叫最終又會引發裝置驅動中的poll 函式被執行 所以我們的問題就集中到了如何編寫裝置驅動中的poll 函式就可以了。先來看看裝置驅動中的poll 函式原型 這個函式要進行下面兩項工作 ...