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

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

?? array.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 *  linux/fs/proc/array.c
 *
 *  Copyright (C) 1992  by Linus Torvalds
 *  based on ideas by Darren Senn
 *
 *  stat,statm extensions by Michael K. Johnson, johnsonm@stolaf.edu
 */

#include <linux/types.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/kernel_stat.h>
#include <linux/tty.h>
#include <linux/user.h>
#include <linux/a.out.h>
#include <linux/string.h>
#include <linux/mman.h>

#include <asm/segment.h>
#include <asm/io.h>

#define LOAD_INT(x) ((x) >> FSHIFT)
#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)

#ifdef CONFIG_DEBUG_MALLOC
int get_malloc(char * buffer);
#endif

static int read_core(struct inode * inode, struct file * file,char * buf, int count)
{
	unsigned long p = file->f_pos;
	int read;
	int count1;
	char * pnt;
	struct user dump;

	memset(&dump, 0, sizeof(struct user));
	dump.magic = CMAGIC;
	dump.u_dsize = high_memory >> 12;

	if (count < 0)
		return -EINVAL;
	if (p >= high_memory + PAGE_SIZE)
		return 0;
	if (count > high_memory + PAGE_SIZE - p)
		count = high_memory + PAGE_SIZE - p;
	read = 0;

	if (p < sizeof(struct user) && count > 0) {
		count1 = count;
		if (p + count1 > sizeof(struct user))
			count1 = sizeof(struct user)-p;
		pnt = (char *) &dump + p;
		memcpy_tofs(buf,(void *) pnt, count1);
		buf += count1;
		p += count1;
		count -= count1;
		read += count1;
	}

	while (p < 2*PAGE_SIZE && count > 0) {
		put_fs_byte(0,buf);
		buf++;
		p++;
		count--;
		read++;
	}
	memcpy_tofs(buf,(void *) (p - PAGE_SIZE),count);
	read += count;
	file->f_pos += read;
	return read;
}

static int get_loadavg(char * buffer)
{
	int a, b, c;

	a = avenrun[0] + (FIXED_1/200);
	b = avenrun[1] + (FIXED_1/200);
	c = avenrun[2] + (FIXED_1/200);
	return sprintf(buffer,"%d.%02d %d.%02d %d.%02d\n",
		LOAD_INT(a), LOAD_FRAC(a),
		LOAD_INT(b), LOAD_FRAC(b),
		LOAD_INT(c), LOAD_FRAC(c));
}

static int get_kstat(char * buffer)
{
        return sprintf(buffer,	"cpu  %u %u %u %lu\n"
        			"disk %u %u %u %u\n"
        			"page %u %u\n"
        			"swap %u %u\n"
        			"intr %u\n"
        			"ctxt %u\n"
        			"btime %lu\n",
                kstat.cpu_user,
                kstat.cpu_nice,
                kstat.cpu_system,
                jiffies - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system),
                kstat.dk_drive[0],
                kstat.dk_drive[1],
                kstat.dk_drive[2],
                kstat.dk_drive[3],
                kstat.pgpgin,
                kstat.pgpgout,
                kstat.pswpin,
                kstat.pswpout,
                kstat.interrupts,
                kstat.context_swtch,
                xtime.tv_sec - jiffies / HZ);
}


static int get_uptime(char * buffer)
{
	unsigned long uptime;
	unsigned long idle;

	uptime = jiffies;
	idle = task[0]->utime + task[0]->stime;
	return sprintf(buffer,"%lu.%02lu %lu.%02lu\n",
		uptime / HZ,
		uptime % HZ,
		idle / HZ,
		idle % HZ);
}

static int get_meminfo(char * buffer)
{
	struct sysinfo i;

	si_meminfo(&i);
	si_swapinfo(&i);
	return sprintf(buffer, "        total:   used:    free:   shared:  buffers:\n"
		"Mem:  %8lu %8lu %8lu %8lu %8lu\n"
		"Swap: %8lu %8lu %8lu\n",
		i.totalram, i.totalram-i.freeram, i.freeram, i.sharedram, i.bufferram,
		i.totalswap, i.totalswap-i.freeswap, i.freeswap);
}

static int get_version(char * buffer)
{
	extern char *linux_banner;

	strcpy(buffer, linux_banner);
	return strlen(buffer);
}

static struct task_struct ** get_task(pid_t pid)
{
	struct task_struct ** p;

	p = task;
	while (++p < task+NR_TASKS) {
		if (*p && (*p)->pid == pid)
			return p;
	}
	return NULL;
}

