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

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

?? memory.c

?? linux下的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/** linux/mm/memory.c** (C) 1991 Linus Torvalds*//** demand-loading started 01.12.91 - seems it is high on the list of* things wanted, and it should be easy to implement. - Linus*//** 需求加載是從01.12.91 開始編寫的 - 在程序編制表中是呼是最重要的程序,* 并且應該是很容易編制的 - linus*//** Ok, demand-loading was easy, shared pages a little bit tricker. Shared* pages started 02.12.91, seems to work. - Linus.** Tested sharing by executing about 30 /bin/sh: under the old kernel it* would have taken more than the 6M I have free, but it worked well as* far as I could see.** Also corrected some "invalidate()"s - I wasn't doing enough of them.*//** OK,需求加載是比較容易編寫的,而共享頁面卻需要有點技巧。共享頁面程序是* 02.12.91 開始編寫的,好象能夠工作 - Linus。** 通過執行大約30 個/bin/sh 對共享操作進行了測試:在老內核當中需要占用多于* 6M 的內存,而目前卻不用?,F在看來工作得很好。** 對"invalidate()"函數也進行了修正 - 在這方面我還做的不夠。*/#include <signal.h>		// 信號頭文件。定義信號符號常量,信號結構以及信號操作函數原型。#include <asm/system.h>		// 系統頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。#include <linux/sched.h>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/head.h>		// head 頭文件,定義了段描述符的簡單結構,和幾個選擇符常量。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。volatile void do_exit (long code);	// 進程退出處理函數,在kernel/exit.c,102 行。//// 顯示內存已用完出錯信息,并退出。static inline volatile voidoom (void){  printk ("out of memory\n\r");  do_exit (SIGSEGV);		// do_exit()應該使用退出代碼,這里用了信號值SIGSEGV(11)}				// 相同值的出錯碼含義是“資源暫時不可用”,正好同義。// 刷新頁變換高速緩沖宏函數。// 為了提高地址轉換的效率,CPU 將最近使用的頁表數據存放在芯片中高速緩沖中。在修改過頁表// 信息之后,就需要刷新該緩沖區。這里使用重新加載頁目錄基址寄存器cr3 的方法來進行刷新。// 下面eax = 0,是頁目錄的基址。#define invalidate() \__asm__( "movl %%eax,%%cr3":: "a" (0))/* these are not to be changed without changing head.s etc *//* 下面定義若需要改動,則需要與head.s 等文件中的相關信息一起改變 */// linux 0.11 內核默認支持的最大內存容量是16M,可以修改這些定義以適合更多的內存。#define LOW_MEM 0x100000	// 內存低端(1MB)。#define PAGING_MEMORY (15*1024*1024)	// 分頁內存15MB。主內存區最多15M。#define PAGING_PAGES (PAGING_MEMORY>>12)	// 分頁后的物理內存頁數。#define MAP_NR(addr) (((addr)-LOW_MEM)>>12)	// 指定內存地址映射為頁號。#define USED 100		// 頁面被占用標志,參見405 行。// CODE_SPACE(addr) ((((addr)+0xfff)&~0xfff) < current->start_code + current->end_code)。// 該宏用于判斷給定地址是否位于當前進程的代碼段中,參見252 行。#define CODE_SPACE(addr) ((((addr)+4095)&~4095) < \current->start_code + current->end_code)static long HIGH_MEMORY = 0;	// 全局變量,存放實際物理內存最高端地址。// 復制1 頁內存(4K 字節)。#define copy_page(from,to) \__asm__( "cld ; rep ; movsl":: "S" (from), "D" (to), "c" (1024): "cx", "di", "si")// 內存映射字節圖(1 字節代表1 頁內存),每個頁面對應的字節用于標志頁面當前被引用(占用)次數。static unsigned char mem_map[PAGING_PAGES] = { 0, };/** Get physical address of first (actually last :-) free page, and mark it* used. If no free pages left, return 0.*//** 獲取首個(實際上是最后1 個:-)空閑頁面,并標記為已使用。如果沒有空閑頁面,* 就返回0。*///// 取空閑頁面。如果已經沒有可用內存了,則返回0。// 輸入:%1(ax=0) - 0;%2(LOW_MEM);%3(cx=PAGING PAGES);%4(edi=mem_map+PAGING_PAGES-1)。// 輸出:返回%0(ax=頁面起始地址)。// 上面%4 寄存器實際指向mem_map[]內存字節圖的最后一個字節。本函數從字節圖末端開始向前掃描// 所有頁面標志(頁面總數為PAGING_PAGES),若有頁面空閑(其內存映像字節為0)則返回頁面地址。// 注意!本函數只是指出在主內存區的一頁空閑頁面,但并沒有映射到某個進程的線性地址去。后面// 的put_page()函數就是用來作映射的。unsigned longget_free_page (void){  register unsigned long __res asm ("ax");  __asm__ ("std ; repne ; scasb\n\t"	// 方向位置位,將al(0)與對應每個頁面的(di)內容比較,	   "jne 1f\n\t"		// 如果沒有等于0 的字節,則跳轉結束(返回0)。	   "movb $1,1(%%edi)\n\t"	// 將對應頁面的內存映像位置1。	   "sall $12,%%ecx\n\t"	// 頁面數*4K = 相對頁面起始地址。	   "addl %2,%%ecx\n\t"	// 再加上低端內存地址,即獲得頁面實際物理起始地址。	   "movl %%ecx,%%edx\n\t"	// 將頁面實際起始地址??edx 寄存器。	   "movl $1024,%%ecx\n\t"	// 寄存器ecx 置計數值1024。	   "leal 4092(%%edx),%%edi\n\t"	// 將4092+edx 的位置??edi(該頁面的末端)。	   "rep ; stosl\n\t"	// 將edi 所指內存清零(反方向,也即將該頁面清零)。	   "movl %%edx,%%eax\n"	// 將頁面起始地址??eax(返回值)。"1:": "=a" (__res): "" (0), "i" (LOW_MEM), "c" (PAGING_PAGES), "D" (mem_map + PAGING_PAGES - 1):"di", "cx",	   "dx");  return __res;			// 返回空閑頁面地址(如果無空閑也則返回0)。}/** Free a page of memory at physical address 'addr'. Used by* 'free_page_tables()'*//** 釋放物理地址'addr'開始的一頁內存。用于函數'free_page_tables()'。*///// 釋放物理地址addr 開始的一頁面內存。// 1MB 以下的內存空間用于內核程序和緩沖,不作為分配頁面的內存空間。voidfree_page (unsigned long addr){  if (addr < LOW_MEM)    return;			// 如果物理地址addr 小于內存低端(1MB),則返回。  if (addr >= HIGH_MEMORY)	// 如果物理地址addr>=內存最高端,則顯示出錯信息。    panic ("trying to free nonexistent page");  addr -= LOW_MEM;		// 物理地址減去低端內存位置,再除以4KB,得頁面號。  addr >>= 12;  if (mem_map[addr]--)    return;			// 如果對應內存頁面映射字節不等于0,則減1 返回。  mem_map[addr] = 0;		// 否則置對應頁面映射字節為0,并顯示出錯信息,死機。  panic ("trying to free free page");}/** This function frees a continuos block of page tables, as needed* by 'exit()'. As does copy_page_tables(), this handles only 4Mb blocks.*//** 下面函數釋放頁表連續的內存塊,'exit()'需要該函數。與copy_page_tables()* 類似,該函數僅處理4Mb 的內存塊。*///// 根據指定的線性地址和限長(頁表個數),釋放對應內存頁表所指定的內存塊并置表項空閑。// 頁目錄位于物理地址0 開始處,共1024 項,占4K 字節。每個目錄項指定一個頁表。// 頁表從物理地址0x1000 處開始(緊接著目錄空間),每個頁表有1024 項,也占4K 內存。// 每個頁表項對應一頁物理內存(4K)。目錄項和頁表項的大小均為4 個字節。// 參數:from - 起始基地址;size - 釋放的長度。intfree_page_tables (unsigned long from, unsigned long size){  unsigned long *pg_table;  unsigned long *dir, nr;  if (from & 0x3fffff)		// 要釋放內存塊的地址需以4M 為邊界。    panic ("free_page_tables called with wrong alignment");  if (!from)			// 出錯,試圖釋放內核和緩沖所占空間。    panic ("Trying to free up swapper memory space");// 計算所占頁目錄項數(4M 的進位整數倍),也即所占頁表數。  size = (size + 0x3fffff) >> 22;// 下面一句計算起始目錄項。對應的目錄項號=from>>22,因每項占4 字節,并且由于頁目錄是從// 物理地址0 開始,因此實際的目錄項指針=目錄項號<<2,也即(from>>20)。與上0xffc 確保// 目錄項指針范圍有效。  dir = (unsigned long *) ((from >> 20) & 0xffc);	/* _pg_dir = 0 */  for (; size-- > 0; dir++)    {				// size 現在是需要被釋放內存的目錄項數。      if (!(1 & *dir))		// 如果該目錄項無效(P 位=0),則繼續。	continue;		// 目錄項的位0(P 位)表示對應頁表是否存在。      pg_table = (unsigned long *) (0xfffff000 & *dir);	// 取目錄項中頁表地址。      for (nr = 0; nr < 1024; nr++)	{			// 每個頁表有1024 個頁項。	  if (1 & *pg_table)	// 若該頁表項有效(P 位=1),則釋放對應內存頁。	    free_page (0xfffff000 & *pg_table);	  *pg_table = 0;	// 該頁表項內容清零。	  pg_table++;		// 指向頁表中下一項。	}      free_page (0xfffff000 & *dir);	// 釋放該頁表所占內存頁面。但由于頁表在// 物理地址1M 以內,所以這句什么都不做。      *dir = 0;			// 對相應頁表的目錄項清零。    }  invalidate ();		// 刷新頁變換高速緩沖。  return 0;}/** Well, here is one of the most complicated functions in mm. It* copies a range of linerar addresses by copying only the pages.* Let's hope this is bug-free, 'cause this one I don't want to debug :-)** Note! We don't copy just any chunks of memory - addresses have to* be divisible by 4Mb (one page-directory entry), as this makes the* function easier. It's used only by fork anyway.** NOTE 2!! When from==0 we are copying kernel space for the first* fork(). Then we DONT want to copy a full page-directory entry, as* that would lead to some serious memory waste - we just copy the* first 160 pages - 640kB. Even that is more than we need, but it* doesn't take any more memory - we don't copy-on-write in the low* 1 Mb-range, so the pages can be shared with the kernel. Thus the* special case for nr=xxxx.*//** 好了,下面是內存管理mm 中最為復雜的程序之一。它通過只復制內存頁面* 來拷貝一定范圍內線性地址中的內容。希望代碼中沒有錯誤,因為我不想* 再調試這塊代碼了?。** 注意!我們并不是僅復制任何內存塊 - 內存塊的地址需要是4Mb 的倍數(正好* 一個頁目錄項對應的內存大?。驗檫@樣處理可使函數很簡單。不管怎樣,* 它僅被fork()使用(fork.c 第56 行)。** 注意2??!當from==0 時,是在為第一次fork()調用復制內核空間。此時我們* 不想復制整個頁目錄項對應的內存,因為這樣做會導致內存嚴重的浪費 - 我們* 只復制頭160 個頁面 - 對應640kB。即使是復制這些頁面也已經超出我們的需求,* 但這不會占用更多的內存 - 在低1Mb 內存范圍內我們不執行寫時復制操作,所以

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三四在线| 国产精品一线二线三线| 肉肉av福利一精品导航| 亚洲成a人片综合在线| 日本视频一区二区三区| 国产乱人伦精品一区二区在线观看 | 蜜臀a∨国产成人精品| 国产一区二区美女诱惑| 成人免费av资源| 日本福利一区二区| 欧美丰满高潮xxxx喷水动漫| 欧美成人vr18sexvr| 久久精品日产第一区二区三区高清版| 亚洲视频在线观看一区| 欧美在线视频你懂得| 亚洲午夜久久久久久久久电影院| 久久综合九色综合欧美亚洲| 中文字幕亚洲欧美在线不卡| 亚洲综合清纯丝袜自拍| 亚洲精品老司机| 日韩影视精彩在线| 国产馆精品极品| 不卡在线观看av| 欧美日本韩国一区二区三区视频 | 欧美一区二区三区影视| 欧美高清在线精品一区| 亚洲与欧洲av电影| 狠狠色狠狠色综合系列| 色欧美日韩亚洲| 精品国产91洋老外米糕| 亚洲综合另类小说| 国产真实乱子伦精品视频| 99久久精品一区| 欧美一区二区女人| 1区2区3区欧美| 激情伊人五月天久久综合| 色综合天天综合网国产成人综合天| 欧美日韩一区三区四区| 日韩精品一二三四| 欧美亚洲国产怡红院影院| 99久久精品免费看国产免费软件| 精久久久久久久久久久| 久久99久久精品欧美| 一本色道久久加勒比精品| 宅男在线国产精品| 中文字幕第一页久久| 久色婷婷小香蕉久久| 色综合久久综合| 欧美激情一区二区三区四区| 日本亚洲电影天堂| www.久久精品| 国产日韩欧美麻豆| 爽好久久久欧美精品| 色成年激情久久综合| 久久中文字幕电影| 午夜一区二区三区视频| 日本精品一区二区三区四区的功能| 欧美一区二区高清| 偷偷要91色婷婷| 91看片淫黄大片一级在线观看| 欧美久久久久久久久久| 自拍偷拍亚洲欧美日韩| 国模无码大尺度一区二区三区| 制服丝袜激情欧洲亚洲| 亚洲精品国产一区二区精华液| 韩日精品视频一区| 国产真实乱偷精品视频免| 久久99精品久久久久久国产越南 | 国产精品视频yy9299一区| 日韩不卡手机在线v区| 成人av电影在线播放| 欧美激情中文不卡| 精品一区二区三区免费视频| 日韩欧美一区二区不卡| 亚洲成人在线免费| 美女国产一区二区三区| 欧美一区二区私人影院日本| 一区二区国产视频| 在线日韩一区二区| 亚洲美女区一区| 一本一道久久a久久精品| 国产精品美女久久久久av爽李琼| 理论片日本一区| 精品人在线二区三区| 美腿丝袜亚洲综合| 精品国产精品网麻豆系列| 久久精品国产色蜜蜜麻豆| 久久这里只有精品6| 精品亚洲aⅴ乱码一区二区三区| 欧美一区二区观看视频| 国产资源精品在线观看| 欧美mv日韩mv| 成人午夜av影视| 国产精品私人自拍| 暴力调教一区二区三区| 中文字幕亚洲成人| 91色视频在线| 亚洲第一福利视频在线| 欧美日韩激情在线| 麻豆一区二区99久久久久| 日韩午夜激情视频| 国产传媒日韩欧美成人| 中文子幕无线码一区tr| 一本一道波多野结衣一区二区| 一区二区成人在线视频| 91在线码无精品| 午夜精品123| 日韩无一区二区| 国产成人在线网站| 亚洲免费大片在线观看| 在线成人免费观看| 蜜臀久久99精品久久久久久9| 91精品国产91久久综合桃花| 激情综合色播激情啊| 国产欧美一区二区精品性色超碰| 成人高清视频在线| 国产精品美女久久久久aⅴ| 丁香六月综合激情| 亚洲电影你懂得| 欧美xfplay| 色综合一区二区| 丝袜亚洲精品中文字幕一区| 久久久久99精品一区| 91免费视频网| 香蕉久久夜色精品国产使用方法| 欧美tk丨vk视频| 国内精品写真在线观看| 亚洲免费电影在线| 欧美一级理论片| 91在线你懂得| 奇米综合一区二区三区精品视频| 中文字幕免费不卡| 欧美在线free| 五月婷婷综合网| 国产精品美女久久久久久2018| 波多野结衣亚洲| 老汉av免费一区二区三区| 国产三级一区二区三区| 欧美精品丝袜中出| 国产成人福利片| 免费人成黄页网站在线一区二区 | 蜜臀av性久久久久蜜臀aⅴ流畅| 国产蜜臀av在线一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 久久蜜桃一区二区| 96av麻豆蜜桃一区二区| 韩国理伦片一区二区三区在线播放| 亚洲欧美日韩在线播放| 久久久国产精华| 69久久99精品久久久久婷婷| 99国产精品视频免费观看| 久久精品国产99| 日韩精品一级中文字幕精品视频免费观看| 亚洲国产电影在线观看| 精品美女一区二区| 91福利国产成人精品照片| 麻豆精品在线观看| 五月天激情小说综合| 国产精品久久久久久久久久免费看| 日韩欧美一区电影| 欧美三级日韩三级国产三级| 91社区在线播放| 国产成人免费视| 国产在线视频不卡二| 香蕉加勒比综合久久| 中文字幕中文字幕在线一区| 欧美不卡一二三| 色综合久久九月婷婷色综合| 成人动漫精品一区二区| 久久精品国产在热久久| 美日韩一级片在线观看| 亚洲一线二线三线视频| 亚洲乱码日产精品bd| 国产日产欧美一区| 久久久久99精品国产片| 欧美电视剧在线观看完整版| 91精品国产综合久久精品麻豆 | 亚洲图片激情小说| 国产精品青草久久| 26uuu成人网一区二区三区| 日韩精品一区二区三区swag| 7777精品伊人久久久大香线蕉超级流畅| 91成人网在线| 色婷婷av一区二区三区之一色屋| 91丨九色丨蝌蚪丨老版| 成人小视频免费在线观看| 久久97超碰国产精品超碰| 精品一区二区三区视频| 美女视频免费一区| 久久电影网电视剧免费观看| 午夜精品福利久久久| 免费成人美女在线观看.| 天堂蜜桃一区二区三区| 日本视频在线一区| 全部av―极品视觉盛宴亚洲| 久久精品噜噜噜成人av农村| 老司机免费视频一区二区 | 精品久久久久久久久久久院品网 | 国产精品久久免费看| 中文字幕欧美一区|