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

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

?? ll_rw_blk.c

?? LINUX 0.11版內(nèi)核代碼。 并有代碼分析說明。
?? C
字號:
/** linux/kernel/blk_dev/ll_rw.c** (C) 1991 Linus Torvalds*//** This handles all read/write requests to block devices*//** 該程序處理塊設備的所有讀/寫操作。*/#include <errno.h>		// 錯誤號頭文件。包含系統(tǒng)中各種出錯號。(Linus 從minix 中引進的)#include <linux/sched.h>	// 調(diào)度程序頭文件,定義了任務結(jié)構(gòu)task_struct、初始任務0 的數(shù)據(jù),// 還有一些有關(guān)描述符參數(shù)設置和獲取的嵌入式匯編函數(shù)宏語句。#include <linux/kernel.h>	// 內(nèi)核頭文件。含有一些內(nèi)核常用函數(shù)的原形定義。#include <asm/system.h>		// 系統(tǒng)頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。#include "blk.h"		// 塊設備頭文件。定義請求數(shù)據(jù)結(jié)構(gòu)、塊設備數(shù)據(jù)結(jié)構(gòu)和宏函數(shù)等信息。/** The request-struct contains all necessary data* to load a nr of sectors into memory*//** 請求結(jié)構(gòu)中含有加載nr 扇區(qū)數(shù)據(jù)到內(nèi)存的所有必須的信息。*/struct request request[NR_REQUEST];/** used to wait on when there are no free requests*//* 是用于請求數(shù)組沒有空閑項時的臨時等待處 */struct task_struct *wait_for_request = NULL;/* blk_dev_struct is:* do_request-address* next-request*//* blk_dev_struct 塊設備結(jié)構(gòu)是:(kernel/blk_drv/blk.h,23)* do_request-address //對應主設備號的請求處理程序指針。* current-request // 該設備的下一個請求。*/// 該數(shù)組使用主設備號作為索引(下標)。struct blk_dev_struct blk_dev[NR_BLK_DEV] = {  {NULL, NULL},			/* no_dev */// 0 - 無設備。  {NULL, NULL},			/* dev mem */// 1 - 內(nèi)存。  {NULL, NULL},			/* dev fd */// 2 - 軟驅(qū)設備。  {NULL, NULL},			/* dev hd */// 3 - 硬盤設備。  {NULL, NULL},			/* dev ttyx */// 4 - ttyx 設備。  {NULL, NULL},			/* dev tty */// 5 - tty 設備。  {NULL, NULL}			/* dev lp */// 6 - lp 打印機設備。};// 鎖定指定的緩沖區(qū)bh。如果指定的緩沖區(qū)已經(jīng)被其它任務鎖定,則使自己睡眠(不可中斷地等待),// 直到被執(zhí)行解鎖緩沖區(qū)的任務明確地喚醒。static inline voidlock_buffer (struct buffer_head *bh){  cli ();			// 清中斷許可。  while (bh->b_lock)		// 如果緩沖區(qū)已被鎖定,則睡眠,直到緩沖區(qū)解鎖。    sleep_on (&bh->b_wait);  bh->b_lock = 1;		// 立刻鎖定該緩沖區(qū)。  sti ();			// 開中斷。}// 釋放(解鎖)鎖定的緩沖區(qū)。static inline voidunlock_buffer (struct buffer_head *bh){  if (!bh->b_lock)		// 如果該緩沖區(qū)并沒有被鎖定,則打印出錯信息。    printk ("ll_rw_block.c: buffer not locked\n\r");  bh->b_lock = 0;		// 清鎖定標志。  wake_up (&bh->b_wait);	// 喚醒等待該緩沖區(qū)的任務。}/** 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()向連表中加入一項請求。它關(guān)閉中斷,* 這樣就能安全地處理請求連表了 */*///// 向鏈表中加入請求項。參數(shù)dev 指定塊設備,req 是請求的結(jié)構(gòu)信息。  static voidadd_request (struct blk_dev_struct *dev, struct request *req){  struct request *tmp;  req->next = NULL;  cli ();			// 關(guān)中斷。  if (req->bh)    req->bh->b_dirt = 0;	// 清緩沖區(qū)“臟”標志。// 如果dev 的當前請求(current_request)子段為空,則表示目前該設備沒有請求項,本次是第1 個// 請求項,因此可將塊設備當前請求指針直接指向請求項,并立刻執(zhí)行相應設備的請求函數(shù)。  if (!(tmp = dev->current_request))    {      dev->current_request = req;      sti ();			// 開中斷。      (dev->request_fn) ();	// 執(zhí)行設備請求函數(shù),對于硬盤(3)是do_hd_request()。      return;    }// 如果目前該設備已經(jīng)有請求項在等待,則首先利用電梯算法搜索最佳位置,然后將當前請求插入// 請求鏈表中。  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 ();}//// 創(chuàng)建請求項并插入請求隊列。參數(shù)是:主設備號major,命令rw,存放數(shù)據(jù)的緩沖區(qū)頭指針bh。static voidmake_request (int major, int rw, struct buffer_head *bh){  struct request *req;  int rw_ahead;/* WRITEA/READA is special case - it is not really needed, so if the *//* buffer is locked, we just forget about it, else it's a normal read *//* WRITEA/READA 是特殊的情況 - 它們并不是必要的,所以如果緩沖區(qū)已經(jīng)上鎖,*//* 我們就不管它而退出,否則的話就執(zhí)行一般的讀/寫操作。 */// 這里'READ'和'WRITE'后面的'A'字符代表英文單詞Ahead,表示提前預讀/寫數(shù)據(jù)塊的意思。// 當指定的緩沖區(qū)正在使用,已被上鎖時,就放棄預讀/寫請求。  if (rw_ahead = (rw == READA || rw == WRITEA))    {      if (bh->b_lock)	return;      if (rw == READA)	rw = READ;      else	rw = WRITE;    }// 如果命令不是READ 或WRITE 則表示內(nèi)核程序有錯,顯示出錯信息并死機。  if (rw != READ && rw != WRITE)    panic ("Bad block dev command, must be R/W/RA/WA");// 鎖定緩沖區(qū),如果緩沖區(qū)已經(jīng)上鎖,則當前任務(進程)就會睡眠,直到被明確地喚醒。  lock_buffer (bh);// 如果命令是寫并且緩沖區(qū)數(shù)據(jù)不臟,或者命令是讀并且緩沖區(qū)數(shù)據(jù)是更新過的,則不用添加// 這個請求。將緩沖區(qū)解鎖并退出。  if ((rw == WRITE && !bh->b_dirt) || (rw == READ && bh->b_uptodate))    {      unlock_buffer (bh);      return;    }repeat:/* we don't allow the write-requests to fill up the queue completely:* we want some room for reads: they take precedence. The last third* of the requests are only for reads.*//* 我們不能讓隊列中全都是寫請求項:我們需要為讀請求保留一些空間:讀操作* 是優(yōu)先的。請求隊列的后三分之一空間是為讀準備的。*/// 請求項是從請求數(shù)組末尾開始搜索空項填入的。根據(jù)上述要求,對于讀命令請求,可以直接// 從隊列末尾開始操作,而寫請求則只能從隊列的2/3 處向頭上搜索空項填入。  if (rw == READ)    req = request + NR_REQUEST;	// 對于讀請求,將隊列指針指向隊列尾部。  else    req = request + ((NR_REQUEST * 2) / 3);	// 對于寫請求,隊列指針指向隊列2/3 處。/* find an empty request *//* 搜索一個空請求項 */// 從后向前搜索,當請求結(jié)構(gòu)request 的dev 字段值=-1 時,表示該項未被占用。  while (--req >= request)    if (req->dev < 0)      break;/* if none found, sleep on new requests: check for rw_ahead *//* 如果沒有找到空閑項,則讓該次新請求睡眠:需檢查是否提前讀/寫 */// 如果沒有一項是空閑的(此時request 數(shù)組指針已經(jīng)搜索越過頭部),則查看此次請求是否是// 提前讀/寫(READA 或WRITEA),如果是則放棄此次請求。否則讓本次請求睡眠(等待請求隊列// 騰出空項),過一會再來搜索請求隊列。  if (req < request)    {				// 如果請求隊列中沒有空項,則      if (rw_ahead)	{			// 如果是提前讀/寫請求,則解鎖緩沖區(qū),退出。	  unlock_buffer (bh);	  return;	}      sleep_on (&wait_for_request);	// 否則讓本次請求睡眠,過會再查看請求隊列。      goto repeat;    }/* fill up the request-info, and add it to the queue *//* 向空閑請求項中填寫請求信息,并將其加入隊列中 */// 請求結(jié)構(gòu)參見(kernel/blk_drv/blk.h,23)。  req->dev = bh->b_dev;		// 設備號。  req->cmd = rw;		// 命令(READ/WRITE)。  req->errors = 0;		// 操作時產(chǎn)生的錯誤次數(shù)。  req->sector = bh->b_blocknr << 1;	// 起始扇區(qū)。(1 塊=2 扇區(qū))  req->nr_sectors = 2;		// 讀寫扇區(qū)數(shù)。  req->buffer = bh->b_data;	// 數(shù)據(jù)緩沖區(qū)。  req->waiting = NULL;		// 任務等待操作執(zhí)行完成的地方。  req->bh = bh;			// 緩沖區(qū)頭指針。  req->next = NULL;		// 指向下一請求項。  add_request (major + blk_dev, req);	// 將請求項加入隊列中(blk_dev[major],req)。}//// 低層讀寫數(shù)據(jù)塊函數(shù)。// 該函數(shù)主要是在fs/buffer.c 中被調(diào)用。實際的讀寫操作是由設備的request_fn()函數(shù)完成。// 對于硬盤操作,該函數(shù)是do_hd_request()。(kernel/blk_drv/hd.c,294)voidll_rw_block (int rw, struct buffer_head *bh){  unsigned int major;		// 主設備號(對于硬盤是3)。// 如果設備的主設備號不存在或者該設備的讀寫操作函數(shù)不存在,則顯示出錯信息,并返回。  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);	// 創(chuàng)建請求項并插入請求隊列。}//// 塊設備初始化函數(shù),由初始化程序main.c 調(diào)用(init/main.c,128)。// 初始化請求數(shù)組,將所有請求項置為空閑項(dev = -1)。有32 項(NR_REQUEST = 32)。voidblk_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一区二区三区免费野_久草精品视频
91麻豆精品久久久久蜜臀| 一区二区三区美女| 精品国产乱码91久久久久久网站| 久久综合色婷婷| 性做久久久久久免费观看| 大胆欧美人体老妇| 精品久久免费看| 日韩电影在线一区| 在线免费不卡电影| 中文字幕亚洲欧美在线不卡| 久久成人免费日本黄色| 欧美精品久久天天躁| 亚洲女与黑人做爰| 成人性生交大片免费看中文| 精品免费一区二区三区| 青草国产精品久久久久久| 一本大道久久精品懂色aⅴ| 国产人伦精品一区二区| 精品一区二区三区在线观看国产 | 这里只有精品视频在线观看| 国产精品久久看| 国产成人福利片| 国产亚洲综合性久久久影院| 久久99久国产精品黄毛片色诱| 欧美日韩一区高清| 亚洲一区二区三区精品在线| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产精品丝袜91| 国产毛片精品视频| 久久色成人在线| 久久99久久99精品免视看婷婷| 3751色影院一区二区三区| 日本在线不卡视频| 欧美久久高跟鞋激| 日韩国产欧美在线视频| 欧美一区二区三区免费| 久久99精品久久久| 精品久久人人做人人爽| 国产成人精品1024| 亚洲欧洲av色图| 在线精品视频一区二区| 亚洲一级在线观看| 日韩一级高清毛片| 国内一区二区在线| 国产精品福利电影一区二区三区四区| 高清在线不卡av| 亚洲欧美日韩久久| 欧洲一区二区av| 奇米影视一区二区三区小说| 日韩精品专区在线影院重磅| 国产91精品一区二区麻豆网站| 中文字幕成人网| 在线免费不卡视频| 蜜臀av一区二区在线观看| 欧美精品一区男女天堂| www..com久久爱| 午夜精品免费在线| 久久久久一区二区三区四区| av不卡在线观看| 日韩成人免费看| 国产欧美一区二区三区在线看蜜臀| 不卡视频免费播放| 亚洲成人av资源| 国产三级精品视频| 欧美色综合久久| 激情国产一区二区 | 国产日本欧美一区二区| 色哟哟一区二区| 久草在线在线精品观看| 亚洲视频一区二区在线| 日韩一区二区精品| 91啦中文在线观看| 久久成人免费电影| 亚洲午夜免费福利视频| 久久只精品国产| 欧美性xxxxxx少妇| 成人午夜碰碰视频| 另类中文字幕网| 亚洲大片在线观看| 中文字幕成人av| 欧美大片日本大片免费观看| 色综合久久久久久久| 国产乱理伦片在线观看夜一区| 亚洲一线二线三线久久久| 国产日产欧产精品推荐色 | 欧美日韩在线免费视频| 成人综合婷婷国产精品久久蜜臀 | av午夜一区麻豆| 久久精品国产一区二区三 | proumb性欧美在线观看| 久久99精品国产麻豆婷婷洗澡| 一区二区三区欧美久久| 国产精品久久久久久久久免费樱桃| 88在线观看91蜜桃国自产| 色悠久久久久综合欧美99| 高清在线观看日韩| 久久不见久久见免费视频7| 亚洲一区二区三区中文字幕 | 久久色中文字幕| 欧美一级午夜免费电影| 欧美日韩视频专区在线播放| 99re8在线精品视频免费播放| 国产电影精品久久禁18| 激情久久久久久久久久久久久久久久| 日韩精品国产欧美| 性欧美大战久久久久久久久| 一区二区三区四区蜜桃| 亚洲精品视频在线观看网站| ●精品国产综合乱码久久久久| 国产无一区二区| 日本一区二区三区dvd视频在线| 久久综合久久综合亚洲| www日韩大片| 久久久久国产一区二区三区四区| 精品成人a区在线观看| 日韩精品一区二区三区三区免费| 欧美一区二区三区不卡| 日韩欧美一区在线| 精品日韩在线观看| 2014亚洲片线观看视频免费| 久久免费偷拍视频| 国产亚洲成aⅴ人片在线观看| 国产午夜亚洲精品羞羞网站| 欧美国产精品专区| 综合激情成人伊人| 一区二区三区在线视频播放| 亚洲v精品v日韩v欧美v专区| 天天综合网天天综合色| 美腿丝袜亚洲综合| 国产999精品久久| a在线播放不卡| 欧美日韩不卡一区二区| 欧美不卡在线视频| 一区精品在线播放| 亚瑟在线精品视频| 91麻豆精品国产91久久久久久 | 成人精品免费网站| 91小视频在线观看| 777a∨成人精品桃花网| 精品国产乱码久久久久久免费| 国产欧美日韩激情| 洋洋av久久久久久久一区| 日韩电影在线观看一区| 九九**精品视频免费播放| av资源站一区| 欧美一区二区视频在线观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲视频免费看| 日本91福利区| 99久久精品国产精品久久| 欧美日韩国产一区| 国产日本欧洲亚洲| 婷婷六月综合亚洲| www.亚洲国产| 精品免费日韩av| 亚洲麻豆国产自偷在线| 日韩av在线发布| 91在线免费播放| 久久天堂av综合合色蜜桃网| 亚洲福利视频一区二区| 国产99精品视频| 欧美一区二区女人| 自拍偷拍亚洲激情| 韩国精品免费视频| 欧美日韩高清一区二区不卡| 国产精品久久久久精k8| 久久成人免费网站| 欧美日韩国产综合草草| 中文字幕一区在线观看视频| 久久国产精品一区二区| 色吧成人激情小说| 国产校园另类小说区| 美女一区二区三区| 欧美乱妇一区二区三区不卡视频| 亚洲欧美在线观看| 欧美日韩黄色影视| 一区二区三区美女视频| 成人av在线一区二区| 久久影院午夜片一区| 免费视频一区二区| 欧美另类久久久品| 一区二区三区加勒比av| 成人av免费网站| 国产午夜精品美女毛片视频| 韩国精品主播一区二区在线观看| 欧美一卡2卡三卡4卡5免费| 亚洲成人免费观看| 在线中文字幕一区二区| 亚洲欧美电影院| 色国产综合视频| 亚洲一二三四久久| 欧美天天综合网| 日日骚欧美日韩| 欧美日韩国产经典色站一区二区三区| 亚洲精品国产品国语在线app| 92精品国产成人观看免费| 亚洲女人的天堂| 91黄视频在线观看| 亚洲成人第一页| 日韩亚洲欧美一区|