字元驅動第七課 原子操作

2021-07-25 04:44:12 字數 4499 閱讀 3350

當同乙份**產生兩個例項(執行態)時,他們所操作的空間就是同一塊空間,這會造成資料不按預想地被修改,這就是重入問題,避免了這種衝突的**叫可重入**。

同乙個程序內,乙個函式還沒有執行完就又開始第二次呼叫,這也會引起重入問題。如正在執行add()函式,此時來了個中斷,中斷服務子程式中也要呼叫add()函式,此時可能會有風險。

保護範圍,細粒度即是保護得那段**很精簡
強調**的秩序,即誰先誰後
排他,資源性保護
最簡單粗暴無腦的做法,容易造成系統效能下降,一般不用,遮蔽了中斷的**要求快速執行,不能休眠,執行完馬上開啟中斷。
不可被打斷的操作叫做原子操作
asm/atomic.h

型別: atomic_t

初始化:atomic_t tv = atomic_init(初值);

/** 功能:讀取原子量的值

*/atomic_read(v)

/*

* 功能:設定原子量為某個值

*/atomic_set(v, i)

原始碼目錄下arch/tile/include/asm/     include/asm/atomic.h
/*

* 功能:將原子量加上某個值後返回

*/atomic_add_return(int i, atomic_t *v)

/*

* 功能:將原子量加1後返回

*/atomic64_inc_return(v)

/*

* 功能:將原子量減掉某個值並且判斷減後是否為0

* 返回值:減後為0則返回ture(1),否則返回fase(0)

*/ atomic64_sub_and_test(i, v)

#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 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(copy_to_user(buf, kbuf, size))

counter = 0;//模擬已讀空

return size;

}//寫裝置

static ssize_t demo_write(struct file *filp, const char __user *buf, size_t size, loff_t *offset)

if(copy_from_user(kbuf, buf, size))

counter = size; //模擬成功寫入size個位元組

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); //原子變數初始化

//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");

第七課 js的DOM操作

這節課我們來學js的dom操作 先來說下啥事dom,就是document object model,文件物件模型 dom操作就是用來操作html裡的各個標籤的,看演示 這節課講dom操作 1 獲取html的某個標籤 根據標籤名 document.getelementsbytagname tagnam...

C語言第七課

主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...

第七課 C變數

第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...