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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? shm.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * linux/ipc/shm.c
 * Copyright (C) 1992, 1993 Krishna Balasubramanian 
 *         Many improvements/fixes by Bruno Haible.
 * assume user segments start at 0x0
 */

#include <linux/errno.h>
#include <asm/segment.h>
#include <linux/sched.h>
#include <linux/ipc.h> 
#include <linux/shm.h>
#include <linux/stat.h>
#include <linux/malloc.h>

extern int ipcperms (struct ipc_perm *ipcp, short semflg);
extern unsigned int get_swap_page(void);
static int findkey (key_t key);
static int newseg (key_t key, int shmflg, int size);
static int shm_map (struct shm_desc *shmd, int remap);
static void killseg (int id);

static int shm_tot = 0;  /* total number of shared memory pages */
static int shm_rss = 0; /* number of shared memory pages that are in memory */
static int shm_swp = 0; /* number of shared memory pages that are in swap */
static int max_shmid = 0; /* every used id is <= max_shmid */
static struct wait_queue *shm_lock = NULL;
static struct shmid_ds *shm_segs[SHMMNI];

static unsigned short shm_seq = 0; /* incremented, for recognizing stale ids */

/* some statistics */
static ulong swap_attempts = 0;
static ulong swap_successes = 0;
static ulong used_segs = 0;

void shm_init (void)
{
	int id;
    
       	for (id = 0; id < SHMMNI; id++) 
		shm_segs[id] = (struct shmid_ds *) IPC_UNUSED;
	shm_tot = shm_rss = shm_seq = max_shmid = used_segs = 0;
	shm_lock = NULL;
	return;
}

static int findkey (key_t key)    
{
	int id;
	struct shmid_ds *shp;
	
	for (id=0; id <= max_shmid; id++) {
		while ((shp = shm_segs[id]) == IPC_NOID) 
			sleep_on (&shm_lock);
		if (shp == IPC_UNUSED)
			continue;
		if (key == shp->shm_perm.key) 
			return id;
	}
	return -1;
}

/* 
 * allocate new shmid_ds and pgtable. protected by shm_segs[id] = NOID.
 */
static int newseg (key_t key, int shmflg, int size)
{
	struct shmid_ds *shp;
	int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT;
	int id, i;

	if (size < SHMMIN)
		return -EINVAL;
	if (shm_tot + numpages >= SHMALL)
		return -ENOSPC;
	for (id=0; id < SHMMNI; id++)
		if (shm_segs[id] == IPC_UNUSED) {
			shm_segs[id] = (struct shmid_ds *) IPC_NOID;
			goto found;
		}
	return -ENOSPC;

found:
	shp = (struct shmid_ds *) kmalloc (sizeof (*shp), GFP_KERNEL);
	if (!shp) {
		shm_segs[id] = (struct shmid_ds *) IPC_UNUSED;
		if (shm_lock)
			wake_up (&shm_lock);
		return -ENOMEM;
	}

	shp->shm_pages = (ulong *) kmalloc (numpages*sizeof(ulong),GFP_KERNEL);
	if (!shp->shm_pages) {
		shm_segs[id] = (struct shmid_ds *) IPC_UNUSED;
		if (shm_lock)
			wake_up (&shm_lock);
		kfree_s (shp, sizeof (*shp));
		return -ENOMEM;
	}

	for (i=0; i< numpages; shp->shm_pages[i++] = 0);
	shm_tot += numpages;
	shp->shm_perm.key = key;
	shp->shm_perm.mode = (shmflg & S_IRWXUGO);
	shp->shm_perm.cuid = shp->shm_perm.uid = current->euid;
	shp->shm_perm.cgid = shp->shm_perm.gid = current->egid;
	shp->shm_perm.seq = shm_seq;
	shp->shm_segsz = size;
	shp->shm_cpid = current->pid;
	shp->attaches = NULL;
	shp->shm_lpid = shp->shm_nattch = 0;
	shp->shm_atime = shp->shm_dtime = 0;
	shp->shm_ctime = CURRENT_TIME;
	shp->shm_npages = numpages;

	if (id > max_shmid)
		max_shmid = id;
	shm_segs[id] = shp;
	used_segs++;
	if (shm_lock)
		wake_up (&shm_lock);
	return id + (int)shm_seq*SHMMNI;
}