static unsigned long get_phys_addr(struct task_struct ** p, unsigned long ptr)
{
	unsigned long page;

	if (!p || !*p || ptr >= TASK_SIZE)
		return 0;
	page = *PAGE_DIR_OFFSET((*p)->tss.cr3,ptr);
	if (!(page & 1))
		return 0;
	page &= PAGE_MASK;
	page += PAGE_PTR(ptr);
	page = *(unsigned long *) page;
	if (!(page & 1))
		return 0;
	page &= PAGE_MASK;
	page += ptr & ~PAGE_MASK;
	return page;
}

static int get_array(struct task_struct ** p, unsigned long start, unsigned long end, char * buffer)
{
	unsigned long addr;
	int size = 0, result = 0;
	char c;

	if (start >= end)
		return result;
	for (;;) {
		addr = get_phys_addr(p, start);
		if (!addr)
			return result;
		do {
			c = *(char *) addr;
			if (!c)
				result = size;
			if (size < PAGE_SIZE)
				buffer[size++] = c;
			else
				return result;
			addr++;
			start++;
			if (start >= end)
				return result;
		} while (!(addr & ~PAGE_MASK));
	}
}

static int get_env(int pid, char * buffer)
{
	struct task_struct ** p = get_task(pid);

	if (!p || !*p)
		return 0;
	return get_array(p, (*p)->env_start, (*p)->env_end, buffer);
}

static int get_arg(int pid, char * buffer)
{
	struct task_struct ** p = get_task(pid);

	if (!p || !*p)
		return 0;
	return get_array(p, (*p)->arg_start, (*p)->arg_end, buffer);
}

static unsigned long get_wchan(struct task_struct *p)
{
	unsigned long ebp, eip;
	unsigned long stack_page;
	int count = 0;

	if (!p || p == current || p->state == TASK_RUNNING)
		return 0;
	stack_page = p->kernel_stack_page;
	if (!stack_page)
		return 0;
	ebp = p->tss.ebp;
	do {
		if (ebp < stack_page || ebp >= 4092+stack_page)
			return 0;
		eip = *(unsigned long *) (ebp+4);
		if ((void *)eip != sleep_on &&
		    (void *)eip != interruptible_sleep_on)
			return eip;
		ebp = *(unsigned long *) ebp;
	} while (count++ < 16);
	return 0;
}

#define	KSTK_EIP(stack)	(((unsigned long *)stack)[1019])
#define	KSTK_ESP(stack)	(((unsigned long *)stack)[1022])

static int get_stat(int pid, char * buffer)
{
	struct task_struct ** p = get_task(pid);
	unsigned long sigignore=0, sigcatch=0, bit=1, wchan;
	unsigned long vsize, eip, esp;
	int i,tty_pgrp;
	char state;

	if (!p || !*p)
		return 0;
	if ((*p)->state < 0 || (*p)->state > 5)
		state = '.';
	else
		state = "RSDZTD"[(*p)->state];
	eip = esp = 0;
	vsize = (*p)->kernel_stack_page;
	if (vsize) {
		eip = KSTK_EIP(vsize);
		esp = KSTK_ESP(vsize);
		vsize = (*p)->brk - (*p)->start_code + PAGE_SIZE-1;
		if (esp)
			vsize += TASK_SIZE - esp;
	}
	wchan = get_wchan(*p);
	for(i=0; i<32; ++i) {
		switch((int) (*p)->sigaction[i].sa_handler) {
		case 1: sigignore |= bit; break;
		case 0: break;
		default: sigcatch |= bit;
		} bit <<= 1;
	}
	tty_pgrp = (*p)->tty;
	if (tty_pgrp > 0 && tty_table[tty_pgrp])
		tty_pgrp = tty_table[tty_pgrp]->pgrp;
	else
		tty_pgrp = -1;
	return sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \
%lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %u %u %lu %lu %lu %lu %lu %lu \
%lu %lu %lu %lu\n",
		pid,
		(*p)->comm,
		state,
		(*p)->p_pptr->pid,
		(*p)->pgrp,
		(*p)->session,
		(*p)->tty,
		tty_pgrp,
		(*p)->flags,
		(*p)->min_flt,
		(*p)->cmin_flt,
		(*p)->maj_flt,
		(*p)->cmaj_flt,
		(*p)->utime,
		(*p)->stime,
		(*p)->cutime,
		(*p)->cstime,
		(*p)->counter,  /* this is the kernel priority ---
				   subtract 30 in your user-level program. */
		(*p)->priority, /* this is the nice value ---
				   subtract 15 in your user-level program. */
		(*p)->timeout,
		(*p)->it_real_value,
		(*p)->start_time,
		vsize,
		(*p)->rss, /* you might want to shift this left 3 */
		(*p)->rlim[RLIMIT_RSS].rlim_cur,
		(*p)->start_code,
		(*p)->end_code,
		(*p)->start_stack,
		esp,
		eip,
		(*p)->signal,
		(*p)->blocked,
		sigignore,
		sigcatch,
		wchan);
}

