⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mem.c

📁 linux和2410结合开发 用他可以生成2410所需的zImage文件
💻 C
📖 第 1 页 / 共 2 页
字号:
	*ppos = i;	return tmp-buf;}static ssize_t write_port(struct file * file, const char * buf,			  size_t count, loff_t *ppos){	unsigned long i = *ppos;	const char * tmp = buf;	if (verify_area(VERIFY_READ,buf,count))		return -EFAULT;	while (count-- > 0 && i < 65536) {		char c;		if (__get_user(c, tmp)) 			return -EFAULT; 		outb(c,i);		i++;		tmp++;	}	*ppos = i;	return tmp-buf;}#endifstatic ssize_t read_null(struct file * file, char * buf,			 size_t count, loff_t *ppos){	return 0;}static ssize_t write_null(struct file * file, const char * buf,			  size_t count, loff_t *ppos){	return count;}/* * For fun, we are using the MMU for this. */static inline size_t read_zero_pagealigned(char * buf, size_t size){	struct mm_struct *mm;	struct vm_area_struct * vma;	unsigned long addr=(unsigned long)buf;	mm = current->mm;	/* Oops, this was forgotten before. -ben */	down_read(&mm->mmap_sem);	/* For private mappings, just map in zero pages. */	for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {		unsigned long count;		if (vma->vm_start > addr || (vma->vm_flags & VM_WRITE) == 0)			goto out_up;		if (vma->vm_flags & VM_SHARED)			break;		count = vma->vm_end - addr;		if (count > size)			count = size;		zap_page_range(mm, addr, count);        	zeromap_page_range(addr, count, PAGE_COPY);		size -= count;		buf += count;		addr += count;		if (size == 0)			goto out_up;	}	up_read(&mm->mmap_sem);		/* The shared case is hard. Let's do the conventional zeroing. */ 	do {		unsigned long unwritten = clear_user(buf, PAGE_SIZE);		if (unwritten)			return size + unwritten - PAGE_SIZE;		if (current->need_resched)			schedule();		buf += PAGE_SIZE;		size -= PAGE_SIZE;	} while (size);	return size;out_up:	up_read(&mm->mmap_sem);	return size;}static ssize_t read_zero(struct file * file, char * buf, 			 size_t count, loff_t *ppos){	unsigned long left, unwritten, written = 0;	if (!count)		return 0;	if (!access_ok(VERIFY_WRITE, buf, count))		return -EFAULT;	left = count;	/* do we want to be clever? Arbitrary cut-off */	if (count >= PAGE_SIZE*4) {		unsigned long partial;		/* How much left of the page? */		partial = (PAGE_SIZE-1) & -(unsigned long) buf;		unwritten = clear_user(buf, partial);		written = partial - unwritten;		if (unwritten)			goto out;		left -= partial;		buf += partial;		unwritten = read_zero_pagealigned(buf, left & PAGE_MASK);		written += (left & PAGE_MASK) - unwritten;		if (unwritten)			goto out;		buf += left & PAGE_MASK;		left &= ~PAGE_MASK;	}	unwritten = clear_user(buf, left);	written += left - unwritten;out:	return written ? written : -EFAULT;}static int mmap_zero(struct file * file, struct vm_area_struct * vma){	if (vma->vm_flags & VM_SHARED)		return shmem_zero_setup(vma);	if (zeromap_page_range(vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))		return -EAGAIN;	return 0;}static ssize_t write_full(struct file * file, const char * buf,			  size_t count, loff_t *ppos){	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 loff_t null_lseek(struct file * file, loff_t offset, int orig){	return file->f_pos = 0;}/* * The memory devices use the full 32/64 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 loff_t memory_lseek(struct file * file, loff_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;	}}static int open_port(struct inode * inode, struct file * filp){	return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;}#define mmap_kmem	mmap_mem#define zero_lseek	null_lseek#define full_lseek      null_lseek#define write_zero	write_null#define read_full       read_zero#define open_mem	open_port#define open_kmem	open_memstatic struct file_operations mem_fops = {	llseek:		memory_lseek,	read:		read_mem,	write:		write_mem,	mmap:		mmap_mem,	open:		open_mem,};static struct file_operations kmem_fops = {	llseek:		memory_lseek,	read:		read_kmem,	write:		write_kmem,	mmap:		mmap_kmem,	open:		open_kmem,};static struct file_operations null_fops = {	llseek:		null_lseek,	read:		read_null,	write:		write_null,};#if !defined(__mc68000__)static struct file_operations port_fops = {	llseek:		memory_lseek,	read:		read_port,	write:		write_port,	open:		open_port,};#endifstatic struct file_operations zero_fops = {	llseek:		zero_lseek,	read:		read_zero,	write:		write_zero,	mmap:		mmap_zero,};static struct file_operations full_fops = {	llseek:		full_lseek,	read:		read_full,	write:		write_full,};static int memory_open(struct inode * inode, struct file * filp){	switch (MINOR(inode->i_rdev)) {		case 1:			filp->f_op = &mem_fops;			break;		case 2:			filp->f_op = &kmem_fops;			break;		case 3:			filp->f_op = &null_fops;			break;#if !defined(__mc68000__)		case 4:			filp->f_op = &port_fops;			break;#endif		case 5:			filp->f_op = &zero_fops;			break;		case 7:			filp->f_op = &full_fops;			break;		case 8:			filp->f_op = &random_fops;			break;		case 9:			filp->f_op = &urandom_fops;			break;		default:			return -ENXIO;	}	if (filp->f_op && filp->f_op->open)		return filp->f_op->open(inode,filp);	return 0;}void __init memory_devfs_register (void){    /*  These are never unregistered  */    static const struct {	unsigned short minor;	char *name;	umode_t mode;	struct file_operations *fops;    } list[] = { /* list of minor devices */	{1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},	{2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},	{3, "null",    S_IRUGO | S_IWUGO,           &null_fops},	{4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},	{5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},	{7, "full",    S_IRUGO | S_IWUGO,           &full_fops},	{8, "random",  S_IRUGO | S_IWUSR,           &random_fops},	{9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops}    };    int i;    for (i=0; i<(sizeof(list)/sizeof(*list)); i++)	devfs_register (NULL, list[i].name, DEVFS_FL_NONE,			MEM_MAJOR, list[i].minor,			list[i].mode | S_IFCHR,			list[i].fops, NULL);}static struct file_operations memory_fops = {	open:		memory_open,	/* just a selector for the real open */};int __init chr_dev_init(void){	if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))		printk("unable to get major %d for memory devs\n", MEM_MAJOR);	memory_devfs_register();	rand_initialize();#if defined (CONFIG_FB)	fbmem_init();#endif#if defined (CONFIG_PROM_CONSOLE)	prom_con_init();#endif#if defined (CONFIG_MDA_CONSOLE)	mda_console_init();#endif	tty_init();#ifdef CONFIG_M68K_PRINTER	lp_m68k_init();#endif	misc_init();#if CONFIG_QIC02_TAPE	qic02_tape_init();#endif#ifdef CONFIG_FTAPE	ftape_init();#endif#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)	tapechar_init();#endif	return 0;}__initcall(chr_dev_init);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -