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

📄 array.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* to make it look like a "normal" Unix priority/nice value  */	priority = task->counter;	priority = 20 - (priority * 10 + DEF_COUNTER / 2) / DEF_COUNTER;	nice = task->nice;	read_lock(&tasklist_lock);	ppid = task->pid ? task->p_opptr->pid : 0;	read_unlock(&tasklist_lock);	res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \%lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu \%lu %lu %lu %lu %lu %lu %lu %lu %d %d\n",		task->pid,		task->comm,		state,		ppid,		task->pgrp,		task->session,	        tty_nr,		tty_pgrp,		task->flags,		task->min_flt,		task->cmin_flt,		task->maj_flt,		task->cmaj_flt,		task->times.tms_utime,		task->times.tms_stime,		task->times.tms_cutime,		task->times.tms_cstime,		priority,		nice,		0UL /* removed */,		task->it_real_value,		task->start_time,		vsize,		mm ? mm->rss : 0, /* you might want to shift this left 3 */		task->rlim[RLIMIT_RSS].rlim_cur,		mm ? mm->start_code : 0,		mm ? mm->end_code : 0,		mm ? mm->start_stack : 0,		esp,		eip,		/* The signal information here is obsolete.		 * It must be decimal for Linux 2.0 compatibility.		 * Use /proc/#/status for real-time signals.		 */		task->pending.signal.sig[0] & 0x7fffffffUL,		task->blocked.sig[0] & 0x7fffffffUL,		sigign      .sig[0] & 0x7fffffffUL,		sigcatch    .sig[0] & 0x7fffffffUL,		wchan,		task->nswap,		task->cnswap,		task->exit_signal,		task->processor);	if(mm)		mmput(mm);	return res;}		#ifndef NO_MMstatic inline void statm_pte_range(pmd_t * pmd, unsigned long address, unsigned long size,	int * pages, int * shared, int * dirty, int * total){	pte_t * pte;	unsigned long end;	if (pmd_none(*pmd))		return;	if (pmd_bad(*pmd)) {		pmd_ERROR(*pmd);		pmd_clear(pmd);		return;	}	pte = pte_offset(pmd, address);	address &= ~PMD_MASK;	end = address + size;	if (end > PMD_SIZE)		end = PMD_SIZE;	do {		pte_t page = *pte;		struct page *ptpage;		address += PAGE_SIZE;		pte++;		if (pte_none(page))			continue;		++*total;		if (!pte_present(page))			continue;		ptpage = pte_page(page);		if ((!VALID_PAGE(ptpage)) || PageReserved(ptpage))			continue;		++*pages;		if (pte_dirty(page))			++*dirty;		if (page_count(pte_page(page)) > 1)			++*shared;	} while (address < end);}static inline void statm_pmd_range(pgd_t * pgd, unsigned long address, unsigned long size,	int * pages, int * shared, int * dirty, int * total){	pmd_t * pmd;	unsigned long end;	if (pgd_none(*pgd))		return;	if (pgd_bad(*pgd)) {		pgd_ERROR(*pgd);		pgd_clear(pgd);		return;	}	pmd = pmd_offset(pgd, address);	address &= ~PGDIR_MASK;	end = address + size;	if (end > PGDIR_SIZE)		end = PGDIR_SIZE;	do {		statm_pte_range(pmd, address, end - address, pages, shared, dirty, total);		address = (address + PMD_SIZE) & PMD_MASK;		pmd++;	} while (address < end);}static void statm_pgd_range(pgd_t * pgd, unsigned long address, unsigned long end,	int * pages, int * shared, int * dirty, int * total){	while (address < end) {		statm_pmd_range(pgd, address, end - address, pages, shared, dirty, total);		address = (address + PGDIR_SIZE) & PGDIR_MASK;		pgd++;	}}#endif /* !NO_MM */int proc_pid_statm(struct task_struct *task, char * buffer){	struct mm_struct *mm;	int size=0, resident=0, share=0, trs=0, lrs=0, drs=0, dt=0;	task_lock(task);	mm = task->mm;	if(mm)		atomic_inc(&mm->mm_users);	task_unlock(task);	if (mm) {#ifndef NO_MM		struct vm_area_struct * vma;#endif		down_read(&mm->mmap_sem);#ifndef NO_MM		vma = mm->mmap;		while (vma) {			pgd_t *pgd = pgd_offset(mm, vma->vm_start);			int pages = 0, shared = 0, dirty = 0, total = 0;			statm_pgd_range(pgd, vma->vm_start, vma->vm_end, &pages, &shared, &dirty, &total);			resident += pages;			share += shared;			dt += dirty;			size += total;			if (vma->vm_flags & VM_EXECUTABLE)				trs += pages;	/* text */			else if (vma->vm_flags & VM_GROWSDOWN)				drs += pages;	/* stack */			else if (vma->vm_end > 0x60000000)				lrs += pages;	/* library */			else				drs += pages;			vma = vma->vm_next;		}#else /* !NO_MM */		/* DAVIDM - may be able to clean this up a bit */		{			struct mm_tblock_struct *tbp = &mm->tblock;			size += ksize(mm);			while (tbp) {				if (tbp->next)					size += ksize(tbp->next);				if (tbp->rblock) {					size += ksize(tbp->rblock);					size += ksize(tbp->rblock->kblock);					if (atomic_read(&mm->mm_count) > 1 ||							(tbp->rblock->refcount > 1))						share += tbp->rblock->size;				}				tbp = tbp->next;			}			size += (trs = mm->end_code - mm->start_code);			size += (drs = mm->start_stack - mm->start_data);			dt  = 0;			lrs = 0;			resident = size;		}#endif /* !NO_MM */		up_read(&mm->mmap_sem);		mmput(mm);	}	return sprintf(buffer,"%d %d %d %d %d %d %d\n",		       size, resident, share, trs, lrs, drs, dt);}#ifndef NO_MM/* * The way we support synthetic files > 4K * - without storing their contents in some buffer and * - without walking through the entire synthetic file until we reach the *   position of the requested data * is to cleverly encode the current position in the file's f_pos field. * There is no requirement that a read() call which returns `count' bytes * of data increases f_pos by exactly `count'. * * This idea is Linus' one. Bruno implemented it. *//* * For the /proc/<pid>/maps file, we use fixed length records, each containing * a single line. * * f_pos = (number of the vma in the task->mm->mmap list) * PAGE_SIZE *         + (index into the line) *//* for systems with sizeof(void*) == 4: */#define MAPS_LINE_FORMAT4	  "%08lx-%08lx %s %08lx %s %lu"#define MAPS_LINE_MAX4	49 /* sum of 8  1  8  1 4 1 8 1 5 1 10 1 *//* for systems with sizeof(void*) == 8: */#define MAPS_LINE_FORMAT8	  "%016lx-%016lx %s %016lx %s %lu"#define MAPS_LINE_MAX8	73 /* sum of 16  1  16  1 4 1 16 1 5 1 10 1 */#define MAPS_LINE_FORMAT	(sizeof(void*) == 4 ? MAPS_LINE_FORMAT4 : MAPS_LINE_FORMAT8)#define MAPS_LINE_MAX	(sizeof(void*) == 4 ?  MAPS_LINE_MAX4 :  MAPS_LINE_MAX8)static int proc_pid_maps_get_line (char *buf, struct vm_area_struct *map){	/* produce the next line */	char *line;	char str[5];	int flags;	kdev_t dev;	unsigned long ino;	int len;	flags = map->vm_flags;	str[0] = flags & VM_READ ? 'r' : '-';	str[1] = flags & VM_WRITE ? 'w' : '-';	str[2] = flags & VM_EXEC ? 'x' : '-';	str[3] = flags & VM_MAYSHARE ? 's' : 'p';	str[4] = 0;	dev = 0;	ino = 0;	if (map->vm_file != NULL) {		dev = map->vm_file->f_dentry->d_inode->i_dev;		ino = map->vm_file->f_dentry->d_inode->i_ino;		line = d_path(map->vm_file->f_dentry,			      map->vm_file->f_vfsmnt,			      buf, PAGE_SIZE);		buf[PAGE_SIZE-1] = '\n';		line -= MAPS_LINE_MAX;		if(line < buf)			line = buf;	} else		line = buf;	len = sprintf(line,		      MAPS_LINE_FORMAT,		      map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,		      kdevname(dev), ino);	if(map->vm_file) {		int i;		for(i = len; i < MAPS_LINE_MAX; i++)			line[i] = ' ';		len = buf + PAGE_SIZE - line;		memmove(buf, line, len);	} else		line[len++] = '\n';	return len;}#endif /* NO_MM */ssize_t proc_pid_read_maps (struct task_struct *task, struct file * file, char * buf,			  size_t count, loff_t *ppos){#ifndef NO_MM	struct mm_struct *mm;	struct vm_area_struct * map;	char *tmp, *kbuf;	long retval;	int off, lineno, loff;	/* reject calls with out of range parameters immediately */	retval = 0;	if (*ppos > LONG_MAX)		goto out;	if (count == 0)		goto out;	off = (long)*ppos;	/*	 * We might sleep getting the page, so get it first.	 */	retval = -ENOMEM;	kbuf = (char*)__get_free_page(GFP_KERNEL);	if (!kbuf)		goto out;	tmp = (char*)__get_free_page(GFP_KERNEL);	if (!tmp)		goto out_free1;	task_lock(task);	mm = task->mm;	if (mm)		atomic_inc(&mm->mm_users);	task_unlock(task);	retval = 0;	if (!mm)		goto out_free2;	down_read(&mm->mmap_sem);	map = mm->mmap;	lineno = 0;	loff = 0;	if (count > PAGE_SIZE)		count = PAGE_SIZE;	while (map) {		int len;		if (off > PAGE_SIZE) {			off -= PAGE_SIZE;			goto next;		}		len = proc_pid_maps_get_line(tmp, map);		len -= off;		if (len > 0) {			if (retval+len > count) {				/* only partial line transfer possible */				len = count - retval;				/* save the offset where the next read				 * must start */				loff = len+off;			}			memcpy(kbuf+retval, tmp+off, len);			retval += len;		}		off = 0;next:		if (!loff)			lineno++;		if (retval >= count)			break;		if (loff) BUG();		map = map->vm_next;	}	up_read(&mm->mmap_sem);	mmput(mm);	if (retval > count) BUG();	if (copy_to_user(buf, kbuf, retval))		retval = -EFAULT;	else		*ppos = (lineno << PAGE_SHIFT) + loff;out_free2:	free_page((unsigned long)tmp);out_free1:	free_page((unsigned long)kbuf);out:	return retval;#else /* !NO_MM */	/* DAVIDM - no idea if this one is possible :-) */	return(0);#endif /* !NO_MM */}#ifdef CONFIG_SMPint proc_pid_cpu(struct task_struct *task, char * buffer){	int i, len;	len = sprintf(buffer,		"cpu  %lu %lu\n",		task->times.tms_utime,		task->times.tms_stime);			for (i = 0 ; i < smp_num_cpus; i++)		len += sprintf(buffer + len, "cpu%d %lu %lu\n",			i,			task->per_cpu_utime[cpu_logical_map(i)],			task->per_cpu_stime[cpu_logical_map(i)]);	return len;}#endif

⌨️ 快捷键说明

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