int sys_shmget (key_t key, int size, int shmflg)
{
	struct shmid_ds *shp;
	int id = 0;
	
	if (size < 0 || size > SHMMAX)
		return -EINVAL;
	if (key == IPC_PRIVATE) 
		return newseg(key, shmflg, size);
	if ((id = findkey (key)) == -1) {
		if (!(shmflg & IPC_CREAT))
			return -ENOENT;
		return newseg(key, shmflg, size);
	} 
	if ((shmflg & IPC_CREAT) && (shmflg & IPC_EXCL))
		return -EEXIST;
	shp = shm_segs[id];
	if (shp->shm_perm.mode & SHM_DEST)
		return -EIDRM;
	if (size > shp->shm_segsz)
		return -EINVAL;
	if (ipcperms (&shp->shm_perm, shmflg))
		return -EACCES;
	return shp->shm_perm.seq*SHMMNI + id;
}

/* 
 * Only called after testing nattch and SHM_DEST.
 * Here pages, pgtable and shmid_ds are freed.
 */
static void killseg (int id)
{
	struct shmid_ds *shp;
	int i, numpages;
	ulong page;

	shp = shm_segs[id];
	if (shp == IPC_NOID || shp == IPC_UNUSED) {
		printk ("shm nono: killseg called on unused seg id=%d\n", id);
		return;
	}
	shp->shm_perm.seq++;     /* for shmat */
	numpages = shp->shm_npages; 
	shm_seq++;
	shm_segs[id] = (struct shmid_ds *) IPC_UNUSED;
	used_segs--;
	if (id == max_shmid) 
		while (max_shmid && (shm_segs[--max_shmid] == IPC_UNUSED));
	if (!shp->shm_pages) {
		printk ("shm nono: killseg shp->pages=NULL. id=%d\n", id);
		return;
	}
	for (i=0; i< numpages ; i++) {
		if (!(page = shp->shm_pages[i]))
			continue;
		if (page & 1) {
			free_page (page & PAGE_MASK);
			shm_rss--;
		} else {
			swap_free (page);
			shm_swp--;
		}
	}
	kfree_s (shp->shm_pages, numpages * sizeof (ulong));
	shm_tot -= numpages;
	kfree_s (shp, sizeof (*shp));
	return;
}