static int get_statm(int pid, char * buffer)
{
	struct task_struct ** p = get_task(pid);
	int i, tpag;
	int size=0, resident=0, share=0, trs=0, lrs=0, drs=0, dt=0;
	unsigned long ptbl, *buf, *pte, *pagedir, map_nr;

	if (!p || !*p)
		return 0;
	tpag = (*p)->end_code / PAGE_SIZE;
	if ((*p)->state != TASK_ZOMBIE) {
	  pagedir = (unsigned long *) (*p)->tss.cr3;
	  for (i = 0; i < 0x300; ++i) {
	    if ((ptbl = pagedir[i]) == 0) {
	      tpag -= PTRS_PER_PAGE;
	      continue;
	    }
	    buf = (unsigned long *)(ptbl & PAGE_MASK);
	    for (pte = buf; pte < (buf + PTRS_PER_PAGE); ++pte) {
	      if (*pte != 0) {
		++size;
		if (*pte & 1) {
		  ++resident;
		  if (tpag > 0)
		    ++trs;
		  else
		    ++drs;
		  if (i >= 15 && i < 0x2f0) {
		    ++lrs;
		    if (*pte & 0x40)
		      ++dt;
		    else
		      --drs;
		  }
		  map_nr = MAP_NR(*pte);
		  if (map_nr < (high_memory / PAGE_SIZE) && mem_map[map_nr] > 1)
		    ++share;
		}
	      }
	      --tpag;
	    }
	  }
	}
	return sprintf(buffer,"%d %d %d %d %d %d %d\n",
		       size, resident, share, trs, lrs, drs, dt);
}

static int get_maps(int pid, char *buf)
{
	int sz = 0;
	struct task_struct **p = get_task(pid);
	struct vm_area_struct *map;

	if (!p || !*p)
		return 0;

	for(map = (*p)->mmap; map != NULL; map = map->vm_next) {
		char str[7], *cp = str;
		int prot = map->vm_page_prot;
		int perms, flags;
		int end = sz + 80;	/* Length of line */
		dev_t dev;
		unsigned long ino;

		/*
		 * This tries to get an "rwxsp" string out of silly
		 * intel page permissions.  The vm_area_struct should
		 * probably have the original mmap args preserved.
		 */
		
		flags = perms = 0;

		if ((prot & PAGE_READONLY) == PAGE_READONLY)
			perms |= PROT_READ | PROT_EXEC;
		if (prot & (PAGE_COW|PAGE_RW)) {
			perms |= PROT_WRITE | PROT_READ;
			flags = prot & PAGE_COW ? MAP_PRIVATE : MAP_SHARED;
		}

		*cp++ = perms & PROT_READ ? 'r' : '-';
		*cp++ = perms & PROT_WRITE ? 'w' : '-';
		*cp++ = perms & PROT_EXEC ? 'x' : '-';
		*cp++ = flags & MAP_SHARED ? 's' : '-';
		*cp++ = flags & MAP_PRIVATE ? 'p' : '-';
		*cp++ = 0;
		
		if (end >= PAGE_SIZE) {
			sprintf(buf+sz, "...\n");
			break;
		}
		
		if (map->vm_inode != NULL) {
			dev = map->vm_inode->i_dev;
			ino = map->vm_inode->i_ino;
		} else {
			dev = 0;
			ino = 0;
		}

		sz += sprintf(buf+sz, "%08lx-%08lx %s %08lx %02x:%02x %lu\n",
			      map->vm_start, map->vm_end, str, map->vm_offset,
			      MAJOR(dev),MINOR(dev), ino);
		if (sz > end) {
			printk("get_maps: end(%d) < sz(%d)\n", end, sz);
			break;
		}
	}
	
	return sz;
}

extern int get_module_list(char *);

