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

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

?? exec.c

?? linux 0.11源代碼
?? C
字號:
/* *  linux/fs/exec.c * *  (C) 1991  Linus Torvalds *//* * #!-checking implemented by tytso. *//* * Demand-loading implemented 01.12.91 - no need to read anything but * the header into memory. The inode of the executable is put into * "current->executable", and page faults do the actual loading. Clean. * * Once more I can proudly say that linux stood up to being changed: it * was less than 2 hours work to get demand-loading completely implemented. */#include <errno.h>#include <string.h>#include <sys/stat.h>#include <a.out.h>#include <linux/fs.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/mm.h>#include <asm/segment.h>extern int sys_exit(int exit_code);extern int sys_close(int fd);/* * MAX_ARG_PAGES defines the number of pages allocated for arguments * and envelope for the new program. 32 should suffice, this gives * a maximum env+arg of 128kB ! */#define MAX_ARG_PAGES 32/* * create_tables() parses the env- and arg-strings in new user * memory and creates the pointer tables from them, and puts their * addresses on the "stack", returning the new stack pointer value. */static unsigned long * create_tables(char * p,int argc,int envc){	unsigned long *argv,*envp;	unsigned long * sp;	sp = (unsigned long *) (0xfffffffc & (unsigned long) p);	sp -= envc+1;	envp = sp;	sp -= argc+1;	argv = sp;	put_fs_long((unsigned long)envp,--sp);	put_fs_long((unsigned long)argv,--sp);	put_fs_long((unsigned long)argc,--sp);	while (argc-->0) {		put_fs_long((unsigned long) p,argv++);		while (get_fs_byte(p++)) /* nothing */ ;	}	put_fs_long(0,argv);	while (envc-->0) {		put_fs_long((unsigned long) p,envp++);		while (get_fs_byte(p++)) /* nothing */ ;	}	put_fs_long(0,envp);	return sp;}/* * count() counts the number of arguments/envelopes */static int count(char ** argv){	int i=0;	char ** tmp;	if (tmp = argv)		while (get_fs_long((unsigned long *) (tmp++)))			i++;	return i;}/* * 'copy_string()' copies argument/envelope strings from user * memory to free pages in kernel mem. These are in a format ready * to be put directly into the top of new user memory. * * Modified by TYT, 11/24/91 to add the from_kmem argument, which specifies * whether the string and the string array are from user or kernel segments: *  * from_kmem     argv *        argv ** *    0          user space    user space *    1          kernel space  user space *    2          kernel space  kernel space *  * We do this by playing games with the fs segment register.  Since it * it is expensive to load a segment register, we try to avoid calling * set_fs() unless we absolutely have to. */static unsigned long copy_strings(int argc,char ** argv,unsigned long *page,		unsigned long p, int from_kmem){	char *tmp, *pag;	int len, offset = 0;	unsigned long old_fs, new_fs;	if (!p)		return 0;	/* bullet-proofing */	new_fs = get_ds();	old_fs = get_fs();	if (from_kmem==2)		set_fs(new_fs);	while (argc-- > 0) {		if (from_kmem == 1)			set_fs(new_fs);		if (!(tmp = (char *)get_fs_long(((unsigned long *)argv)+argc)))			panic("argc is wrong");		if (from_kmem == 1)			set_fs(old_fs);		len=0;		/* remember zero-padding */		do {			len++;		} while (get_fs_byte(tmp++));		if (p-len < 0) {	/* this shouldn't happen - 128kB */			set_fs(old_fs);			return 0;		}		while (len) {			--p; --tmp; --len;			if (--offset < 0) {				offset = p % PAGE_SIZE;				if (from_kmem==2)					set_fs(old_fs);				if (!(pag = (char *) page[p/PAGE_SIZE]) &&				    !(pag = (char *) page[p/PAGE_SIZE] =				      (unsigned long *) get_free_page())) 					return 0;				if (from_kmem==2)					set_fs(new_fs);			}			*(pag + offset) = get_fs_byte(tmp);		}	}	if (from_kmem==2)		set_fs(old_fs);	return p;}static unsigned long change_ldt(unsigned long text_size,unsigned long * page){	unsigned long code_limit,data_limit,code_base,data_base;	int i;	code_limit = text_size+PAGE_SIZE -1;	code_limit &= 0xFFFFF000;	data_limit = 0x4000000;	code_base = get_base(current->ldt[1]);	data_base = code_base;	set_base(current->ldt[1],code_base);	set_limit(current->ldt[1],code_limit);	set_base(current->ldt[2],data_base);	set_limit(current->ldt[2],data_limit);/* make sure fs points to the NEW data segment */	__asm__("pushl $0x17\n\tpop %%fs"::);	data_base += data_limit;	for (i=MAX_ARG_PAGES-1 ; i>=0 ; i--) {		data_base -= PAGE_SIZE;		if (page[i])			put_page(page[i],data_base);	}	return data_limit;}/* * 'do_execve()' executes a new program. */int do_execve(unsigned long * eip,long tmp,char * filename,	char ** argv, char ** envp){	struct m_inode * inode;	struct buffer_head * bh;	struct exec ex;	unsigned long page[MAX_ARG_PAGES];	int i,argc,envc;	int e_uid, e_gid;	int retval;	int sh_bang = 0;	unsigned long p=PAGE_SIZE*MAX_ARG_PAGES-4;	if ((0xffff & eip[1]) != 0x000f)		panic("execve called from supervisor mode");	for (i=0 ; i<MAX_ARG_PAGES ; i++)	/* clear page-table */		page[i]=0;	if (!(inode=namei(filename)))		/* get executables inode */		return -ENOENT;	argc = count(argv);	envc = count(envp);	restart_interp:	if (!S_ISREG(inode->i_mode)) {	/* must be regular file */		retval = -EACCES;		goto exec_error2;	}	i = inode->i_mode;	e_uid = (i & S_ISUID) ? inode->i_uid : current->euid;	e_gid = (i & S_ISGID) ? inode->i_gid : current->egid;	if (current->euid == inode->i_uid)		i >>= 6;	else if (current->egid == inode->i_gid)		i >>= 3;	if (!(i & 1) &&	    !((inode->i_mode & 0111) && suser())) {		retval = -ENOEXEC;		goto exec_error2;	}	if (!(bh = bread(inode->i_dev,inode->i_zone[0]))) {		retval = -EACCES;		goto exec_error2;	}	ex = *((struct exec *) bh->b_data);	/* read exec-header */	if ((bh->b_data[0] == '#') && (bh->b_data[1] == '!') && (!sh_bang)) {		/*		 * This section does the #! interpretation.		 * Sorta complicated, but hopefully it will work.  -TYT		 */		char buf[1023], *cp, *interp, *i_name, *i_arg;		unsigned long old_fs;		strncpy(buf, bh->b_data+2, 1022);		brelse(bh);		iput(inode);		buf[1022] = '\0';		if (cp = strchr(buf, '\n')) {			*cp = '\0';			for (cp = buf; (*cp == ' ') || (*cp == '\t'); cp++);		}		if (!cp || *cp == '\0') {			retval = -ENOEXEC; /* No interpreter name found */			goto exec_error1;		}		interp = i_name = cp;		i_arg = 0;		for ( ; *cp && (*cp != ' ') && (*cp != '\t'); cp++) { 			if (*cp == '/')				i_name = cp+1;		}		if (*cp) {			*cp++ = '\0';			i_arg = cp;		}		/*		 * OK, we've parsed out the interpreter name and		 * (optional) argument.		 */		if (sh_bang++ == 0) {			p = copy_strings(envc, envp, page, p, 0);			p = copy_strings(--argc, argv+1, page, p, 0);		}		/*		 * Splice in (1) the interpreter's name for argv[0]		 *           (2) (optional) argument to interpreter		 *           (3) filename of shell script		 *		 * This is done in reverse order, because of how the		 * user environment and arguments are stored.		 */		p = copy_strings(1, &filename, page, p, 1);		argc++;		if (i_arg) {			p = copy_strings(1, &i_arg, page, p, 2);			argc++;		}		p = copy_strings(1, &i_name, page, p, 2);		argc++;		if (!p) {			retval = -ENOMEM;			goto exec_error1;		}		/*		 * OK, now restart the process with the interpreter's inode.		 */		old_fs = get_fs();		set_fs(get_ds());		if (!(inode=namei(interp))) { /* get executables inode */			set_fs(old_fs);			retval = -ENOENT;			goto exec_error1;		}		set_fs(old_fs);		goto restart_interp;	}	brelse(bh);	if (N_MAGIC(ex) != ZMAGIC || ex.a_trsize || ex.a_drsize ||		ex.a_text+ex.a_data+ex.a_bss>0x3000000 ||		inode->i_size < ex.a_text+ex.a_data+ex.a_syms+N_TXTOFF(ex)) {		retval = -ENOEXEC;		goto exec_error2;	}	if (N_TXTOFF(ex) != BLOCK_SIZE) {		printk("%s: N_TXTOFF != BLOCK_SIZE. See a.out.h.", filename);		retval = -ENOEXEC;		goto exec_error2;	}	if (!sh_bang) {		p = copy_strings(envc,envp,page,p,0);		p = copy_strings(argc,argv,page,p,0);		if (!p) {			retval = -ENOMEM;			goto exec_error2;		}	}/* OK, This is the point of no return */	if (current->executable)		iput(current->executable);	current->executable = inode;	for (i=0 ; i<32 ; i++)		current->sigaction[i].sa_handler = NULL;	for (i=0 ; i<NR_OPEN ; i++)		if ((current->close_on_exec>>i)&1)			sys_close(i);	current->close_on_exec = 0;	free_page_tables(get_base(current->ldt[1]),get_limit(0x0f));	free_page_tables(get_base(current->ldt[2]),get_limit(0x17));	if (last_task_used_math == current)		last_task_used_math = NULL;	current->used_math = 0;	p += change_ldt(ex.a_text,page)-MAX_ARG_PAGES*PAGE_SIZE;	p = (unsigned long) create_tables((char *)p,argc,envc);	current->brk = ex.a_bss +		(current->end_data = ex.a_data +		(current->end_code = ex.a_text));	current->start_stack = p & 0xfffff000;	current->euid = e_uid;	current->egid = e_gid;	i = ex.a_text+ex.a_data;	while (i&0xfff)		put_fs_byte(0,(char *) (i++));	eip[0] = ex.a_entry;		/* eip, magic happens :-) */	eip[3] = p;			/* stack pointer */	return 0;exec_error2:	iput(inode);exec_error1:	for (i=0 ; i<MAX_ARG_PAGES ; i++)		free_page(page[i]);	return(retval);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品久久久| 亚洲午夜国产一区99re久久| 欧美丝袜丝nylons| av网站免费线看精品| 国产激情视频一区二区三区欧美| 久久精品国产亚洲高清剧情介绍| 青青青伊人色综合久久| 首页欧美精品中文字幕| 免费一级片91| 国产激情偷乱视频一区二区三区 | 国产亚洲va综合人人澡精品| 精品国产91洋老外米糕| 久久久久久久久久久99999| 久久久99久久| 一区二区三区在线免费视频| 亚洲综合激情另类小说区| 亚洲自拍偷拍欧美| 麻豆中文一区二区| 国产一区二区在线视频| 成人免费看片app下载| 91视频一区二区| 在线电影一区二区三区| 欧美videofree性高清杂交| 久久无码av三级| 中文字幕中文乱码欧美一区二区| 亚洲精品免费播放| 视频一区二区中文字幕| 国产乱子伦视频一区二区三区| 91亚洲国产成人精品一区二区三| 欧美午夜理伦三级在线观看| 精品国产乱码久久久久久牛牛 | 欧美成人免费网站| 国产日韩亚洲欧美综合| 亚洲欧洲精品一区二区精品久久久| 亚洲精品国产精华液| 黄网站免费久久| 欧美亚洲动漫制服丝袜| 亚洲精品一区二区三区香蕉| 亚洲蜜桃精久久久久久久| 另类综合日韩欧美亚洲| 欧洲一区二区三区免费视频| 欧美成人一区二区三区| 亚洲狠狠爱一区二区三区| 国产精品自拍毛片| 制服丝袜亚洲色图| 综合激情成人伊人| 国产精品一区免费在线观看| 精品婷婷伊人一区三区三| 国产人成亚洲第一网站在线播放 | 99久久婷婷国产综合精品| 67194成人在线观看| 136国产福利精品导航| 老鸭窝一区二区久久精品| 99re这里都是精品| 久久久久国产一区二区三区四区| 亚洲国产精品久久久久婷婷884| 国产精品一区二区91| 91精品一区二区三区在线观看| 国产精品久久久久久久久免费丝袜| 麻豆国产91在线播放| 欧美蜜桃一区二区三区| 亚洲日本在线天堂| 99视频精品全部免费在线| 久久青草国产手机看片福利盒子 | 99国产欧美另类久久久精品| 久久免费看少妇高潮| 久热成人在线视频| 日韩一区二区在线观看视频播放| 一区二区三区中文字幕电影| 91丨porny丨在线| 18成人在线观看| 99在线精品视频| 亚洲色图欧洲色图婷婷| 成人app网站| 中文字幕在线不卡国产视频| 高清成人免费视频| 国产精品久久看| 成人国产在线观看| 国产精品久久久久久一区二区三区| 国产美女在线观看一区| 精品久久久久久久人人人人传媒 | 视频一区二区三区入口| 欧美日韩一区二区电影| 亚洲国产一区在线观看| 在线免费观看一区| 亚洲大片在线观看| 欧美日韩国产区一| 人人精品人人爱| 日韩欧美一卡二卡| 国产一区视频在线看| 中文字幕精品一区二区精品绿巨人| av电影天堂一区二区在线观看| 国产欧美精品一区二区三区四区| 大陆成人av片| 亚洲另类在线一区| 3d成人h动漫网站入口| 国产制服丝袜一区| 亚洲国产高清aⅴ视频| 91蜜桃在线免费视频| 亚洲线精品一区二区三区八戒| 欧美精品乱码久久久久久按摩 | 一个色综合av| 日韩美一区二区三区| 成人午夜在线播放| 一级日本不卡的影视| 日韩一区二区三区电影在线观看| 国产精品中文字幕日韩精品| 亚洲激情成人在线| 日韩视频不卡中文| 99亚偷拍自图区亚洲| 日本亚洲三级在线| 国产精品久久久久久久第一福利 | 麻豆国产精品一区二区三区| 国产精品视频观看| 欧美精品乱码久久久久久按摩| 高清在线观看日韩| 午夜久久久影院| 国产免费观看久久| 欧美日韩电影一区| av网站一区二区三区| 另类小说综合欧美亚洲| 亚洲伦在线观看| 26uuu国产在线精品一区二区| 日本久久一区二区三区| 国产精品18久久久久久久久久久久 | 日韩欧美国产午夜精品| 99久久精品免费看| 精品综合久久久久久8888| 亚洲伦理在线免费看| 国产日韩欧美不卡| 日韩精品一区二区在线| 欧美日韩国产一区二区三区地区| gogogo免费视频观看亚洲一| 国产一区二区看久久| 日本亚洲三级在线| 亚洲一区二区三区美女| 国产精品欧美精品| wwwwxxxxx欧美| 91精品国产色综合久久不卡蜜臀 | 欧美日韩激情在线| 99久久婷婷国产综合精品 | 色综合久久久网| 成人精品一区二区三区四区 | 91啦中文在线观看| 国产成人综合亚洲91猫咪| 久久成人羞羞网站| 日本不卡一二三| 亚洲一区二区免费视频| 亚洲精品国产a久久久久久| 日本一区二区高清| 中文字幕精品在线不卡| 国产欧美一区二区在线| 久久久久久综合| 国产欧美一区二区精品性色 | 1区2区3区欧美| **网站欧美大片在线观看| 国产精品国产三级国产a| 中文字幕在线观看一区二区| 国产精品色一区二区三区| 中文字幕在线观看不卡视频| 综合久久国产九一剧情麻豆| 亚洲欧美精品午睡沙发| 日韩一区欧美小说| 亚洲一卡二卡三卡四卡五卡| 亚洲小说欧美激情另类| 天天av天天翘天天综合网| 日韩中文字幕亚洲一区二区va在线 | 国产做a爰片久久毛片| 久久国内精品视频| 国产一区二区三区香蕉| 懂色av中文一区二区三区| av成人免费在线观看| 在线视频国内自拍亚洲视频| 欧美日韩视频专区在线播放| 欧美一区二区三区精品| 久久综合久久综合九色| 国产精品久久久久婷婷二区次| 亚洲欧洲中文日韩久久av乱码| 亚洲高清免费一级二级三级| 天天影视涩香欲综合网| 国产成人综合精品三级| 91福利在线导航| 26uuu国产日韩综合| 亚洲日本丝袜连裤袜办公室| 香蕉久久夜色精品国产使用方法| 久久精工是国产品牌吗| 91猫先生在线| 精品嫩草影院久久| 亚洲六月丁香色婷婷综合久久| 日韩精品1区2区3区| 国产精品亚洲成人| 欧美男男青年gay1069videost | 91国偷自产一区二区三区观看| 69p69国产精品| 国产精品国产精品国产专区不蜜 | 盗摄精品av一区二区三区| 欧美日韩亚洲国产综合| 亚洲国产成人一区二区三区| 亚洲国产日韩a在线播放| 国产高清不卡一区二区|