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

📄 array.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 2 页
字号:
		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;}		static 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;		++*pages;		if (pte_dirty(page))			++*dirty;		ptpage = pte_page(page);		if ((!VALID_PAGE(ptpage)) || 					PageReserved(ptpage))			continue;		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++;	}}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) {		struct vm_area_struct * vma;		down(&mm->mmap_sem);		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;		}		up(&mm->mmap_sem);		mmput(mm);	}	return sprintf(buffer,"%d %d %d %d %d %d %d\n",		       size, resident, share, trs, lrs, drs, dt);}/* * 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. */#define MAPS_LINE_LENGTH	4096#define MAPS_LINE_SHIFT		12/* * f_pos = (number of the vma in the task->mm->mmap list) * MAPS_LINE_LENGTH *         + (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_MAX	MAPS_LINE_MAX8ssize_t proc_pid_read_maps (struct task_struct *task, struct file * file, char * buf,			  size_t count, loff_t *ppos){	struct mm_struct *mm;	struct vm_area_struct * map, * next;	char * destptr = buf, * buffer;	loff_t lineno;	ssize_t column, i;	int volatile_task;	long retval;	/*	 * We might sleep getting the page, so get it first.	 */	retval = -ENOMEM;	buffer = (char*)__get_free_page(GFP_KERNEL);	if (!buffer)		goto out;	if (count == 0)		goto getlen_out;	task_lock(task);	mm = task->mm;	if (mm)		atomic_inc(&mm->mm_users);	task_unlock(task);	if (!mm)		goto getlen_out;	/* Check whether the mmaps could change if we sleep */	volatile_task = (task != current || atomic_read(&mm->mm_users) > 2);	/* decode f_pos */	lineno = *ppos >> MAPS_LINE_SHIFT;	column = *ppos & (MAPS_LINE_LENGTH-1);	/* quickly go to line lineno */	down(&mm->mmap_sem);	for (map = mm->mmap, i = 0; map && (i < lineno); map = map->vm_next, i++)		continue;	for ( ; map ; map = next ) {		/* produce the next line */		char *line;		char str[5], *cp = str;		int flags;		kdev_t dev;		unsigned long ino;		int maxlen = (sizeof(void*) == 4) ?			MAPS_LINE_MAX4 :  MAPS_LINE_MAX8;		int len;		/*		 * Get the next vma now (but it won't be used if we sleep).		 */		next = map->vm_next;		flags = map->vm_flags;		*cp++ = flags & VM_READ ? 'r' : '-';		*cp++ = flags & VM_WRITE ? 'w' : '-';		*cp++ = flags & VM_EXEC ? 'x' : '-';		*cp++ = flags & VM_MAYSHARE ? 's' : 'p';		*cp++ = 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,				      buffer, PAGE_SIZE);			buffer[PAGE_SIZE-1] = '\n';			line -= maxlen;			if(line < buffer)				line = buffer;		} else			line = buffer;		len = sprintf(line,			      sizeof(void*) == 4 ? MAPS_LINE_FORMAT4 : MAPS_LINE_FORMAT8,			      map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT,			      kdevname(dev), ino);		if(map->vm_file) {			for(i = len; i < maxlen; i++)				line[i] = ' ';			len = buffer + PAGE_SIZE - line;		} else			line[len++] = '\n';		if (column >= len) {			column = 0; /* continue with next line at column 0 */			lineno++;			continue; /* we haven't slept */		}		i = len-column;		if (i > count)			i = count;		up(&mm->mmap_sem);		copy_to_user(destptr, line+column, i); /* may have slept */		down(&mm->mmap_sem);		destptr += i;		count   -= i;		column  += i;		if (column >= len) {			column = 0; /* next time: next line at column 0 */			lineno++;		}		/* done? */		if (count == 0)			break;		/* By writing to user space, we might have slept.		 * Stop the loop, to avoid a race condition.		 */		if (volatile_task)			break;	}	up(&mm->mmap_sem);	/* encode f_pos */	*ppos = (lineno << MAPS_LINE_SHIFT) + column;	mmput(mm);getlen_out:	retval = destptr - buf;	free_page((unsigned long)buffer);out:	return retval;}#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 + -