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

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

?? exec.c

?? linux下的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/** linux/fs/exec.c** (C) 1991 Linus Torvalds*//** #!-checking implemented by tytso.*//** #!開始的程序檢測部分是由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.*//** 需求時加載是于1991.12.1 實現的 - 只需將執行文件頭部分讀進內存而無須* 將整個執行文件都加載進內存。執行文件的i 節點被放在當前進程的可執行字段中* ("current->executable"),而頁異常會進行執行文件的實際加載操作以及清理工作。** 我可以再一次自豪地說,linux 經得起修改:只用了不到2 小時的工作時間就完全* 實現了需求加載處理。*/#include <errno.h>		// 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <string.h>		// 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。#include <sys/stat.h>		// 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。#include <a.out.h>		// a.out 頭文件。定義了a.out 執行文件格式和一些宏。#include <linux/fs.h>		// 文件系統頭文件。定義文件表結構(file,buffer_head,m_inode 等)。#include <linux/sched.h>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#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 !*//** MAX_ARG_PAGES 定義了新程序分配給參數和環境變量使用的內存最大頁數。* 32 頁內存應該足夠了,這使得環境和參數(env+arg)空間的總合達到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.*//** create_tables()函數在新用戶內存中解析環境變量和參數字符串,由此* 創建指針表,并將它們的地址放到"堆棧"上,然后返回新棧的指針值。*///// 在新用戶堆棧中創建環境和參數變量指針表。// 參數:p - 以數據段為起點的參數和環境信息偏移指針;argc - 參數個數;envc -環境變量數。// 返回:堆棧指針。static unsigned long *create_tables (char *p, int argc, int envc){  unsigned long *argv, *envp;  unsigned long *sp;// 堆棧指針是以4 字節(1 節)為邊界尋址的,因此這里讓sp 為4 的整數倍。  sp = (unsigned long *) (0xfffffffc & (unsigned long) p);// sp 向下移動,空出環境參數占用的空間個數,并讓環境參數指針envp 指向該處。  sp -= envc + 1;  envp = sp;// sp 向下移動,空出命令行參數指針占用的空間個數,并讓argv 指針指向該處。// 下面指針加1,sp 將遞增指針寬度字節值。  sp -= argc + 1;  argv = sp;// 將環境參數指針envp 和命令行參數指針以及命令行參數個數壓入堆棧。  put_fs_long ((unsigned long) envp, --sp);  put_fs_long ((unsigned long) argv, --sp);  put_fs_long ((unsigned long) argc, --sp);// 將命令行各參數指針放入前面空出來的相應地方,最后放置一個NULL 指針。  while (argc-- > 0)    {      put_fs_long ((unsigned long) p, argv++);      while (get_fs_byte (p++)) /* nothing */ ;	// p 指針前移4 字節。    }  put_fs_long (0, argv);// 將環境變量各指針放入前面空出來的相應地方,最后放置一個NULL 指針。  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*//** count()函數計算命令行參數/環境變量的個數。*///// 計算參數個數。// 參數:argv - 參數指針數組,最后一個指針項是NULL。// 返回:參數個數。static intcount (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.*//** 'copy_string()'函數從用戶內存空間拷貝參數和環境字符串到內核空閑頁面內存中。* 這些已具有直接放到新用戶內存中的格式。** 由TYT(Tytso)于1991.12.24 日修改,增加了from_kmem 參數,該參數指明了字符串或* 字符串數組是來自用戶段還是內核段。** from_kmem argv * argv *** 0 用戶空間 用戶空間* 1 內核空間 用戶空間* 2 內核空間 內核空間** 我們是通過巧妙處理fs 段寄存器來操作的。由于加載一個段寄存器代價太大,所以* 我們盡量避免調用set_fs(),除非實在必要。*///// 復制指定個數的參數字符串到參數和環境空間。// 參數:argc - 欲添加的參數個數;argv - 參數指針數組;page - 參數和環境空間頁面指針數組。// p -在參數表空間中的偏移指針,始終指向已復制串的頭部;from_kmem - 字符串來源標志。// 在do_execve()函數中,p 初始化為指向參數表(128kB)空間的最后一個長字處,參數字符串// 是以堆棧操作方式逆向往其中復制存放的,因此p 指針會始終指向參數字符串的頭部。// 返回:參數和環境空間當前頭部指針。static unsigned longcopy_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 *//* 偏移指針驗證 */// 取ds 寄存器值到new_fs,并保存原fs 寄存器值到old_fs。  new_fs = get_ds ();  old_fs = get_fs ();// 如果字符串和字符串數組來自內核空間,則設置fs 段寄存器指向內核數據段(ds)。  if (from_kmem == 2)    set_fs (new_fs);// 循環處理各個參數,從最后一個參數逆向開始復制,復制到指定偏移地址處。  while (argc-- > 0)    {// 如果字符串在用戶空間而字符串數組在內核空間,則設置fs 段寄存器指向內核數據段(ds)。      if (from_kmem == 1)	set_fs (new_fs);// 從最后一個參數開始逆向操作,取fs 段中最后一參數指針到tmp,如果為空,則出錯死機。      if (!(tmp = (char *) get_fs_long (((unsigned long *) argv) + argc)))	panic ("argc is wrong");// 如果字符串在用戶空間而字符串數組在內核空間,則恢復fs 段寄存器原值。      if (from_kmem == 1)	set_fs (old_fs);// 計算該參數字符串長度len,并使tmp 指向該參數字符串末端。      len = 0;			/* remember zero-padding */      do	{			/* 我們知道串是以NULL 字節結尾的 */	  len++;	}      while (get_fs_byte (tmp++));// 如果該字符串長度超過此時參數和環境空間中還剩余的空閑長度,則恢復fs 段寄存器并返回0。      if (p - len < 0)	{			/* this shouldn't happen - 128kB */	  set_fs (old_fs);	/* 不會發生-因為有128kB 的空間 */	  return 0;	}// 復制fs 段中當前指定的參數字符串,是從該字符串尾逆向開始復制。      while (len)	{	  --p;	  --tmp;	  --len;// 函數剛開始執行時,偏移變量offset 被初始化為0,因此若offset-1<0,說明是首次復制字符串,// 則令其等于p 指針在頁面內的偏移值,并申請空閑頁面。	  if (--offset < 0)	    {	      offset = p % PAGE_SIZE;// 如果字符串和字符串數組在內核空間,則恢復fs 段寄存器原值。	      if (from_kmem == 2)		set_fs (old_fs);// 如果當前偏移值p 所在的串空間頁面指針數組項page[p/PAGE_SIZE]==0,表示相應頁面還不存在,// 則需申請新的內存空閑頁面,將該頁面指針填入指針數組,并且也使pag 指向該新頁面,若申請不// 到空閑頁面則返回0。	      if (!(pag = (char *) page[p / PAGE_SIZE]) &&		  !(pag = (char *) page[p / PAGE_SIZE] =		    (unsigned long *) get_free_page ()))		return 0;// 如果字符串和字符串數組來自內核空間,則設置fs 段寄存器指向內核數據段(ds)。	      if (from_kmem == 2)		set_fs (new_fs);	    }// 從fs 段中復制參數字符串中一字節到pag+offset 處。	  *(pag + offset) = get_fs_byte (tmp);	}    }// 如果字符串和字符串數組在內核空間,則恢復fs 段寄存器原值。  if (from_kmem == 2)    set_fs (old_fs);// 最后,返回參數和環境空間中已復制參數信息的頭部偏移值。  return p;}//// 修改局部描述符表中的描述符基址和段限長,并將參數和環境空間頁面放置在數據段末端。// 參數:text_size - 執行文件頭部中a_text 字段給出的代碼段長度值;// page - 參數和環境空間頁面指針數組。// 返回:數據段限長值(64MB)。static unsigned longchange_ldt (unsigned long text_size, unsigned long *page){  unsigned long code_limit, data_limit, code_base, data_base;  int i;// 根據執行文件頭部a_text 值,計算以頁面長度為邊界的代碼段限長。并設置數據段長度為64MB。  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 *//* 要確信fs 段寄存器已指向新的數據段 */// fs 段寄存器中放入局部表數據段描述符的選擇符(0x17)。  __asm__ ("pushl $0x17\n\tpop %%fs"::);// 將參數和環境空間已存放數據的頁面(共可有MAX_ARG_PAGES 頁,128kB)放到數據段線性地址的// 末端。是調用函數put_page()進行操作的(mm/memory.c, 197)。  data_base += data_limit;  for (i = MAX_ARG_PAGES - 1; i >= 0; i--)    {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲网友自拍偷拍| 国产精品福利一区二区三区| 日韩高清在线不卡| 欧美日韩www| 免费观看一级特黄欧美大片| 精品国产一区二区精华| 国产激情视频一区二区在线观看| 国产蜜臀av在线一区二区三区| 国产精品77777竹菊影视小说| 欧美高清在线精品一区| 99久久精品国产精品久久| 一区二区三区日韩欧美| 欧美日韩高清影院| 国产一区视频在线看| 欧美极品aⅴ影院| 日本高清视频一区二区| 日韩黄色免费电影| 国产日韩欧美制服另类| 色域天天综合网| 免费不卡在线观看| 国产精品久久久久一区二区三区| 欧美亚洲一区三区| 久久99久久99| 亚洲欧美电影一区二区| 欧美一区二区三区四区五区 | 亚洲男人电影天堂| 6080午夜不卡| 成人综合在线视频| 日韩黄色在线观看| 亚洲欧美电影一区二区| 日韩精品一区二区三区视频在线观看 | 精品在线播放免费| 亚洲人妖av一区二区| 欧美高清精品3d| 国产suv一区二区三区88区| 亚洲成a人片在线不卡一二三区| 日韩一级免费一区| 色综合久久中文字幕综合网| 久久aⅴ国产欧美74aaa| 亚洲主播在线播放| 欧美激情在线免费观看| 欧美一级欧美三级在线观看| 99久久99久久综合| 久久99精品国产麻豆婷婷洗澡| 一区二区三区四区视频精品免费| 欧美成人精品二区三区99精品| 91日韩在线专区| 国产河南妇女毛片精品久久久 | 国产精品久久久久久久久动漫 | 91精品蜜臀在线一区尤物| 成人小视频在线| 国产专区综合网| 日本伊人午夜精品| 亚洲国产另类av| 亚洲日本一区二区| 国产精品久久久久久久岛一牛影视| 欧美大片在线观看| 欧美一级久久久| 欧美日韩一区在线| 色狠狠一区二区三区香蕉| 成人性生交大片| 国产高清亚洲一区| 精品影视av免费| 欧美aⅴ一区二区三区视频| 亚洲电影第三页| 亚洲国产精品久久久久婷婷884| 亚洲视频精选在线| 亚洲国产精品成人综合| 国产色产综合产在线视频| 欧美zozozo| 欧美成人一区二区三区在线观看 | 7777精品伊人久久久大香线蕉的 | 色哟哟一区二区在线观看| 大尺度一区二区| 成人性色生活片| 成人激情小说网站| 成人高清免费观看| a4yy欧美一区二区三区| 成人黄色av电影| 99久久精品情趣| 99久久国产综合精品女不卡| 91老师片黄在线观看| 色婷婷国产精品| 欧美日韩午夜在线| 欧美午夜寂寞影院| 91精品国产欧美一区二区18| 91麻豆精品国产91久久久久久久久 | 精品免费99久久| 欧美精品一区二区精品网| 精品国产1区二区| 国产精品视频一二三区| 《视频一区视频二区| 亚洲一区二区三区四区在线免费观看| 亚洲黄色片在线观看| 亚洲v精品v日韩v欧美v专区| 免费一级片91| 国产91精品一区二区麻豆网站 | 成人久久久精品乱码一区二区三区| 大胆亚洲人体视频| 色视频一区二区| 91精品国产麻豆国产自产在线| 欧美成人免费网站| 中文字幕中文字幕一区二区| 亚洲综合色成人| 蜜臀久久99精品久久久画质超高清| 国产精品一区二区久久不卡| 成人黄色电影在线| 欧美老肥妇做.爰bbww视频| 精品久久免费看| 亚洲色图欧美偷拍| 日本伊人色综合网| 高清在线成人网| 欧美日韩一区在线| 久久日韩精品一区二区五区| 亚洲欧洲精品一区二区三区| 日韩成人一区二区三区在线观看| 国产精品一区二区三区网站| 欧美少妇性性性| 国产精品午夜春色av| 日本欧美大码aⅴ在线播放| 国产成人在线观看| 欧美日韩综合在线免费观看| 久久久久国产免费免费| 亚洲尤物视频在线| 成人综合在线视频| 日韩欧美www| 夜夜嗨av一区二区三区中文字幕 | 亚洲综合免费观看高清在线观看| 另类人妖一区二区av| 97se亚洲国产综合在线| 日韩欧美在线1卡| 亚洲精品国产品国语在线app| 久久97超碰国产精品超碰| 91久久国产最好的精华液| 久久免费的精品国产v∧| 亚洲成人动漫精品| caoporen国产精品视频| 欧美不卡激情三级在线观看| 一区二区三区国产精品| 国产激情91久久精品导航| 日韩欧美视频在线| 亚洲国产另类精品专区| av中文一区二区三区| 久久久久久久综合日本| 免费成人深夜小野草| 欧美视频一二三区| 亚洲视频网在线直播| 国产成人精品网址| 欧美精品一区男女天堂| 偷窥少妇高潮呻吟av久久免费| 色先锋aa成人| 国产精品国产三级国产aⅴ无密码| 国产一区二区网址| 日韩精品中文字幕在线一区| 亚洲国产一区二区视频| 日本伦理一区二区| 国产精品水嫩水嫩| 成人国产亚洲欧美成人综合网 | 欧美一区二区二区| 午夜婷婷国产麻豆精品| 在线观看亚洲一区| 亚洲免费在线视频一区 二区| 99在线热播精品免费| 综合久久国产九一剧情麻豆| 懂色av一区二区三区免费看| 国产欧美日韩三级| 成人国产精品免费观看动漫| 国产精品天干天干在线综合| 国产成人精品影视| 中文字幕第一区二区| 成人综合在线观看| 国产精品成人免费精品自在线观看| 成人av在线电影| 一区二区国产盗摄色噜噜| 色婷婷国产精品久久包臀| 亚洲综合色丁香婷婷六月图片| 欧美日韩久久一区| 三级久久三级久久久| 日韩三级av在线播放| 国产黄色91视频| 亚洲欧美一区二区久久| 在线免费观看日本欧美| 亚洲一区二区四区蜜桃| 欧美人伦禁忌dvd放荡欲情| 日韩不卡免费视频| 亚洲精品一区在线观看| av影院午夜一区| 亚洲综合激情网| 欧美岛国在线观看| 成人免费视频一区| 亚洲精品欧美在线| 91精品国产综合久久精品麻豆| 久久成人免费日本黄色| 久久精品亚洲乱码伦伦中文| 色综合久久九月婷婷色综合| 亚洲不卡一区二区三区| 2021中文字幕一区亚洲| 91丝袜国产在线播放| 秋霞电影一区二区| 国产农村妇女毛片精品久久麻豆|