int sys_shmctl (int shmid, int cmd, struct shmid_ds *buf)
{
	struct shmid_ds *shp, tbuf;
	struct ipc_perm *ipcp;
	int id, err;
	
	if (cmd < 0 || shmid < 0)
		return -EINVAL;
	if (cmd == IPC_SET) {
		if (!buf)
			return -EFAULT;
		err = verify_area (VERIFY_READ, buf, sizeof (*buf));
		if (err)
			return err;
		memcpy_fromfs (&tbuf, buf, sizeof (*buf));
	}

	switch (cmd) { /* replace with proc interface ? */
	case IPC_INFO: 
	{
		struct shminfo shminfo;
		if (!buf)
			return -EFAULT;
		shminfo.shmmni = SHMMNI;
		shminfo.shmmax = SHMMAX;
		shminfo.shmmin = SHMMIN;
		shminfo.shmall = SHMALL;
		shminfo.shmseg = SHMSEG;
		err = verify_area (VERIFY_WRITE, buf, sizeof (struct shminfo));
		if (err)
			return err;
		memcpy_tofs (buf, &shminfo, sizeof(struct shminfo));
		return max_shmid;
	}
	case SHM_INFO: 
	{ 
		struct shm_info shm_info;
		if (!buf)
			return -EFAULT;
		err = verify_area (VERIFY_WRITE, buf, sizeof (shm_info));
		if (err)
			return err;
		shm_info.used_ids = used_segs; 
		shm_info.shm_rss = shm_rss;
		shm_info.shm_tot = shm_tot;
		shm_info.shm_swp = shm_swp;
		shm_info.swap_attempts = swap_attempts;
		shm_info.swap_successes = swap_successes;
		memcpy_tofs (buf, &shm_info, sizeof(shm_info));
		return max_shmid;
	}
	case SHM_STAT:
		if (!buf)
			return -EFAULT;
		err = verify_area (VERIFY_WRITE, buf, sizeof (*shp));
		if (err)
			return err;
		if (shmid > max_shmid)
			return -EINVAL;
		shp = shm_segs[shmid];
		if (shp == IPC_UNUSED || shp == IPC_NOID)
			return -EINVAL;
		if (ipcperms (&shp->shm_perm, S_IRUGO))
			return -EACCES;
		id = shmid + shp->shm_perm.seq * SHMMNI; 
		memcpy_tofs (buf, shp, sizeof(*shp));
		return id;
	}
	
	shp = shm_segs[id = shmid % SHMMNI];
	if (shp == IPC_UNUSED || shp == IPC_NOID)
		return -EINVAL;
	ipcp = &shp->shm_perm;
	if (ipcp->seq != shmid / SHMMNI) 
		return -EIDRM;
	
	switch (cmd) {
	case SHM_UNLOCK:
		if (!suser())
			return -EPERM;
		if (!(ipcp->mode & SHM_LOCKED))
			return -EINVAL;
		ipcp->mode &= ~SHM_LOCKED;
		break;
	case SHM_LOCK:
/* Allow superuser to lock segment in memory */
/* Should the pages be faulted in here or leave it to user? */
/* need to determine interaction with current->swappable */
		if (!suser())
			return -EPERM;
		if (ipcp->mode & SHM_LOCKED)
			return -EINVAL;
		ipcp->mode |= SHM_LOCKED;
		break;
	case IPC_STAT:
		if (ipcperms (ipcp, S_IRUGO))
			return -EACCES;
		if (!buf)
			return -EFAULT;
		err = verify_area (VERIFY_WRITE, buf, sizeof (*shp));
		if (err)
			return err;
		memcpy_tofs (buf, shp, sizeof(*shp));
		break;
	case IPC_SET:
		if (suser() || current->euid == shp->shm_perm.uid ||
		    current->euid == shp->shm_perm.cuid) {
			ipcp->uid = tbuf.shm_perm.uid;
			ipcp->gid = tbuf.shm_perm.gid;
			ipcp->mode = (ipcp->mode & ~S_IRWXUGO)
				| (tbuf.shm_perm.mode & S_IRWXUGO);
			shp->shm_ctime = CURRENT_TIME;
			break;
		}
		return -EPERM;
	case IPC_RMID:
		if (suser() || current->euid == shp->shm_perm.uid ||
		    current->euid == shp->shm_perm.cuid) {
			shp->shm_perm.mode |= SHM_DEST;
			if (shp->shm_nattch <= 0) 
				killseg (id);
			break;
		}
		return -EPERM;
	default:
		return -EINVAL;
	}
	return 0;
}

/*
 * check range is unmapped, ensure page tables exist
 * mark page table entries with shm_sgn.
 * if remap != 0 the range is remapped.
 */
