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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? buffer.c.bak

?? linux0.11原碼
?? BAK
?? 第 1 頁 / 共 2 頁
字號:
{	struct buffer_head * tmp, * bh;repeat:
	// 搜索hash 表,如果指定塊已經(jīng)在高速緩沖中,則返回對應(yīng)緩沖區(qū)頭指針,退出。	if (bh = get_hash_table(dev,block))		return bh;
// 掃描空閑數(shù)據(jù)塊鏈表,尋找空閑緩沖區(qū)。
// 首先讓tmp 指向空閑鏈表的第一個(gè)空閑緩沖區(qū)頭。	tmp = free_list;	do {
// 如果該緩沖區(qū)正被使用(引用計(jì)數(shù)不等于0),則繼續(xù)掃描下一項(xiàng)。
		if (tmp->b_count)
			continue;
// 如果緩沖頭指針bh 為空,或者tmp 所指緩沖頭的標(biāo)志(修改、鎖定)權(quán)重小于bh 頭標(biāo)志的權(quán)重,
// 則讓bh 指向該tmp 緩沖區(qū)頭。如果該tmp 緩沖區(qū)頭表明緩沖區(qū)既沒有修改也沒有鎖定標(biāo)志置位,
// 則說明已為指定設(shè)備上的塊取得對應(yīng)的高速緩沖區(qū),則退出循環(huán)。		if (!bh || BADNESS(tmp)<BADNESS(bh)) {			bh = tmp;			if (!BADNESS(tmp))				break;		}/* 重復(fù)操作直到找到適合的緩沖區(qū) */	} while ((tmp = tmp->b_next_free) != free_list);
// 如果所有緩沖區(qū)都正被使用(所有緩沖區(qū)的頭部引用計(jì)數(shù)都>0),
// 則睡眠,等待有空閑的緩沖區(qū)可用。	if (!bh) {		sleep_on(&buffer_wait);		goto repeat;	}
	// 等待該緩沖區(qū)解鎖(如果已被上鎖的話)。	wait_on_buffer(bh);
	// 如果該緩沖區(qū)又被其它任務(wù)使用的話,只好重復(fù)上述過程。	if (bh->b_count)		goto repeat;
// 如果該緩沖區(qū)已被修改,則將數(shù)據(jù)寫盤,并再次等待緩沖區(qū)解鎖。如果該緩沖區(qū)又被其它任務(wù)使用
// 的話,只好再重復(fù)上述過程。	while (bh->b_dirt) {		sync_dev(bh->b_dev);		wait_on_buffer(bh);		if (bh->b_count)			goto repeat;	}/* 注意!!當(dāng)進(jìn)程為了等待該緩沖塊而睡眠時(shí),其它進(jìn)程可能已經(jīng)將該緩沖塊 *//* 加入進(jìn)高速緩沖中,所以要對此進(jìn)行檢查。 */
// 在高速緩沖hash 表中檢查指定設(shè)備和塊的緩沖區(qū)是否已經(jīng)被加入進(jìn)去。如果是的話,就再次重復(fù)
// 上述過程。	if (find_buffer(dev,block))		goto repeat;/* OK,最終我們知道該緩沖區(qū)是指定參數(shù)的唯一一塊, *//* 而且還沒有被使用(b_count=0),未被上鎖(b_lock=0),并且是干凈的(未被修改的) */
// 于是讓我們占用此緩沖區(qū)。置引用計(jì)數(shù)為1,復(fù)位修改標(biāo)志和有效(更新)標(biāo)志。	bh->b_count=1;	bh->b_dirt=0;	bh->b_uptodate=0;
// 從hash 隊(duì)列和空閑塊鏈表中移出該緩沖區(qū)頭,讓該緩沖區(qū)用于指定設(shè)備和其上的指定塊。	remove_from_queues(bh);	bh->b_dev=dev;	bh->b_blocknr=block;
// 然后根據(jù)此新的設(shè)備號和塊號重新插入空閑鏈表和hash 隊(duì)列新位置處。并最終返回緩沖頭指針。	insert_into_queues(bh);	return bh;}
//// 釋放指定的緩沖區(qū)。
// 等待該緩沖區(qū)解鎖。引用計(jì)數(shù)遞減1。喚醒等待空閑緩沖區(qū)的進(jìn)程。void brelse(struct buffer_head * buf){	if (!buf)		// 如果緩沖頭指針無效則返回。		return;	wait_on_buffer(buf);	if (!(buf->b_count--))		panic("Trying to free free buffer");	wake_up(&buffer_wait);}/* * 從設(shè)備上讀取指定的數(shù)據(jù)塊并返回含有數(shù)據(jù)的緩沖區(qū)。如果指定的塊不存在 * 則返回NULL。 */
//// 從指定設(shè)備上讀取指定的數(shù)據(jù)塊。struct buffer_head * bread(int dev,int block){	struct buffer_head * bh;
// 在高速緩沖中申請一塊緩沖區(qū)。如果返回值是NULL 指針,表示內(nèi)核出錯(cuò),死機(jī)。	if (!(bh=getblk(dev,block)))		panic("bread: getblk returned NULL\n");
// 如果該緩沖區(qū)中的數(shù)據(jù)是有效的(已更新的)可以直接使用,則返回。	if (bh->b_uptodate)		return bh;
// 否則調(diào)用ll_rw_block()函數(shù),產(chǎn)生讀設(shè)備塊請求。并等待緩沖區(qū)解鎖。	ll_rw_block(READ,bh);	wait_on_buffer(bh);
// 如果該緩沖區(qū)已更新,則返回緩沖區(qū)頭指針,退出。	if (bh->b_uptodate)		return bh;
// 否則表明讀設(shè)備操作失敗,釋放該緩沖區(qū),返回NULL 指針,退出。	brelse(bh);	return NULL;}
//// 復(fù)制內(nèi)存塊。
// 從from 地址復(fù)制一塊數(shù)據(jù)到to 位置。
extern __inline void COPYBLK(char* from, char* to)
{_asm{
	mov ecx,BLOCK_SIZE/4
	mov esi,from
	mov edi,to
	cld
	rep movsd
}}/*#define COPYBLK(from,to) \__asm__("cld\n\t" \	"rep\n\t" \	"movsl\n\t" \	::"c" (BLOCK_SIZE/4),"S" (from),"D" (to) \	:"cx","di","si")*//* * bread_page 一次讀四個(gè)緩沖塊內(nèi)容讀到內(nèi)存指定的地址。它是一個(gè)完整的函數(shù),
 * 因?yàn)橥瑫r(shí)讀取四塊可以獲得速度上的好處,不用等著讀一塊,再讀一塊了。 */
//// 讀設(shè)備上一個(gè)頁面(4 個(gè)緩沖塊)的內(nèi)容到內(nèi)存指定的地址。void bread_page(unsigned long address,int dev,int b[4]){	struct buffer_head * bh[4];	int i;
// 循環(huán)執(zhí)行4 次,讀一頁內(nèi)容。	for (i=0 ; i<4 ; i++)		if (b[i]) {
// 取高速緩沖中指定設(shè)備和塊號的緩沖區(qū),如果該緩沖區(qū)數(shù)據(jù)無效則產(chǎn)生讀設(shè)備請求。			if (bh[i] = getblk(dev,b[i]))				if (!bh[i]->b_uptodate)					ll_rw_block(READ,bh[i]);		} else			bh[i] = NULL;
// 將4 塊緩沖區(qū)上的內(nèi)容順序復(fù)制到指定地址處。	for (i=0 ; i<4 ; i++,address += BLOCK_SIZE)		if (bh[i]) {			wait_on_buffer(bh[i]);	// 等待緩沖區(qū)解鎖(如果已被上鎖的話)。			if (bh[i]->b_uptodate)	// 如果該緩沖區(qū)中數(shù)據(jù)有效的話,則復(fù)制。				COPYBLK(bh[i]->b_data,(char *)address);			brelse(bh[i]);		// 釋放該緩沖區(qū)。		}}/* * OK,breada 可以象bread 一樣使用,但會(huì)另外預(yù)讀一些塊。該函數(shù)參數(shù)列表
 * 需要使用一個(gè)負(fù)數(shù)來表明參數(shù)列表的結(jié)束。 */
//// 從指定設(shè)備讀取指定的一些塊。
// 成功時(shí)返回第1 塊的緩沖區(qū)頭指針,否則返回NULL。struct buffer_head * breada(int dev,int first, ...){	va_list args;	struct buffer_head * bh, *tmp;
// 取可變參數(shù)表中第1 個(gè)參數(shù)(塊號)。	va_start(args,first);
// 取高速緩沖中指定設(shè)備和塊號的緩沖區(qū)。如果該緩沖區(qū)數(shù)據(jù)無效,則發(fā)出讀設(shè)備數(shù)據(jù)塊請求。	if (!(bh=getblk(dev,first)))		panic("bread: getblk returned NULL\n");	if (!bh->b_uptodate)		ll_rw_block(READ,bh);
// 然后順序取可變參數(shù)表中其它預(yù)讀塊號,并作與上面同樣處理,但不引用。	while ((first=va_arg(args,int))>=0) {		tmp=getblk(dev,first);		if (tmp) {			if (!tmp->b_uptodate)				ll_rw_block(READA,bh);			tmp->b_count--;		}	}
// 可變參數(shù)表中所有參數(shù)處理完畢。等待第1 個(gè)緩沖區(qū)解鎖(如果已被上鎖)。	va_end(args);	wait_on_buffer(bh);
// 如果緩沖區(qū)中數(shù)據(jù)有效,則返回緩沖區(qū)頭指針,退出。否則釋放該緩沖區(qū),返回NULL,退出。	if (bh->b_uptodate)		return bh;	brelse(bh);	return (NULL);}
//// 緩沖區(qū)初始化函數(shù)。
// 參數(shù)buffer_end 是指定的緩沖區(qū)內(nèi)存的末端。對于系統(tǒng)有16MB 內(nèi)存,則緩沖區(qū)末端設(shè)置為4MB。
// 對于系統(tǒng)有8MB 內(nèi)存,緩沖區(qū)末端設(shè)置為2MB。void buffer_init(long buffer_end){	struct buffer_head * h = start_buffer;	void * b;	int i;
// 如果緩沖區(qū)高端等于1Mb,則由于從640KB-1MB 被顯示內(nèi)存和BIOS 占用,因此實(shí)際可用緩沖區(qū)內(nèi)存
// 高端應(yīng)該是640KB。否則內(nèi)存高端一定大于1MB。	if (buffer_end == 1<<20)		b = (void *) (640*1024);	else		b = (void *) buffer_end;
// 這段代碼用于初始化緩沖區(qū),建立空閑緩沖區(qū)環(huán)鏈表,并獲取系統(tǒng)中緩沖塊的數(shù)目。
// 操作的過程是從緩沖區(qū)高端開始劃分1K 大小的緩沖塊,與此同時(shí)在緩沖區(qū)低端建立描述該緩沖塊
// 的結(jié)構(gòu)buffer_head,并將這些buffer_head 組成雙向鏈表。
// h 是指向緩沖頭結(jié)構(gòu)的指針,而h+1 是指向內(nèi)存地址連續(xù)的下一個(gè)緩沖頭地址,也可以說是指向h
// 緩沖頭的末端外。為了保證有足夠長度的內(nèi)存來存儲一個(gè)緩沖頭結(jié)構(gòu),需要b 所指向的內(nèi)存塊
// 地址>= h 緩沖頭的末端,也即要>=h+1。	while ( (b = (char*)b - BLOCK_SIZE) >= ((void *) (h+1)) ) {		h->b_dev = 0;			// 使用該緩沖區(qū)的設(shè)備號。		h->b_dirt = 0;			// 臟標(biāo)志,也即緩沖區(qū)修改標(biāo)志。		h->b_count = 0;			// 該緩沖區(qū)引用計(jì)數(shù)。		h->b_lock = 0;			// 緩沖區(qū)鎖定標(biāo)志。		h->b_uptodate = 0;		// 緩沖區(qū)更新標(biāo)志(或稱數(shù)據(jù)有效標(biāo)志)。		h->b_wait = NULL;		// 指向等待該緩沖區(qū)解鎖的進(jìn)程。		h->b_next = NULL;		// 指向具有相同hash 值的下一個(gè)緩沖頭。		h->b_prev = NULL;		// 指向具有相同hash 值的前一個(gè)緩沖頭。		h->b_data = (char *) b;	// 指向?qū)?yīng)緩沖區(qū)數(shù)據(jù)塊(1024 字節(jié))。		h->b_prev_free = h-1;	// 指向鏈表中前一項(xiàng)。		h->b_next_free = h+1;	// 指向鏈表中下一項(xiàng)。
		h++;					// h 指向下一新緩沖頭位置。		NR_BUFFERS++;			// 緩沖區(qū)塊數(shù)累加。		if (b == (void *) 0x100000)		// 如果地址b 遞減到等于1MB,則跳過384KB,			b = (void *) 0xA0000;		// 讓b 指向地址0xA0000(640KB)處。	}	h--;			// 讓h 指向最后一個(gè)有效緩沖頭。	free_list = start_buffer;		// 讓空閑鏈表頭指向頭一個(gè)緩沖區(qū)頭。	free_list->b_prev_free = h;		// 鏈表頭的b_prev_free 指向前一項(xiàng)(即最后一項(xiàng))。	h->b_next_free = free_list;		// h 的下一項(xiàng)指針指向第一項(xiàng),形成一個(gè)環(huán)鏈。
	// 初始化hash 表(哈希表、散列表),置表中所有的指針為NULL。	for (i=0;i<NR_HASH;i++)		hash_table[i]=NULL;}	

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合一二三区| 国产精品久久久久一区| 国产最新精品免费| 欧美激情在线看| 91麻豆精品在线观看| 亚洲在线免费播放| 日韩欧美三级在线| 国产a区久久久| 依依成人综合视频| 欧美一区二区三区四区五区| 韩国女主播一区二区三区| 中文字幕国产一区| 欧美性生活久久| 极品少妇xxxx精品少妇| 欧美国产精品中文字幕| 欧美区一区二区三区| 国内精品久久久久影院色| 1024亚洲合集| 欧美不卡视频一区| 色婷婷av一区二区三区软件 | 欧美三级蜜桃2在线观看| 日韩精品中文字幕在线不卡尤物 | 免费av成人在线| 欧美男人的天堂一二区| 九一九一国产精品| 国产精品剧情在线亚洲| 日韩一区二区三区视频| 99久久国产综合色|国产精品| 午夜国产精品一区| 中文字幕欧美日本乱码一线二线| 911精品国产一区二区在线| 99久久久久久| 国产精品一二三四| 日本欧美加勒比视频| 自拍偷拍亚洲综合| 欧美精品一区在线观看| 欧美视频一区在线观看| 成人精品免费看| 蜜桃视频在线观看一区二区| 亚洲激情综合网| 国产精品女同一区二区三区| 亚洲一区在线播放| 成人一级黄色片| 欧美影院一区二区| 亚洲欧美日韩国产手机在线 | 欧美视频一区二区在线观看| 成人综合在线网站| 韩国av一区二区| 亚洲成人一区二区| 亚洲视频资源在线| 国产精品人成在线观看免费| 精品处破学生在线二十三| 欧美一区二区福利在线| 欧美日韩精品一区二区| 91国产免费看| 色婷婷综合中文久久一本| 成av人片一区二区| 久久电影网电视剧免费观看| 日韩电影在线一区| 亚洲成人动漫精品| 国产精品国产三级国产aⅴ无密码| 蜜桃传媒麻豆第一区在线观看| 欧美日韩一级二级| 国模套图日韩精品一区二区| 国产麻豆视频精品| 午夜精品久久久久影视| 欧美高清www午色夜在线视频| 国产一区二区免费在线| 国产福利不卡视频| 97久久精品人人澡人人爽| 99国产精品国产精品久久| 欧美性大战久久久久久久| 日韩欧美在线网站| 国产欧美精品一区| 亚洲色图欧美激情| 日韩av午夜在线观看| 国产成人精品亚洲午夜麻豆| 91捆绑美女网站| 4438x成人网最大色成网站| 26uuu亚洲婷婷狠狠天堂| 亚洲视频图片小说| 免费视频最近日韩| 成人免费va视频| 欧美日韩在线播| 国产午夜精品一区二区| 亚洲国产日韩精品| 亚洲综合男人的天堂| 国产一区二区三区不卡在线观看| 亚洲大尺度视频在线观看| 激情偷乱视频一区二区三区| av在线不卡电影| 91精品国产欧美一区二区成人| 国产精品丝袜一区| 日韩高清欧美激情| 91视频免费播放| 欧美精品一区男女天堂| 亚洲高清免费在线| 成人永久免费视频| 日韩欧美综合在线| 一区二区三区欧美久久| 国产馆精品极品| 91精品国产91久久久久久最新毛片 | 日韩精品视频网站| 国产精品18久久久久久久久久久久| 欧美三级三级三级爽爽爽| 国产欧美日韩综合| 麻豆精品视频在线| 欧美影院一区二区三区| 中文字幕在线一区| 九一九一国产精品| 欧美日韩夫妻久久| 亚洲精品日日夜夜| 成人动漫精品一区二区| 精品处破学生在线二十三| 亚洲国产精品久久不卡毛片| 99久久精品国产网站| 久久一二三国产| 喷水一区二区三区| 精品视频色一区| 亚洲影视资源网| 91亚洲国产成人精品一区二区三| 久久久精品综合| 久久精品久久久精品美女| 91精品免费在线观看| 五月婷婷综合激情| 欧美日韩一区二区欧美激情| 一区二区三区日韩精品视频| 成人国产精品免费观看动漫| 国产午夜精品美女毛片视频| 国产自产视频一区二区三区| 精品久久国产老人久久综合| 久久精品国产精品亚洲红杏 | 国产精品久线在线观看| 国产suv精品一区二区三区| 欧美精品一区在线观看| 精品亚洲欧美一区| 日韩免费观看2025年上映的电影| 亚洲123区在线观看| 欧美卡1卡2卡| 日韩精品亚洲一区| 欧美一区国产二区| 免费在线看一区| 欧美一级搡bbbb搡bbbb| 精品一区二区在线播放| 久久综合久久鬼色中文字| 国产乱码精品一品二品| 久久久99久久| 不卡视频在线看| 一区二区免费在线播放| 欧美日韩极品在线观看一区| 日日噜噜夜夜狠狠视频欧美人| 日韩一区二区免费在线观看| 黄色精品一二区| 日本一区二区免费在线观看视频 | 欧美精品久久99| 人人爽香蕉精品| 欧美tickling挠脚心丨vk| 狠狠色丁香婷婷综合| 国产精品亲子乱子伦xxxx裸| 91免费国产视频网站| 一区二区三区精品在线| 欧美一区二区视频免费观看| 国产一区二区三区| 亚洲美女屁股眼交| 欧美久久久久中文字幕| 久久99久久精品欧美| 国产精品久久久久久久久图文区| 91在线观看美女| 亚洲成人精品一区二区| 久久一区二区三区四区| 一本一本大道香蕉久在线精品 | 毛片av一区二区| 国产香蕉久久精品综合网| 92国产精品观看| 热久久一区二区| 中文一区一区三区高中清不卡| 色美美综合视频| 久久国产婷婷国产香蕉| 亚洲日穴在线视频| 日韩欧美国产三级电影视频| av电影在线观看不卡| 丝袜a∨在线一区二区三区不卡| 久久久久久久久久久久久久久99 | 奇米精品一区二区三区四区| 国产精品欧美一级免费| 67194成人在线观看| 国产成人av电影在线| 亚洲一区二区三区不卡国产欧美| 欧美一区二区三区色| 色综合久久久久久久久久久| 久久电影国产免费久久电影| 一区二区三区在线视频免费 | 亚洲成人精品一区二区| 国产精品青草综合久久久久99| 91精品国产色综合久久不卡电影 | 精品91自产拍在线观看一区| 日本精品视频一区二区| 国产精品一区专区| 人人爽香蕉精品| 亚洲国产综合91精品麻豆|