static int array_read(struct inode * inode, struct file * file,char * buf, int count)
{
	char * page;
	int length;
	int end;
	unsigned int type, pid;

	if (count < 0)
		return -EINVAL;
	if (!(page = (char*) __get_free_page(GFP_KERNEL)))
		return -ENOMEM;
	type = inode->i_ino;
	pid = type >> 16;
	type &= 0x0000ffff;
	switch (type) {
		case 2:
			length = get_loadavg(page);
			break;
		case 3:
			length = get_uptime(page);
			break;
		case 4:
			length = get_meminfo(page);
			break;
		case 6:
			length = get_version(page);
			break;
		case 9:
			length = get_env(pid, page);
			break;
		case 10:
			length = get_arg(pid, page);
			break;
		case 11:
			length = get_stat(pid, page);
			break;
		case 12:
			length = get_statm(pid, page);
			break;
#ifdef CONFIG_DEBUG_MALLOC
		case 13:
			length = get_malloc(page);
			break;
#endif
		case 14:
			free_page((unsigned long) page);
			return read_core(inode, file, buf, count);
		case 15:
			length = get_maps(pid, page);
			break;
		case 16:
			length = get_module_list(page);
			break;
		case 17:
			length = get_kstat(page);
			break;
		default:
			free_page((unsigned long) page);
			return -EBADF;
	}
	if (file->f_pos >= length) {
		free_page((unsigned long) page);
		return 0;
	}
	if (count + file->f_pos > length)
		count = length - file->f_pos;
	end = count + file->f_pos;
	memcpy_tofs(buf, page + file->f_pos, count);
	free_page((unsigned long) page);
	file->f_pos = end;
	return count;
}

static struct file_operations proc_array_operations = {
	NULL,		/* array_lseek */
	array_read,
	NULL,		/* array_write */
	NULL,		/* array_readdir */
	NULL,		/* array_select */
	NULL,		/* array_ioctl */
	NULL,		/* mmap */
	NULL,		/* no special open code */
	NULL,		/* no special release code */
	NULL		/* can't fsync */
};

struct inode_operations proc_array_inode_operations = {
	&proc_array_operations,	/* default base directory file-ops */
	NULL,			/* create */
	NULL,			/* lookup */
	NULL,			/* link */
	NULL,			/* unlink */
	NULL,			/* symlink */
	NULL,			/* mkdir */
	NULL,			/* rmdir */
	NULL,			/* mknod */
	NULL,			/* rename */
	NULL,			/* readlink */
	NULL,			/* follow_link */
	NULL,			/* bmap */
	NULL,			/* truncate */
	NULL			/* permission */
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一二三四社区欧美黄| 国产精品77777| 国精品**一区二区三区在线蜜桃| 成人黄页毛片网站| 欧美电影免费观看高清完整版在线| 中文字幕日韩av资源站| 日本不卡一区二区| 日本韩国精品在线| 国产精品你懂的| 国产一区二区毛片| 日韩一区二区免费电影| 亚洲国产另类精品专区| 91蜜桃网址入口| 久久精品免视看| 久久精品免费观看| 欧美一级生活片| 亚洲第一激情av| 91久久一区二区| 亚洲丝袜精品丝袜在线| 国产成人午夜高潮毛片| 久久综合九色综合97_久久久| 图片区小说区国产精品视频| 91浏览器入口在线观看| 1000精品久久久久久久久| 国产又黄又大久久| 精品成人一区二区| 免费在线欧美视频| 69久久99精品久久久久婷婷| 一区二区三区精品在线观看| 日本黄色一区二区| 亚洲一区二区三区视频在线播放| 91亚洲国产成人精品一区二三| 欧美国产日韩精品免费观看| 国产.精品.日韩.另类.中文.在线.播放| 欧美一级理论性理论a| 日韩激情视频在线观看| 欧美日韩的一区二区| 亚洲国产aⅴ天堂久久| 欧美老女人第四色| 丝瓜av网站精品一区二区| 91精品在线一区二区| 欧美aa在线视频| 久久一区二区视频| 高清beeg欧美| 亚洲丝袜美腿综合| 欧美日韩黄色影视| 久久成人麻豆午夜电影| 久久久久久亚洲综合影院红桃| 91猫先生在线| **欧美大码日韩| 在线一区二区三区四区五区| 亚洲一区在线观看免费观看电影高清| 欧美日韩一区二区三区四区五区| 视频精品一区二区| 久久久蜜桃精品| 色天使久久综合网天天| 香蕉加勒比综合久久| 精品免费视频.| 成人手机在线视频| 午夜精品久久久久久久久久| 精品人在线二区三区| 成人高清视频在线| 午夜精品福利在线| 中文字幕国产精品一区二区| 色婷婷久久一区二区三区麻豆| 五月婷婷色综合| 国产亚洲欧美色| 欧美色爱综合网| 国产成人精品综合在线观看 | 欧美一级一级性生活免费录像| 久久电影国产免费久久电影| 中文字幕中文乱码欧美一区二区| 欧美性生活一区| 国产丶欧美丶日本不卡视频| 午夜精品福利久久久| 国产欧美日韩三级| 欧美日韩不卡在线| www.欧美亚洲| 久久精品国产秦先生| 亚洲精品你懂的| 精品成人免费观看| 欧美三级三级三级| 99re66热这里只有精品3直播| 免费的国产精品| 亚洲图片欧美综合| 欧美国产一区二区| 亚洲精品在线网站| 3d成人动漫网站| 色综合天天狠狠| 成人av在线播放网址| 国产在线观看免费一区| 日韩专区一卡二卡| 亚洲一区国产视频| 亚洲欧美视频在线观看| 欧美经典一区二区| 精品国产一区二区精华| 8x8x8国产精品| 欧美亚洲愉拍一区二区| 91丨porny丨首页| 成人中文字幕电影| 国产激情一区二区三区| 狠狠久久亚洲欧美| 麻豆久久久久久| 男人的天堂久久精品| 日日夜夜免费精品| 亚洲成年人影院| 亚洲国产一区二区三区| 一区二区三区美女| 亚洲最大成人网4388xx| 亚洲毛片av在线| 一区二区三区中文免费| 亚洲精品国产无天堂网2021| 亚洲天堂2014| 亚洲综合色区另类av| 一区二区欧美在线观看| 一区二区三区.www| 亚洲国产美国国产综合一区二区| 亚洲夂夂婷婷色拍ww47| 亚洲一区av在线| 亚洲1区2区3区4区| 免费观看91视频大全| 免费成人在线视频观看| 精品一区二区三区免费观看| 国产伦精品一区二区三区免费迷| 国产美女在线观看一区| 风间由美性色一区二区三区| gogo大胆日本视频一区| 日本精品一区二区三区高清| 欧美性感一类影片在线播放| 欧美人体做爰大胆视频| 日韩女同互慰一区二区| 久久久www免费人成精品| 中文字幕一区二区三区在线观看 | 99视频有精品| 在线亚洲一区观看| 欧美精品日日鲁夜夜添| 欧美电视剧在线看免费| 日本一区二区免费在线观看视频| 国产精品久久久久久户外露出| 亚洲欧美日韩成人高清在线一区| 亚洲午夜在线视频| 蜜桃av一区二区在线观看| 国产成人免费视频精品含羞草妖精 | 国产成人午夜99999| 成人av免费观看| 欧美日本在线视频| 亚洲精品在线观看网站| 国产精品久久久久久亚洲伦| 亚洲国产精品久久人人爱蜜臀| 免费美女久久99| 成人听书哪个软件好| 欧美日韩精品一区二区三区四区 | 国产福利精品导航| 在线视频你懂得一区二区三区| 国产一区中文字幕| 91麻豆免费看| 精品久久人人做人人爰| 亚洲欧美偷拍卡通变态| 国模娜娜一区二区三区| 日本久久精品电影| 亚洲国产精品激情在线观看| 亚洲在线一区二区三区| 国产不卡视频一区二区三区| 欧美在线观看视频在线| 国产日韩欧美精品电影三级在线| 一区二区三区日韩精品视频| 国产一区二区三区在线观看免费视频| 一本久久a久久免费精品不卡| 欧美tickling挠脚心丨vk| 亚洲男同1069视频| 丰满岳乱妇一区二区三区| 91精品一区二区三区久久久久久 | 91福利在线导航| 欧美韩国日本一区| 久草在线在线精品观看| 欧洲一区在线电影| 国产精品免费人成网站| 美腿丝袜亚洲色图| 欧美丰满少妇xxxxx高潮对白| 亚洲啪啪综合av一区二区三区| 国产精品亚洲成人| 欧美成人一区二区三区片免费| 亚洲国产精品久久一线不卡| 色综合中文综合网| 国产91精品在线观看| 日韩欧美久久一区| 亚洲地区一二三色| 在线观看91精品国产入口| 亚洲欧美乱综合| 91在线视频18| 中文字幕中文字幕在线一区| 国产永久精品大片wwwapp| 日韩欧美色电影| 丝袜脚交一区二区| 91精品啪在线观看国产60岁| 无码av免费一区二区三区试看| 欧美日本韩国一区二区三区视频 | 欧美日韩一区二区在线视频| 亚洲一区二区三区在线播放| 在线亚洲高清视频|