亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtai_shm.c

?? Linux共享內存share memory通信機制的內核實現
?? C
字號:
/*COPYRIGHT (C) 1999  Paolo Mantegazza (mantegazza@aero.polimi.it)This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.*/#define RTAI_SHM_MISC_MINOR  254 // The same minor used to mknod for major 10.#define MAX_SLOTS            32  // Set it according to your needs.#define MAX_OWNERS           4*MAX_SLOTS // avrg 4 simultaneous users per slot!static int closable;static int echo;#include <linux/version.h>#include <linux/module.h>#include <linux/config.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/fcntl.h>#include <linux/mm.h>#include <linux/miscdevice.h>#include <linux/malloc.h>#include <linux/wrapper.h>#include <asm/uaccess.h>#include <asm/pgtable.h>#include <asm/io.h>#include "rtai_shm.h"#include "../kvmem.h"/* The two lines below could go into a structure. It is preferred   to keep them distinct to recall that a vmarea pertains only to    processes allocated/mmaped areas, and not to module ones. */static unsigned long long name_pid_list[MAX_OWNERS + 1] = { 0LL, };static struct vm_area_struct *vmarea[MAX_OWNERS + 1]   = { 0, };static struct { void *adr; unsigned long name, size, count; } shm_list[MAX_SLOTS + 1] = { {0, 0, 0, 0}, };static spinlock_t shm_lock = SPIN_LOCK_UNLOCKED;#define NAME(x) ((unsigned long *)(&(x)))[0]#define PID(x)  ((unsigned long *)(&(x)))[1]static inline int registr(unsigned long long name_pid){	int owner;	for (owner = 1; owner <= MAX_OWNERS; owner++) {		if (!name_pid_list[owner]) {			name_pid_list[owner] = name_pid;			vmarea[owner] = (struct vm_area_struct *)(PID(name_pid) | 0xF0000000);			return owner;		}	}	return 0;} static inline int deregistr(unsigned long long name_pid){	int owner;	for (owner = 1; owner <= MAX_OWNERS; owner++) {		if (name_pid_list[owner] == name_pid) {			name_pid_list[owner] = 0LL;			vmarea[owner] = 0;			return owner;		}	}	return 0;} static inline int there_is_not_and_reg(unsigned long long name_pid){	int owner;	for (owner = 1; owner <= MAX_OWNERS; owner++) {		if (name_pid_list[owner] == name_pid) {			return 0;		}	}	return registr(name_pid);} static inline int find_name(unsigned long name){	int slot;	for (slot = 1; slot <= MAX_SLOTS; slot++) {		if (shm_list[slot].name == name) {			return slot;		}	}	return 0;} static inline int find_name_and_reg(unsigned long name, unsigned long pid){	int slot;	unsigned long long name_pid;	for (slot = 1; slot <= MAX_SLOTS; slot++) {		if (shm_list[slot].name == name) {			NAME(name_pid) = name;			PID(name_pid)  = pid;			return there_is_not_and_reg(name_pid) ? slot : 0;		}	}	return 0;} static inline int find_free_slot_and_reg(unsigned long name, unsigned long pid){	int slot;	unsigned long long name_pid;	for (slot = 1; slot <= MAX_SLOTS; slot++) {		if (!shm_list[slot].name) {			NAME(name_pid) = name;			PID(name_pid)  = pid;			return there_is_not_and_reg(name_pid) ? slot : 0;		}	}	return 0;} static inline int find_name_and_drg(unsigned long name, unsigned long pid){	int slot;	unsigned long long name_pid;	for (slot = 1; slot <= MAX_SLOTS; slot++) {		if (shm_list[slot].name == name) {			NAME(name_pid) = name;			PID(name_pid)  = pid;			return deregistr(name_pid) ? slot : 0;		}	}	return 0;} void *rtai_kmalloc_f(int name, int size, unsigned long pid){	unsigned long flags;	void *adr;	int slot;	if (size <= 0) {		return 0;	}	spin_lock_irqsave(&shm_lock, flags);	if ((slot = find_name_and_reg(name, pid))) {		shm_list[slot].count++;		MOD_INC_USE_COUNT;		adr = shm_list[slot].adr;		spin_unlock_irqrestore(&shm_lock, flags);		return adr;	}	spin_unlock_irqrestore(&shm_lock, flags);	size = REAL_SIZE(size);	if ((adr = rvmalloc(size))) {		spin_lock_irqsave(&shm_lock, flags);		if ((slot = find_free_slot_and_reg(name, pid))) {			memset(adr, 0, size);			shm_list[slot].name  = name;			shm_list[slot].adr   = adr;			shm_list[slot].size  = size;			shm_list[slot].count = 1;			MOD_INC_USE_COUNT;			spin_unlock_irqrestore(&shm_lock, flags);			return adr;		}		spin_unlock_irqrestore(&shm_lock, flags);		rvfree(adr, size);	}	return 0;}void rtai_kfree_f(int name, unsigned long pid){	unsigned long flags;	int slot, size;	void *adr;	spin_lock_irqsave(&shm_lock, flags);	if ((slot = find_name_and_drg(name, pid))) {		MOD_DEC_USE_COUNT;		if (!(--shm_list[slot].count)) {			adr  = shm_list[slot].adr;			size = shm_list[slot].size;			shm_list[slot] = shm_list[0];			spin_unlock_irqrestore(&shm_lock, flags);			rvfree(adr, size);			return;		}	}	spin_unlock_irqrestore(&shm_lock, flags);	return;}int rtai_shm_ioctl(struct inode *inode, struct file *file, unsigned int srq, unsigned long name){	static void rtai_shm_vm_close(struct vm_area_struct *vma);	int owner, slot;	long long name_pid;	switch (srq) {		case 1:			if (rtai_kmalloc_f(((unsigned long *)name)[0], ((unsigned long *)name)[1], current->pid)) {				return shm_list[find_name(((unsigned long *)name)[0])].size;			}			return 0;		case 2:			NAME(name_pid) = name;			PID(name_pid)  = current->pid;			for (owner = 1; owner <= MAX_OWNERS; owner++) {				if (name_pid_list[owner] == name_pid) {					if (vmarea[owner] && (vmarea[owner]->vm_ops)->close == rtai_shm_vm_close) {						vmarea[owner]->vm_ops = 0;						if ((slot = find_name(name))) {							return shm_list[slot].size;						}					}					printk("VMAREA NOT FOUND FOR AN EXISTING NAME_PID AT UNMAP REQUEST.\n");					return 0;				}			}			return 0;		case 3:			rtai_kfree_f(name, current->pid);			return 0;// all what's below, in this function, is just for testing		case 4:			if ((slot = find_name(name))) {			return shm_list[slot].count > 1 ? shm_list[slot].size : - shm_list[slot].size;			}			return 0;		case 5:			if ((slot = find_name(name))) {				int *adr;				adr = shm_list[slot].adr;				printk("ECHO FOR %lx FROM SHM MODULE %d\n", name, adr[0]);				echo += 2;				memset(shm_list[slot].adr, echo, shm_list[slot].size);				printk("SHM MODULE WILL CHANGE %lx TO %d\n", name, adr[0]);				slot = find_name(0xaaaa);				adr = shm_list[slot].adr;				printk("ECHO FOR %x FROM SHM MODULE %d\n", 0xaaaa, adr[0]);				echo += 2;				memset(shm_list[slot].adr, echo, shm_list[slot].size);				printk("SHM MODULE WILL CHANGE %x TO %d\n", 0xaaaa, adr[0]);			}			return 0;		case 6:			return closable;		case 7:			return (closable = 1);		case 8:			return (closable = 0);	}	return 0;}static void rtai_shm_vm_close(struct vm_area_struct *vma){	int owner, slot;	for (owner = 1; owner <= MAX_OWNERS; owner++) {		if (vmarea[owner] == vma && PID(name_pid_list[owner]) == current->pid) {			if((slot = find_name(NAME(name_pid_list[owner])))) {				if (shm_list[slot].count == 1) {					printk("DELETING AREA %lx AT KERNEL REQUEST.\n", shm_list[slot].name);				} else {					printk("UNMAPPING AREA %lx AT KERNEL REQUEST.\n", shm_list[slot].name);				}				rtai_kfree_f(shm_list[slot].name, current->pid);				return;			}			printk("NO AREA NAME FOUND FOR AN EXISTING PID_VMA AT KERNEL UNMAP REQUEST.\n");			return;		}	}	printk("NO PID_VMA FOUND AT KERNEL UNMAP REQUEST.\n");	return;}struct vm_operations_struct rtai_shm_vm_ops = { close: rtai_shm_vm_close } ;static int rtai_shm_mmap(struct file *file, struct vm_area_struct *vma){	int owner, slot;	for (owner = 1; owner <= MAX_OWNERS; owner++) {		if (PID(name_pid_list[owner]) == current->pid && vmarea[owner] == ((struct vm_area_struct *)(current->pid | 0xF0000000))) {			if((slot = find_name(NAME(name_pid_list[owner])))) {				vmarea[owner] = vma;				if(!vma->vm_ops) {					vma->vm_ops = &rtai_shm_vm_ops;				}				return rvmmap(shm_list[slot].adr, shm_list[slot].size, vma); 			}			printk("NO AREA NAME FOUND FOR A MAPPABLE PID AT MMAPP REQUEST.\n");			return -EFAULT;		}	}	printk("NO MAPPABLE PID FOUND AT MMAPP REQUEST.\n");	return -EFAULT;}static int rtai_shm_f_open(struct inode *inode, struct file *file){	return 0;}static int rtai_shm_f_close(struct inode *inode, struct file *file){	return 0;}static struct file_operations rtai_shm_fops = 	{ ioctl: rtai_shm_ioctl, mmap: rtai_shm_mmap, open: rtai_shm_f_open, release: rtai_shm_f_close };static struct miscdevice rtai_shm_dev = 	{ RTAI_SHM_MISC_MINOR, "RTAI_SHM", &rtai_shm_fops, NULL, NULL };int init_module (void){	if (misc_register(&rtai_shm_dev) < 0) {		printk("***** COULD NOT REGISTER SHARED MEMORY DEVICE *****\n");		return -EBUSY;	}	return 0 ;}void cleanup_module (void){	int i;	printk("\n");	for (i = 1; i <= MAX_SLOTS; i++) {		if (shm_list[i].name) {			printk("***** FREEING AREA %lx AT MODULE CLEANUP *****\n", shm_list[i].name);			rvfree(shm_list[i].adr, shm_list[i].size);		}	}	printk("\n");	misc_deregister(&rtai_shm_dev);	return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久88色综合天天| 国产精品亚洲а∨天堂免在线| 国产欧美一区二区精品秋霞影院| 欧美日韩午夜在线| 欧美精品高清视频| 91精品国产91久久久久久一区二区| 欧美三日本三级三级在线播放| 日本国产一区二区| 欧美视频一区在线观看| 欧美视频一二三区| 欧美日韩成人一区| 欧美大片日本大片免费观看| 欧美成人video| 精品国产髙清在线看国产毛片| ww亚洲ww在线观看国产| 久久久国产精品不卡| 国产女同性恋一区二区| 成人免费小视频| 亚洲线精品一区二区三区八戒| 亚洲国产精品尤物yw在线观看| 亚洲va韩国va欧美va精品| 午夜成人免费电影| 狠狠色丁香久久婷婷综合丁香| 国产成人综合亚洲91猫咪| 97久久超碰国产精品| 欧美日本韩国一区二区三区视频 | 国产99久久久久久免费看农村| 国产精品资源在线| 91在线观看一区二区| 欧美人狂配大交3d怪物一区| 色av成人天堂桃色av| 4438成人网| 亚洲欧美区自拍先锋| 亚洲成人午夜电影| 高清成人在线观看| 欧美人狂配大交3d怪物一区| 国产偷国产偷精品高清尤物 | 一二三区精品福利视频| 亚洲大片一区二区三区| 日本女优在线视频一区二区| 国产黄色精品视频| 制服丝袜一区二区三区| 国产欧美日韩视频在线观看| 中文字幕一区二区三区四区不卡 | 欧美一区二区三区播放老司机| 久久婷婷国产综合精品青草| 亚洲视频每日更新| 久久国产综合精品| 欧美在线看片a免费观看| 26uuu久久天堂性欧美| 一级做a爱片久久| 国产suv精品一区二区6| 欧美二区在线观看| 亚洲免费在线视频一区 二区| 国内精品国产成人| 91精品91久久久中77777| 国产午夜亚洲精品理论片色戒 | 一区二区三区成人| 国产精品亚洲专一区二区三区| 欧美日韩国产精品成人| 亚洲精品网站在线观看| 国产·精品毛片| 久久综合给合久久狠狠狠97色69| 婷婷国产v国产偷v亚洲高清| 欧美性受xxxx黑人xyx性爽| 国产精品无码永久免费888| 精品一区二区三区欧美| 欧美电影免费观看高清完整版 | 欧美一级一区二区| 亚洲一级不卡视频| 色综合久久综合中文综合网| 国产精品久久久99| 国产精品一二三四区| 精品动漫一区二区三区在线观看 | 2020国产精品自拍| 久久成人18免费观看| 日韩欧美一区在线| 美女免费视频一区二区| 精品久久久久久综合日本欧美| 久久福利资源站| 国产亚洲午夜高清国产拍精品| 国产美女精品一区二区三区| 久久网站热最新地址| 国产福利电影一区二区三区| 亚洲国产成人午夜在线一区| 高清在线成人网| 国产精品久久久久久久蜜臀| 99视频精品免费视频| 亚洲欧美日韩在线不卡| 欧洲视频一区二区| 日韩av一级片| 欧美国产一区二区在线观看| 99精品视频中文字幕| 亚洲永久精品大片| 日韩欧美一级二级三级久久久| 精品亚洲欧美一区| 国产精品久久久久久久岛一牛影视| 色悠悠亚洲一区二区| 五月天精品一区二区三区| 精品三级在线观看| 东方欧美亚洲色图在线| 亚洲人亚洲人成电影网站色| 欧美视频一区二区| 精品亚洲porn| 亚洲午夜电影在线| 精品国产成人在线影院| 97se亚洲国产综合自在线| 亚洲一卡二卡三卡四卡五卡| 精品国产免费一区二区三区四区 | 亚洲gay无套男同| 国产色产综合色产在线视频| 日本精品视频一区二区三区| 天天影视色香欲综合网老头| wwwwxxxxx欧美| 欧美日韩电影一区| 国产制服丝袜一区| 午夜不卡av免费| 国产精品美女久久福利网站| 欧美一级艳片视频免费观看| 91色porny| 国产精品一二三四| 日韩中文字幕一区二区三区| 日本一区二区高清| 欧美成人一区二区三区片免费| 91香蕉视频黄| 国产一区91精品张津瑜| 亚洲高清视频的网址| 国产精品免费免费| 欧美精品一区二区三区在线 | 国产欧美一区二区三区沐欲| 正在播放亚洲一区| 色婷婷亚洲婷婷| 成人国产精品免费观看视频| 免费成人在线视频观看| 亚洲国产精品一区二区www在线| 亚洲国产岛国毛片在线| 精品国产不卡一区二区三区| 56国语精品自产拍在线观看| 色噜噜狠狠色综合中国| 成人永久aaa| 国产成人亚洲综合a∨婷婷| 午夜精品福利一区二区蜜股av| 国产精品久久久久久久久免费相片| 精品免费99久久| 欧美一级黄色录像| 91精品午夜视频| 欧美一级生活片| 日韩欧美在线影院| 日韩欧美在线一区二区三区| 91精品国产综合久久香蕉麻豆 | 日韩极品在线观看| 亚洲影院久久精品| 久久激情五月婷婷| 奇米在线7777在线精品| 日韩av在线免费观看不卡| 亚洲成人精品一区二区| 亚洲一区在线观看免费 | 欧美日韩国产在线观看| 色婷婷综合久久| 色欧美88888久久久久久影院| 成人av网站免费观看| 99在线精品视频| 91欧美一区二区| 欧美图片一区二区三区| 欧美日韩日日骚| 欧美一三区三区四区免费在线看 | 久久理论电影网| 国产精品天天摸av网| 国产精品传媒入口麻豆| 亚洲欧美怡红院| 午夜精品久久久久久| 久久超碰97人人做人人爱| 精品无码三级在线观看视频 | 一区二区三区在线高清| 午夜婷婷国产麻豆精品| 久久er99热精品一区二区| 国产精品99久久久久久似苏梦涵 | 欧美一区二区视频观看视频 | 不卡电影免费在线播放一区| www.亚洲在线| 欧美精品少妇一区二区三区| 精品国产1区2区3区| 亚洲欧洲av一区二区三区久久| 亚洲午夜久久久久久久久久久| 亚洲福利一二三区| 日韩三级在线观看| 精品久久国产97色综合| 中文字幕二三区不卡| 夜夜精品浪潮av一区二区三区| 日韩精品乱码免费| eeuss鲁片一区二区三区在线看| 精品视频999| 欧美国产日产图区| 偷窥少妇高潮呻吟av久久免费| 国产成人一级电影| 欧美三级电影网| 国产精品视频看| 美女久久久精品| 在线观看一区二区视频| 久久久久成人黄色影片|