static int shm_map (struct shm_desc *shmd, int remap)
{
	unsigned long invalid = 0;
	unsigned long *page_table;
	unsigned long tmp, shm_sgn;
	unsigned long page_dir = shmd->task->tss.cr3;
	
	/* check that the range is unmapped and has page_tables */
	for (tmp = shmd->start; tmp < shmd->end; tmp += PAGE_SIZE) { 
		page_table = PAGE_DIR_OFFSET(page_dir,tmp);
		if (*page_table & PAGE_PRESENT) {
			page_table = (ulong *) (PAGE_MASK & *page_table);
			page_table += ((tmp >> PAGE_SHIFT) & (PTRS_PER_PAGE-1));
			if (*page_table) {
				if (!remap)
					return -EINVAL;
				if (*page_table & PAGE_PRESENT) {
					--current->rss;
					free_page (*page_table & PAGE_MASK);
				}
				else
					swap_free (*page_table);
				invalid++;
			}
			continue;
		}  
	      {
		unsigned long new_pt;
		if(!(new_pt = get_free_page(GFP_KERNEL)))	/* clearing needed?  SRB. */
			return -ENOMEM;
		*page_table = new_pt | PAGE_TABLE;
		tmp |= ((PAGE_SIZE << 10) - PAGE_SIZE);
	}}
	if (invalid)
		invalidate();

	/* map page range */
	shm_sgn = shmd->shm_sgn;
	for (tmp = shmd->start; tmp < shmd->end; tmp += PAGE_SIZE, 
	     shm_sgn += (1 << SHM_IDX_SHIFT)) { 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品午夜视频| 麻豆精品久久久| 国产福利一区在线| 中文字幕精品一区二区精品绿巨人| 伊人性伊人情综合网| 国产专区欧美精品| 91精品国产色综合久久不卡蜜臀| 国产精品视频免费看| 精品亚洲成av人在线观看| 欧美日韩久久一区| 亚洲欧美色一区| 成人激情午夜影院| 久久精品视频一区二区三区| 免费在线观看成人| 欧美久久久久久久久| 一区二区三区精品在线观看| 成人教育av在线| 欧美经典一区二区| 国产一区二区三区国产| 日韩一级成人av| 天天综合网天天综合色| 欧美视频在线观看一区| 亚洲乱码中文字幕| 91视视频在线观看入口直接观看www| 国产清纯白嫩初高生在线观看91| 精品一区二区在线免费观看| 91精品国产综合久久久久| 亚州成人在线电影| 欧美日韩综合一区| 一区二区三区在线看| 91麻豆国产在线观看| 中文字幕一区av| 99re这里只有精品6| 国产精品第13页| 成人av电影在线网| 国产精品国产三级国产普通话99| 国产成人午夜精品5599| 日本一区二区三区电影| 国产精品99久久久久久久女警| 久久久久久麻豆| 国产原创一区二区| 国产亚洲精品超碰| 国产激情精品久久久第一区二区| 久久精品一二三| 成人午夜精品在线| 国产精品久久久久永久免费观看 | 2021国产精品久久精品| 久久99精品久久久久久国产越南 | 56国语精品自产拍在线观看| 亚洲成人在线免费| 欧美一级淫片007| 久久av中文字幕片| 久久久噜噜噜久噜久久综合| 高清成人在线观看| 中文字幕亚洲电影| 欧美在线免费观看视频| 五月婷婷久久丁香| 精品国产乱码久久久久久浪潮| 精品亚洲成av人在线观看| 国产欧美一区二区精品婷婷| 97久久精品人人做人人爽| 亚洲宅男天堂在线观看无病毒| 欧美精品自拍偷拍| 国产米奇在线777精品观看| 国产精品女同互慰在线看| 972aa.com艺术欧美| 亚洲国产wwwccc36天堂| 日韩欧美一级在线播放| 懂色av一区二区夜夜嗨| 一区二区三国产精华液| 日韩欧美国产一区二区三区 | 亚洲综合色噜噜狠狠| 欧美一区二区三区免费大片| 国产在线播放一区三区四| 中文字幕在线观看不卡| 欧美日韩国产成人在线91| 韩国精品免费视频| 日韩一区中文字幕| 日韩午夜av一区| 成人一级片在线观看| 一个色在线综合| 精品久久久久久久久久久久久久久久久| 国产原创一区二区| 一区二区三区四区不卡在线| 欧美变态凌虐bdsm| 成人h动漫精品一区二区| 午夜影院久久久| 国产亚洲综合在线| 欧美日韩mp4| 国产精品88av| 亚洲成人自拍一区| 国产欧美视频在线观看| 欧美午夜精品电影| 国产成人免费网站| 无码av免费一区二区三区试看| 国产日韩精品一区二区三区| 欧美日韩精品三区| 国产成人午夜视频| 日韩高清在线电影| 亚洲人午夜精品天堂一二香蕉| 日韩一级大片在线| 91搞黄在线观看| 国产一区二区三区| 午夜精品久久久| 日韩一区在线免费观看| 精品欧美一区二区久久 | 国产美女主播视频一区| 亚洲综合av网| 中文一区二区在线观看| 欧美一区二区三区免费观看视频| 91蜜桃免费观看视频| 狠狠色狠狠色综合日日91app| 亚洲高清免费视频| 国产精品久久久久久久久果冻传媒| 91精品国产综合久久国产大片| av一区二区三区四区| 卡一卡二国产精品 | 欧美激情在线一区二区| 91精品国产91久久久久久一区二区 | 中文字幕欧美一区| 精品国产一区二区精华| 欧美日韩精品专区| 色噜噜狠狠成人中文综合| 国产精品一线二线三线精华| 日韩电影免费在线观看网站| 亚洲久本草在线中文字幕| 国产亚洲一区字幕| 精品久久久久久亚洲综合网 | 不卡大黄网站免费看| 国产九九视频一区二区三区| 日韩电影在线一区| 香港成人在线视频| 亚洲午夜三级在线| 亚洲精品少妇30p| 成人欧美一区二区三区1314| 国产日本欧洲亚洲| 久久久欧美精品sm网站| 精品福利一区二区三区| 欧美成人福利视频| 日韩一区二区在线看| 欧美日本在线一区| 精品污污网站免费看| 欧美在线一二三四区| 一本色道**综合亚洲精品蜜桃冫| av在线不卡免费看| 不卡一区二区中文字幕| 成人在线综合网| 高清视频一区二区| 成人综合在线观看| 成人av影视在线观看| 成人av在线看| 99re在线精品| 一本到不卡精品视频在线观看| 94-欧美-setu| 99re8在线精品视频免费播放| 成人av影院在线| 91麻豆.com| 色综合天天综合狠狠| 在线中文字幕一区二区| 欧亚一区二区三区| 欧美日韩免费观看一区二区三区| 欧美亚洲自拍偷拍| 555www色欧美视频| 欧美mv日韩mv国产网站app| 久久一区二区三区四区| 久久久www成人免费毛片麻豆| 国产农村妇女精品| 国产精品传媒视频| 一区二区高清免费观看影视大全| 亚洲一二三专区| 日韩国产精品久久久| 免费观看成人av| 国产在线播放一区三区四| 国产.欧美.日韩| 色综合一个色综合亚洲| 欧美三日本三级三级在线播放| 在线观看91精品国产麻豆| 欧美电视剧免费观看| 国产午夜精品一区二区三区四区| 国产精品欧美久久久久无广告| 亚洲天堂中文字幕| 午夜影院在线观看欧美| 九九精品视频在线看| 国产.精品.日韩.另类.中文.在线.播放| 成人avav影音| 精品视频在线免费看| 欧美一级黄色片| 国产视频一区二区在线观看| 亚洲视频资源在线| 亚洲成人av一区二区三区| 久久se精品一区二区| 白白色 亚洲乱淫| 欧美视频在线播放| 337p粉嫩大胆色噜噜噜噜亚洲| 国产精品午夜在线| 亚洲高清免费在线| 国产一区二区视频在线| 91免费精品国自产拍在线不卡| 51午夜精品国产| 欧美国产日本韩|