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

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

?? ll_rw_blk.c

?? LINUX 0.11版內核代碼。 并有代碼分析說明。
?? C
字號:
/* passed* linux/kernel/blk_dev/ll_rw.c** (C) 1991 Linus Torvalds*/#include <set_seg.h>
/** This handles all read/write requests to block devices*//** 該程序處理塊設備的所有讀/寫操作。*/#include <errno.h>		// 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)#include <linux/sched.h>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。#include <asm/system.h>		// 系統頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。#include "blk.h"		// 塊設備頭文件。定義請求數據結構、塊設備數據結構和宏函數等信息。/** The request-struct contains all necessary data* to load a nr of sectors into memory*//** 請求結構中含有加載nr 扇區數據到內存的所有必須的信息。*/struct request request[NR_REQUEST] = {0};/** used to wait on when there are no free requests*//* 是用于請求數組沒有空閑項時的臨時等待處 */struct task_struct *wait_for_request = NULL;/* blk_dev_struct is:* do_request-address* next-request*//* blk_dev_struct 塊設備結構是:(kernel/blk_drv/blk.h,23)* do_request-address //對應主設備號的請求處理程序指針。* current-request // 該設備的下一個請求。*/// 該數組使用主設備號作為索引(下標)。struct blk_dev_struct blk_dev[NR_BLK_DEV] = {	{NULL, NULL},		/* no_dev */// 0 - 無設備。	{NULL, NULL},		/* dev mem */// 1 - 內存。	{NULL, NULL},		/* dev fd */// 2 - 軟驅設備。	{NULL, NULL},		/* dev hd */// 3 - 硬盤設備。	{NULL, NULL},		/* dev ttyx */// 4 - ttyx 設備。	{NULL, NULL},		/* dev tty */// 5 - tty 設備。	{NULL, NULL}		/* dev lp */// 6 - lp 打印機設備。};// 鎖定指定的緩沖區bh。如果指定的緩沖區已經被其它任務鎖定,則使自己睡眠(不可中斷地等待),// 直到被執行解鎖緩沖區的任務明確地喚醒。static _inline voidlock_buffer (struct buffer_head *bh){	cli ();			// 清中斷許可。	while (bh->b_lock)		// 如果緩沖區已被鎖定,則睡眠,直到緩沖區解鎖。		sleep_on (&bh->b_wait);	bh->b_lock = 1;		// 立刻鎖定該緩沖區。	sti ();			// 開中斷。}// 釋放(解鎖)鎖定的緩沖區。static _inline voidunlock_buffer (struct buffer_head *bh){	if (!bh->b_lock)		// 如果該緩沖區并沒有被鎖定,則打印出錯信息。		printk ("ll_rw_block.c: buffer not locked\n\r");	bh->b_lock = 0;		// 清鎖定標志。	wake_up (&bh->b_wait);	// 喚醒等待該緩沖區的任務。}/** add-request adds a request to the linked list.* It disables interrupts so that it can muck with the* request-lists in peace.*//** add-request()向連表中加入一項請求。它關閉中斷,* 這樣就能安全地處理請求連表了 *///// 向鏈表中加入請求項。參數dev 指定塊設備,req 是請求的結構信息。  static voidadd_request (struct blk_dev_struct *dev, struct request *req){	struct request *tmp;	req->next = NULL;	cli ();			// 關中斷。	if (req->bh)		req->bh->b_dirt = 0;	// 清緩沖區“臟”標志。// 如果dev 的當前請求(current_request)子段為空,則表示目前該設備沒有請求項,本次是第1 個// 請求項,因此可將塊設備當前請求指針直接指向請求項,并立刻執行相應設備的請求函數。	if (!(tmp = dev->current_request))	{		dev->current_request = req;		sti ();			// 開中斷。		(dev->request_fn) ();	// 執行設備請求函數,對于硬盤(3)是do_hd_request()。		return;	}// 如果目前該設備已經有請求項在等待,則首先利用電梯算法搜索最佳位置,然后將當前請求插入// 請求鏈表中。	for (; tmp->next; tmp = tmp->next)	if ((IN_ORDER (tmp, req) ||		!IN_ORDER (tmp, tmp->next)) && IN_ORDER (req, tmp->next))		break;	req->next = tmp->next;	tmp->next = req;	sti ();}//// 創建請求項并插入請求隊列。參數是:主設備號major,命令rw,存放數據的緩沖區頭指針bh。static voidmake_request (int major, int rw, struct buffer_head *bh){	struct request *req;	int rw_ahead;/* WRITEA/READA 是特殊的情況 - 它們并不是必要的,所以如果緩沖區已經上鎖,*//* 我們就不管它而退出,否則的話就執行一般的讀/寫操作。 */// 這里'READ'和'WRITE'后面的'A'字符代表英文單詞Ahead,表示提前預讀/寫數據塊的意思。// 當指定的緩沖區正在使用,已被上鎖時,就放棄預讀/寫請求。	if (rw_ahead = (rw == READA || rw == WRITEA))	{		if (bh->b_lock)			return;		if (rw == READA)			rw = READ;		else			rw = WRITE;	}// 如果命令不是READ 或WRITE 則表示內核程序有錯,顯示出錯信息并死機。	if (rw != READ && rw != WRITE)		panic ("Bad block dev command, must be R/W/RA/WA");// 鎖定緩沖區,如果緩沖區已經上鎖,則當前任務(進程)就會睡眠,直到被明確地喚醒。	lock_buffer (bh);// 如果命令是寫并且緩沖區數據不臟,或者命令是讀并且緩沖區數據是更新過的,則不用添加// 這個請求。將緩沖區解鎖并退出。	if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate))	{		unlock_buffer (bh);		return;	}repeat:/* 我們不能讓隊列中全都是寫請求項:我們需要為讀請求保留一些空間:讀操作* 是優先的。請求隊列的后三分之一空間是為讀準備的。*/// 請求項是從請求數組末尾開始搜索空項填入的。根據上述要求,對于讀命令請求,可以直接// 從隊列末尾開始操作,而寫請求則只能從隊列的2/3 處向頭上搜索空項填入。	if (rw == READ)		req = request + NR_REQUEST;	// 對于讀請求,將隊列指針指向隊列尾部。	else		req = request + ((NR_REQUEST * 2) / 3);	// 對于寫請求,隊列指針指向隊列2/3 處。/* 搜索一個空請求項 */// 從后向前搜索,當請求結構request 的dev 字段值=-1 時,表示該項未被占用。	while (--req >= request)		if (req->dev < 0)			break;/* 如果沒有找到空閑項,則讓該次新請求睡眠:需檢查是否提前讀/寫 */// 如果沒有一項是空閑的(此時request 數組指針已經搜索越過頭部),則查看此次請求是否是// 提前讀/寫(READA 或WRITEA),如果是則放棄此次請求。否則讓本次請求睡眠(等待請求隊列// 騰出空項),過一會再來搜索請求隊列。	if (req < request)	{				// 如果請求隊列中沒有空項,則		if (rw_ahead)		{			// 如果是提前讀/寫請求,則解鎖緩沖區,退出。			unlock_buffer (bh);			return;		}		sleep_on (&wait_for_request);	// 否則讓本次請求睡眠,過會再查看請求隊列。		goto repeat;	}/* 向空閑請求項中填寫請求信息,并將其加入隊列中 */// 請求結構參見(kernel/blk_drv/blk.h,23)。	req->dev = bh->b_dev;		// 設備號。	req->cmd = rw;		// 命令(READ/WRITE)。	req->errors = 0;		// 操作時產生的錯誤次數。	req->sector = bh->b_blocknr << 1;	// 起始扇區。(1 塊=2 扇區)	req->nr_sectors = 2;		// 讀寫扇區數。	req->buffer = bh->b_data;	// 數據緩沖區。	req->waiting = NULL;		// 任務等待操作執行完成的地方。	req->bh = bh;			// 緩沖區頭指針。	req->next = NULL;		// 指向下一請求項。	add_request (major + blk_dev, req);	// 將請求項加入隊列中(blk_dev[major],req)。}//// 低層讀寫數據塊函數。// 該函數主要是在fs/buffer.c 中被調用。實際的讀寫操作是由設備的request_fn()函數完成。// 對于硬盤操作,該函數是do_hd_request()。(kernel/blk_drv/hd.c,294)void ll_rw_block (int rw, struct buffer_head *bh){	unsigned int major;		// 主設備號(對于硬盤是3)。// 如果設備的主設備號不存在或者該設備的讀寫操作函數不存在,則顯示出錯信息,并返回。	if ((major = MAJOR (bh->b_dev)) >= NR_BLK_DEV ||		!(blk_dev[major].request_fn))	{		printk ("Trying to read nonexistent block-device\n\r");		return;	}	make_request (major, rw, bh);	// 創建請求項并插入請求隊列。}//// 塊設備初始化函數,由初始化程序main.c 調用(init/main.c,128)。// 初始化請求數組,將所有請求項置為空閑項(dev = -1)。有32 項(NR_REQUEST = 32)。void blk_dev_init (void){	int i;	for (i = 0; i < NR_REQUEST; i++)	{		request[i].dev = -1;		request[i].next = NULL;	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三区免费完整视频在线观看| 欧美一卡二卡在线观看| 国产69精品久久777的优势| 秋霞电影一区二区| 五月天一区二区| 天堂久久一区二区三区| 日本不卡高清视频| 久久69国产一区二区蜜臀 | 色综合 综合色| 色婷婷综合久久久中文一区二区| 91免费看`日韩一区二区| 99久久99久久久精品齐齐| 日本久久电影网| 欧美卡1卡2卡| 久久综合色8888| 国产精品污www在线观看| 亚洲视频图片小说| 天天综合色天天综合色h| 国内精品写真在线观看| gogo大胆日本视频一区| 色婷婷av久久久久久久| 欧美区在线观看| 亚洲精品一区二区三区福利| 国产精品久久久久婷婷| 婷婷国产在线综合| 国产精品影视天天线| 99久久精品久久久久久清纯| 欧美日韩国产一区| 久久久国产精品不卡| 自拍偷拍国产亚洲| 久久99国产精品久久99| 99精品视频在线播放观看| 666欧美在线视频| 日本一区二区三区国色天香| 亚洲国产精品精华液网站| 激情综合五月天| 在线观看免费成人| 久久精品一区二区三区av | 欧美一级二级三级乱码| 国产精品女主播在线观看| 婷婷开心久久网| 97精品国产露脸对白| 日韩一区二区三区观看| 一区二区三区日韩精品视频| 国产一区二区美女诱惑| 欧美日韩国产一级| 亚洲日本电影在线| 国产精品99久| 日韩一级视频免费观看在线| 一区二区在线电影| 成人免费高清在线| 欧美精品一区二区不卡| 亚洲国产欧美在线人成| 成人黄色大片在线观看| 欧美va亚洲va香蕉在线| 亚洲电影视频在线| 色呦呦网站一区| 国产免费久久精品| 国产专区欧美精品| 日韩欧美电影在线| 午夜精品久久久久久久久| 色哟哟一区二区三区| 国产精品三级视频| 国产成人精品一区二区三区网站观看 | 秋霞午夜鲁丝一区二区老狼| 欧美四级电影在线观看| 一区二区三区自拍| 色嗨嗨av一区二区三区| 中文字幕一区在线| 成人免费不卡视频| 中文字幕在线一区二区三区| 国产不卡在线一区| 国产精品日韩成人| av色综合久久天堂av综合| 中文字幕中文字幕中文字幕亚洲无线| 国产一区二区三区综合| 亚洲精品在线免费观看视频| 国产综合久久久久久鬼色 | 成人爽a毛片一区二区免费| 久久尤物电影视频在线观看| 国产一区二区在线观看免费| 国产无人区一区二区三区| 成人一级视频在线观看| 欧美激情一区二区在线| 色综合天天综合网天天看片| 亚洲欧美国产77777| 欧美日韩精品欧美日韩精品| 麻豆精品一区二区综合av| 久久久国产综合精品女国产盗摄| 风流少妇一区二区| 夜夜精品浪潮av一区二区三区| 欧美午夜片在线看| 久久激情五月激情| 国产精品天天摸av网| 欧美亚一区二区| 黄页网站大全一区二区| 中文字幕亚洲区| 欧美精品久久久久久久多人混战| 国内精品伊人久久久久av影院| 日韩美女视频一区二区| 这里只有精品99re| 国产不卡视频在线播放| 亚洲福利一区二区三区| 久久综合色天天久久综合图片| eeuss国产一区二区三区| 一个色在线综合| 久久久久国产一区二区三区四区| 91猫先生在线| 久久se精品一区精品二区| 亚洲人成精品久久久久| 欧美成人猛片aaaaaaa| 色综合久久中文综合久久97| 日本最新不卡在线| 亚洲人成亚洲人成在线观看图片 | 亚洲不卡在线观看| 国产日韩欧美制服另类| 欧美三级中文字| 不卡一二三区首页| 美女在线观看视频一区二区| 亚洲人成亚洲人成在线观看图片| 欧美变态tickle挠乳网站| 色偷偷久久人人79超碰人人澡| 韩国毛片一区二区三区| 亚洲超丰满肉感bbw| 日韩毛片精品高清免费| 久久综合国产精品| 在线播放91灌醉迷j高跟美女| 成人国产精品免费网站| 精品亚洲免费视频| 亚洲成人久久影院| 中文字幕一区二区日韩精品绯色| 精品久久久久久久一区二区蜜臀| 欧美性感一区二区三区| 99久久精品免费| 成人的网站免费观看| 国产一区二区三区在线观看免费| 视频在线观看国产精品| 亚洲一二三级电影| 一区二区三区欧美久久| 亚洲免费在线看| 亚洲欧洲一区二区三区| 欧美国产日韩一二三区| 久久久99免费| 久久免费看少妇高潮| 日韩视频永久免费| 在线不卡中文字幕| 9191成人精品久久| 6080日韩午夜伦伦午夜伦| 欧美另类变人与禽xxxxx| 欧美日韩国产精品成人| 欧美日韩国产在线观看| 欧美日韩国产小视频在线观看| 欧美日韩卡一卡二| 777久久久精品| 日韩一级片在线观看| 欧美不卡一区二区三区四区| 日韩女优毛片在线| 久久精品亚洲精品国产欧美kt∨| 久久你懂得1024| 国产精品免费网站在线观看| 亚洲欧洲精品一区二区三区不卡| 国产精品不卡在线观看| 亚洲另类中文字| 图片区小说区国产精品视频| 免费成人小视频| 国产另类ts人妖一区二区| 福利电影一区二区| 91高清视频免费看| 欧美欧美欧美欧美首页| 欧美本精品男人aⅴ天堂| 国产视频一区二区在线观看| 自拍av一区二区三区| 亚洲高清一区二区三区| 久久99最新地址| a在线欧美一区| 欧美夫妻性生活| 久久九九久久九九| 亚洲综合色网站| 国产自产高清不卡| 色婷婷久久99综合精品jk白丝| 69久久夜色精品国产69蝌蚪网 | aa级大片欧美| 51精品视频一区二区三区| 国产网红主播福利一区二区| 一区二区三区在线视频免费观看 | 中文字幕字幕中文在线中不卡视频| 五月天中文字幕一区二区| 国产综合久久久久影院| 在线精品观看国产| 久久嫩草精品久久久精品| 亚洲一区二区三区四区五区中文| 久久精品999| 欧美性色综合网| 国产精品蜜臀在线观看| 首页国产欧美日韩丝袜| 99精品黄色片免费大全| 日韩精品专区在线影院重磅| 亚洲人成网站在线| 丁香网亚洲国际| 日韩一级成人av|