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

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

?? mem.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
字號:
/* *  linux/kernel/chr_drv/mem.c * *  Copyright (C) 1991, 1992  Linus Torvalds */#include <linux/config.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/tty.h>#include <linux/mouse.h>#include <linux/tpqic02.h>#include <linux/malloc.h>#include <linux/mman.h>#include <asm/segment.h>#include <asm/io.h>#ifdef CONFIG_SOUNDextern long soundcard_init(long mem_start);#endifstatic int read_ram(struct inode * inode, struct file * file,char * buf, int count){	return -EIO;}static int write_ram(struct inode * inode, struct file * file,char * buf, int count){	return -EIO;}static int read_mem(struct inode * inode, struct file * file,char * buf, int count){	unsigned long p = file->f_pos;	int read;	if (count < 0)		return -EINVAL;	if (p >= high_memory)		return 0;	if (count > high_memory - p)		count = high_memory - p;	read = 0;	while (p < PAGE_SIZE && count > 0) {		put_fs_byte(0,buf);		buf++;		p++;		count--;		read++;	}	memcpy_tofs(buf,(void *) p,count);	read += count;	file->f_pos += read;	return read;}static int write_mem(struct inode * inode, struct file * file,char * buf, int count){	unsigned long p = file->f_pos;	int written;	if (count < 0)		return -EINVAL;	if (p >= high_memory)		return 0;	if (count > high_memory - p)		count = high_memory - p;	written = 0;	while (p < PAGE_SIZE && count > 0) {		/* Hmm. Do something? */		buf++;		p++;		count--;		written++;	}	memcpy_fromfs((void *) p,buf,count);	written += count;	file->f_pos += written;	return count;}static int mmap_mem(struct inode * inode, struct file * file,	unsigned long addr, size_t len, int prot, unsigned long off){	struct vm_area_struct * mpnt;	if (off & 0xfff || off + len < off)		return -ENXIO;	if (x86 > 3 && off >= high_memory)		prot |= PAGE_PCD;	if (remap_page_range(addr, off, len, prot))		return -EAGAIN;/* try to create a dummy vmm-structure so that the rest of the kernel knows we are here */	mpnt = (struct vm_area_struct * ) kmalloc(sizeof(struct vm_area_struct), GFP_KERNEL);	if (!mpnt)		return 0;	mpnt->vm_task = current;	mpnt->vm_start = addr;	mpnt->vm_end = addr + len;	mpnt->vm_page_prot = prot;	mpnt->vm_share = NULL;	mpnt->vm_inode = inode;	inode->i_count++;	mpnt->vm_offset = off;	mpnt->vm_ops = NULL;	insert_vm_struct(current, mpnt);	merge_segments(current->mmap, NULL, NULL);	return 0;}static int read_kmem(struct inode *inode, struct file *file, char *buf, int count){	int read1, read2;	read1 = read_mem(inode, file, buf, count);	if (read1 < 0)		return read1;	read2 = vread(buf + read1, (char *) file->f_pos, count - read1);	if (read2 < 0)		return read2;	file->f_pos += read2;	return read1 + read2;}static int read_port(struct inode * inode,struct file * file,char * buf, int count){	unsigned int i = file->f_pos;	char * tmp = buf;	while (count-- > 0 && i < 65536) {		put_fs_byte(inb(i),tmp);		i++;		tmp++;	}	file->f_pos = i;	return tmp-buf;}static int write_port(struct inode * inode,struct file * file,char * buf, int count){	unsigned int i = file->f_pos;	char * tmp = buf;	while (count-- > 0 && i < 65536) {		outb(get_fs_byte(tmp),i);		i++;		tmp++;	}	file->f_pos = i;	return tmp-buf;}static int read_null(struct inode * node,struct file * file,char * buf,int count){	return 0;}static int write_null(struct inode * inode,struct file * file,char * buf, int count){	return count;}static int read_zero(struct inode * node,struct file * file,char * buf,int count){	int left;	for (left = count; left > 0; left--) {		put_fs_byte(0,buf);		buf++;	}	return count;}static int mmap_zero(struct inode * inode, struct file * file,	unsigned long addr, size_t len, int prot, unsigned long off){	struct vm_area_struct *mpnt;	if (prot & PAGE_RW)		return -EINVAL;	if (zeromap_page_range(addr, len, prot))		return -EAGAIN;	/*	 * try to create a dummy vmm-structure so that the	 * rest of the kernel knows we are here	 */	mpnt = (struct vm_area_struct *)kmalloc(sizeof(*mpnt), GFP_KERNEL);	if (!mpnt)		return 0;	mpnt->vm_task = current;	mpnt->vm_start = addr;	mpnt->vm_end = addr + len;	mpnt->vm_page_prot = prot;	mpnt->vm_share = NULL;	mpnt->vm_inode = NULL;	mpnt->vm_offset = off;	mpnt->vm_ops = NULL;	insert_vm_struct(current, mpnt);	merge_segments(current->mmap, ignoff_mergep, inode);	return 0;}static int read_full(struct inode * node,struct file * file,char * buf,int count){	return count;}static int write_full(struct inode * inode,struct file * file,char * buf, int count){	return -ENOSPC;}/* * Special lseek() function for /dev/null and /dev/zero.  Most notably, you can fopen() * both devices with "a" now.  This was previously impossible.  SRB. */static int null_lseek(struct inode * inode, struct file * file, off_t offset, int orig){	return file->f_pos=0;}/* * The memory devices use the full 32 bits of the offset, and so we cannot * check against negative addresses: they are ok. The return value is weird, * though, in that case (0). * * also note that seeking relative to the "end of file" isn't supported: * it has no meaning, so it returns -EINVAL. */static int memory_lseek(struct inode * inode, struct file * file, off_t offset, int orig){	switch (orig) {		case 0:			file->f_pos = offset;			return file->f_pos;		case 1:			file->f_pos += offset;			return file->f_pos;		default:			return -EINVAL;	}	if (file->f_pos < 0)		return 0;	return file->f_pos;}#define write_kmem	write_mem#define mmap_kmem	mmap_mem#define zero_lseek	null_lseek#define write_zero	write_nullstatic struct file_operations ram_fops = {	memory_lseek,	read_ram,	write_ram,	NULL,		/* ram_readdir */	NULL,		/* ram_select */	NULL,		/* ram_ioctl */	NULL,		/* ram_mmap */	NULL,		/* no special open code */	NULL,		/* no special release code */	NULL		/* fsync */};static struct file_operations mem_fops = {	memory_lseek,	read_mem,	write_mem,	NULL,		/* mem_readdir */	NULL,		/* mem_select */	NULL,		/* mem_ioctl */	mmap_mem,	NULL,		/* no special open code */	NULL,		/* no special release code */	NULL		/* fsync */};static struct file_operations kmem_fops = {	memory_lseek,	read_kmem,	write_kmem,	NULL,		/* kmem_readdir */	NULL,		/* kmem_select */	NULL,		/* kmem_ioctl */	mmap_kmem,	NULL,		/* no special open code */	NULL,		/* no special release code */	NULL		/* fsync */};static struct file_operations null_fops = {	null_lseek,	read_null,	write_null,	NULL,		/* null_readdir */	NULL,		/* null_select */	NULL,		/* null_ioctl */	NULL,		/* null_mmap */	NULL,		/* no special open code */	NULL,		/* no special release code */	NULL		/* fsync */};static struct file_operations port_fops = {	memory_lseek,	read_port,	write_port,	NULL,		/* port_readdir */	NULL,		/* port_select */	NULL,		/* port_ioctl */	NULL,		/* port_mmap */	NULL,		/* no special open code */	NULL,		/* no special release code */	NULL		/* fsync */};static struct file_operations zero_fops = {	zero_lseek,	read_zero,	write_zero,	NULL,		/* zero_readdir */	NULL,		/* zero_select */	NULL,		/* zero_ioctl */	mmap_zero,	NULL,		/* no special open code */	NULL		/* no special release code */};static struct file_operations full_fops = {	memory_lseek,	read_full,	write_full,	NULL,		/* full_readdir */	NULL,		/* full_select */	NULL,		/* full_ioctl */		NULL,		/* full_mmap */	NULL,		/* no special open code */	NULL		/* no special release code */};static int memory_open(struct inode * inode, struct file * filp){	switch (MINOR(inode->i_rdev)) {		case 0:			filp->f_op = &ram_fops;			break;		case 1:			filp->f_op = &mem_fops;			break;		case 2:			filp->f_op = &kmem_fops;			break;		case 3:			filp->f_op = &null_fops;			break;		case 4:			filp->f_op = &port_fops;			break;		case 5:			filp->f_op = &zero_fops;			break;		case 7:			filp->f_op = &full_fops;			break;		default:			return -ENODEV;	}	if (filp->f_op && filp->f_op->open)		return filp->f_op->open(inode,filp);	return 0;}static struct file_operations memory_fops = {	NULL,		/* lseek */	NULL,		/* read */	NULL,		/* write */	NULL,		/* readdir */	NULL,		/* select */	NULL,		/* ioctl */	NULL,		/* mmap */	memory_open,	/* just a selector for the real open */	NULL,		/* release */	NULL		/* fsync */};#ifdef CONFIG_FTAPEchar* ftape_big_buffer;#endiflong chr_dev_init(long mem_start, long mem_end){	if (register_chrdev(MEM_MAJOR,"mem",&memory_fops))		printk("unable to get major %d for memory devs\n", MEM_MAJOR);	mem_start = tty_init(mem_start);#ifdef CONFIG_PRINTER	mem_start = lp_init(mem_start);#endif#if defined (CONFIG_BUSMOUSE) || defined (CONFIG_82C710_MOUSE) || \    defined (CONFIG_PSMOUSE) || defined (CONFIG_MS_BUSMOUSE) || \    defined (CONFIG_ATIXL_BUSMOUSE)	mem_start = mouse_init(mem_start);#endif#ifdef CONFIG_SOUND	mem_start = soundcard_init(mem_start);#endif#if CONFIG_TAPE_QIC02	mem_start = tape_qic02_init(mem_start);#endif/* *      Rude way to allocate kernel memory buffer for tape device */#ifdef CONFIG_FTAPE        /* allocate NR_FTAPE_BUFFERS 32Kb buffers at aligned address */        ftape_big_buffer= (char*) ((mem_start + 0x7fff) & ~0x7fff);        printk( "ftape: allocated %d buffers alligned at: %p\n",               NR_FTAPE_BUFFERS, ftape_big_buffer);        mem_start = (long) ftape_big_buffer + NR_FTAPE_BUFFERS * 0x8000;#endif 	return mem_start;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人深夜福利app| 欧美日韩一区在线| 蜜桃在线一区二区三区| 国产精品剧情在线亚洲| 日韩欧美黄色影院| 色美美综合视频| 国产精品亚洲一区二区三区在线| 亚洲午夜精品17c| 国产精品色婷婷| 久久久一区二区三区捆绑**| 欧美日韩亚洲另类| 91论坛在线播放| 成人高清免费在线播放| 久久99精品久久久久久动态图| 亚洲影院免费观看| 国产精品毛片大码女人| 国产亚洲欧洲一区高清在线观看| 欧美日韩中文字幕精品| 色婷婷精品大在线视频| 成人福利在线看| 国产精品香蕉一区二区三区| 精品亚洲成a人在线观看| 天天色天天操综合| 亚洲一区二区精品久久av| 成人涩涩免费视频| 日本亚洲天堂网| 樱桃视频在线观看一区| 蜜臂av日日欢夜夜爽一区| 亚洲综合网站在线观看| 国产精品久久看| 久久久久99精品国产片| 精品少妇一区二区三区免费观看 | 美女视频网站黄色亚洲| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品久久久久国产精品日日| 久久综合久久综合久久| 日韩一级二级三级精品视频| 69成人精品免费视频| 91精品午夜视频| 日韩色在线观看| 精品成人一区二区三区| 久久亚洲综合av| 欧美国产精品v| 国产精品天干天干在观线| 成人免费小视频| 亚洲麻豆国产自偷在线| 亚洲成人av福利| 日本欧美韩国一区三区| 免费欧美日韩国产三级电影| 久久国产三级精品| 国产精品综合视频| 成人免费看片app下载| 99精品欧美一区二区三区小说| 91国偷自产一区二区三区观看| 欧美在线制服丝袜| 欧美一区二区三区视频在线 | 日韩电影免费一区| 久久av资源站| 成人黄动漫网站免费app| 日本久久电影网| 在线不卡中文字幕| 久久天天做天天爱综合色| 中文字幕永久在线不卡| 亚洲国产精品一区二区久久恐怖片| 三级影片在线观看欧美日韩一区二区| 人人精品人人爱| 成人午夜短视频| 欧美性感一区二区三区| 欧美精品一区二区三区久久久 | 国产精品久久国产精麻豆99网站| 亚洲精品日日夜夜| 毛片一区二区三区| av爱爱亚洲一区| 这里只有精品免费| 国产精品麻豆久久久| 香蕉久久夜色精品国产使用方法| 久久精品国产澳门| 欧美一区在线视频| 国产欧美中文在线| 一区二区欧美在线观看| 精品午夜一区二区三区在线观看| bt7086福利一区国产| 51精品国自产在线| 国产精品日韩成人| 天堂成人国产精品一区| 成人免费毛片片v| 91精品国产综合久久婷婷香蕉| 国产精品午夜免费| 人人精品人人爱| 色综合久久久网| 26uuu国产日韩综合| 亚洲动漫第一页| 不卡视频一二三| 精品国产免费久久| 香蕉av福利精品导航| www.色精品| 精品国产乱码91久久久久久网站| 亚洲人成精品久久久久| 国产激情一区二区三区四区 | 日本高清不卡一区| 久久久精品国产免费观看同学| 亚洲成人免费视| 91在线看国产| 国产欧美日韩视频一区二区| 琪琪久久久久日韩精品| 91国内精品野花午夜精品| 国产日本欧美一区二区| 黄页网站大全一区二区| 7777精品伊人久久久大香线蕉超级流畅| 日本一区二区三区高清不卡| 久久成人免费日本黄色| 在线观看亚洲专区| 亚洲情趣在线观看| 成人黄色免费短视频| 欧美极品少妇xxxxⅹ高跟鞋| 久久精品国产精品亚洲红杏| 337p亚洲精品色噜噜噜| 亚洲一区二区在线观看视频| 色诱亚洲精品久久久久久| 中文字幕免费不卡| 国产a精品视频| 久久精品视频在线看| 国产麻豆精品95视频| 亚洲精品在线免费播放| 久久99精品国产91久久来源 | 亚洲人快播电影网| av午夜精品一区二区三区| 国产精品伦理一区二区| 成人美女视频在线观看18| 国产精品人成在线观看免费| 福利电影一区二区| 国产女同性恋一区二区| 成人涩涩免费视频| 成人免费一区二区三区在线观看| 成人激情午夜影院| 亚洲欧美一区二区三区国产精品| 99精品久久99久久久久| 一区二区三区精密机械公司| 色88888久久久久久影院野外| 亚洲你懂的在线视频| 欧美综合欧美视频| 丝袜美腿成人在线| 日韩一卡二卡三卡| 日本高清不卡在线观看| 有码一区二区三区| 欧美视频在线观看一区| 午夜激情一区二区三区| 欧美一级免费观看| 麻豆成人免费电影| 久久先锋资源网| 99国产精品国产精品毛片| 亚洲欧美日韩久久精品| 色噜噜狠狠一区二区三区果冻| 亚洲午夜羞羞片| 日韩欧美你懂的| 国产成人综合亚洲91猫咪| 最新日韩在线视频| 欧美在线观看视频一区二区三区| 视频一区视频二区中文字幕| 777奇米四色成人影色区| 久久精品国产99久久6| 亚洲国产精品精华液2区45| 91丨九色丨尤物| 亚洲午夜精品一区二区三区他趣| 日韩欧美国产高清| 国产成人av在线影院| 亚洲精品久久嫩草网站秘色| 欧美日韩综合一区| 国产精品主播直播| 亚洲欧美日韩国产综合在线| 69精品人人人人| 丁香桃色午夜亚洲一区二区三区| 亚洲欧美日韩综合aⅴ视频| 91精品国产综合久久久久久久| 久久精品国产精品亚洲综合| 亚洲天天做日日做天天谢日日欢| 欧美人妇做爰xxxⅹ性高电影| 国产精品一级片| 午夜伦理一区二区| 国产蜜臀av在线一区二区三区| 在线观看日韩国产| 国产精品一区二区三区四区 | 亚洲欧美日韩综合aⅴ视频| 欧美精品一卡两卡| 成人黄色免费短视频| 日本系列欧美系列| 136国产福利精品导航| 日韩女优毛片在线| 色综合av在线| 国产精品一区二区三区乱码| 亚洲成人综合视频| 国产精品久久久久三级| 伊人开心综合网| 欧美mv日韩mv国产| 欧美性生活一区| 福利一区福利二区| 久久成人免费电影| 亚洲国产cao| 亚洲九九爱视频| 中文字幕国产一区二区|