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

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

?? ll_rw_blk.c

?? linux下的源代碼
?? 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>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。#include <asm/system.h>		// 系統(tǒng)頭文件。定義了設置或修改描述符/中斷門等的嵌入式匯編宏。#include "blk.h"		// 塊設備頭文件。定義請求數據結構、塊設備數據結構和宏函數等信息。/** The request-struct contains all necessary data* to load a nr of sectors into memory*//** 請求結構中含有加載nr 扇區(qū)數據到內存的所有必須的信息。*/struct request request[NR_REQUEST];/** 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 打印機設備。};// 鎖定指定的緩沖區(qū)bh。如果指定的緩沖區(qū)已經被其它任務鎖定,則使自己睡眠(不可中斷地等待),// 直到被執(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()向連表中加入一項請求。它關閉中斷,* 這樣就能安全地處理請求連表了 */*///// 向鏈表中加入請求項。參數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;	// 清緩沖區(qū)“臟”標志。// 如果dev 的當前請求(current_request)子段為空,則表示目前該設備沒有請求項,本次是第1 個// 請求項,因此可將塊設備當前請求指針直接指向請求項,并立刻執(zhí)行相應設備的請求函數。  if (!(tmp = dev->current_request))    {      dev->current_request = req;      sti ();			// 開中斷。      (dev->request_fn) ();	// 執(zhí)行設備請求函數,對于硬盤(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 ();}//// 創(chuàng)建請求項并插入請求隊列。參數是:主設備號major,命令rw,存放數據的緩沖區(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ū)已經上鎖,*//* 我們就不管它而退出,否則的話就執(zhí)行一般的讀/寫操作。 */// 這里'READ'和'WRITE'后面的'A'字符代表英文單詞Ahead,表示提前預讀/寫數據塊的意思。// 當指定的緩沖區(qū)正在使用,已被上鎖時,就放棄預讀/寫請求。  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");// 鎖定緩沖區(qū),如果緩沖區(qū)已經上鎖,則當前任務(進程)就會睡眠,直到被明確地喚醒。  lock_buffer (bh);// 如果命令是寫并且緩沖區(qū)數據不臟,或者命令是讀并且緩沖區(qū)數據是更新過的,則不用添加// 這個請求。將緩沖區(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)先的。請求隊列的后三分之一空間是為讀準備的。*/// 請求項是從請求數組末尾開始搜索空項填入的。根據上述要求,對于讀命令請求,可以直接// 從隊列末尾開始操作,而寫請求則只能從隊列的2/3 處向頭上搜索空項填入。  if (rw == READ)    req = request + NR_REQUEST;	// 對于讀請求,將隊列指針指向隊列尾部。  else    req = request + ((NR_REQUEST * 2) / 3);	// 對于寫請求,隊列指針指向隊列2/3 處。/* find an empty request *//* 搜索一個空請求項 */// 從后向前搜索,當請求結構request 的dev 字段值=-1 時,表示該項未被占用。  while (--req >= request)    if (req->dev < 0)      break;/* if none found, sleep on new requests: check for rw_ahead *//* 如果沒有找到空閑項,則讓該次新請求睡眠:需檢查是否提前讀/寫 */// 如果沒有一項是空閑的(此時request 數組指針已經搜索越過頭部),則查看此次請求是否是// 提前讀/寫(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 *//* 向空閑請求項中填寫請求信息,并將其加入隊列中 */// 請求結構參見(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;	// 起始扇區(qū)。(1 塊=2 扇區(qū))  req->nr_sectors = 2;		// 讀寫扇區(qū)數。  req->buffer = bh->b_data;	// 數據緩沖區(qū)。  req->waiting = NULL;		// 任務等待操作執(zhí)行完成的地方。  req->bh = bh;			// 緩沖區(qū)頭指針。  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)voidll_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);	// 創(chuàng)建請求項并插入請求隊列。}//// 塊設備初始化函數,由初始化程序main.c 調用(init/main.c,128)。// 初始化請求數組,將所有請求項置為空閑項(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一区二区三区免费野_久草精品视频
六月婷婷色综合| 亚洲图片欧美一区| 国产一区欧美二区| 久久一区二区三区国产精品| 久久国产精品色| 久久久久国产成人精品亚洲午夜| 久久国产日韩欧美精品| 精品奇米国产一区二区三区| 国产自产高清不卡| 日韩一区在线播放| 欧美丝袜丝nylons| 美女视频第一区二区三区免费观看网站| 制服丝袜在线91| 韩国av一区二区三区四区| 久久日韩精品一区二区五区| 国产高清不卡二三区| 1024亚洲合集| 欧美精品 日韩| 国产精品夜夜爽| 一区二区视频在线| 日韩一级二级三级| 成人免费高清视频| 亚洲成a人v欧美综合天堂下载| 日韩视频免费观看高清完整版在线观看 | 日韩一区二区精品在线观看| 极品少妇xxxx精品少妇| 欧美激情中文不卡| 欧美日韩精品一区二区天天拍小说 | 亚洲国产成人av好男人在线观看| 欧美精品在线一区二区三区| 国产一区久久久| 亚洲综合图片区| 精品国产91九色蝌蚪| a级精品国产片在线观看| 日韩高清一区二区| 中文字幕一区二区三区色视频| 欧美高清视频一二三区| 成人晚上爱看视频| 首页亚洲欧美制服丝腿| 国产精品久久二区二区| 欧美一区二区三区不卡| 色哟哟一区二区三区| 精品亚洲成a人在线观看| 日韩美女精品在线| 久久综合一区二区| 欧美日本在线观看| 92精品国产成人观看免费| 久久精品国产亚洲高清剧情介绍| 亚洲视频香蕉人妖| 国产女人18毛片水真多成人如厕| 日韩一区二区在线免费观看| 一本一道久久a久久精品综合蜜臀| 老司机精品视频在线| 亚洲国产va精品久久久不卡综合| 欧美国产一区二区在线观看| 日韩欧美中文字幕精品| 日本高清不卡视频| 波多野结衣91| 国产精品自产自拍| 激情综合网天天干| 亚洲va国产va欧美va观看| ...av二区三区久久精品| 国产日韩欧美精品综合| 欧美成人精品福利| 欧美一区二区在线播放| 欧美做爰猛烈大尺度电影无法无天| 成人性生交大片免费看中文网站| 黄网站免费久久| 精品综合久久久久久8888| 免费观看30秒视频久久| 天天综合色天天综合色h| 亚洲裸体在线观看| 一区二区在线看| 亚洲欧美国产77777| 中文字幕亚洲成人| 中文字幕亚洲不卡| 日韩毛片一二三区| 亚洲精品欧美综合四区| 亚洲美女淫视频| 亚洲午夜免费视频| 香蕉成人伊视频在线观看| 天天色天天爱天天射综合| 视频一区国产视频| 久久国产麻豆精品| 国产精品12区| 成人性生交大片免费看视频在线 | 国产福利视频一区二区三区| 狠狠色伊人亚洲综合成人| 加勒比av一区二区| 国产一区视频在线看| 国产+成+人+亚洲欧洲自线| 国产aⅴ综合色| 99re免费视频精品全部| 欧洲精品在线观看| 日韩一区国产二区欧美三区| 日韩免费观看2025年上映的电影| 精品国产乱码久久久久久1区2区 | 7777精品伊人久久久大香线蕉 | 大桥未久av一区二区三区中文| 岛国一区二区三区| 色欧美乱欧美15图片| 欧美性感一区二区三区| 日韩一区二区三区电影在线观看 | 色狠狠综合天天综合综合| 欧美日韩综合在线| 欧美大片一区二区| 中文字幕不卡的av| 亚洲一区二区三区国产| 蜜桃精品视频在线| av爱爱亚洲一区| 在线不卡的av| 欧美韩国日本综合| 日本伊人色综合网| 高清国产一区二区三区| 欧洲国产伦久久久久久久| 欧美成人精品3d动漫h| 中文字幕在线不卡一区二区三区| 丝袜亚洲另类丝袜在线| 国产传媒一区在线| 欧美乱熟臀69xxxxxx| 久久综合给合久久狠狠狠97色69| 一区二区三区四区中文字幕| 蜜臀久久久久久久| 91免费在线视频观看| 日韩一区二区三区在线| 亚洲欧美日韩一区二区 | 不卡视频在线观看| 777欧美精品| 17c精品麻豆一区二区免费| 欧美aaaaa成人免费观看视频| 成人av网站在线观看| 日韩欧美色电影| 亚洲综合另类小说| 成人中文字幕在线| 精品国产一区二区亚洲人成毛片| 亚洲精品乱码久久久久久日本蜜臀| 国产最新精品免费| 日韩一区国产二区欧美三区| 亚洲免费观看高清| 成人av网站在线| 久久久久久9999| 男女视频一区二区| 欧美日韩一本到| 亚洲美女在线国产| av一二三不卡影片| 国产亚洲欧美日韩俺去了| 三级成人在线视频| 欧美日韩一区二区不卡| 亚洲精品中文字幕在线观看| 国产黑丝在线一区二区三区| 欧美一区二区三区视频在线| 亚洲主播在线播放| 91久久香蕉国产日韩欧美9色| 中文字幕成人在线观看| 国产精品一区二区久久精品爱涩| 日韩色在线观看| 天天综合网天天综合色| 欧美性色黄大片| 亚洲自拍欧美精品| 欧洲一区在线电影| 亚洲午夜激情av| 欧美日韩午夜影院| 亚洲高清视频中文字幕| 91九色最新地址| 一区二区三区日韩欧美精品| 99久久99久久精品免费看蜜桃| 国产精品蜜臀在线观看| 国产成人h网站| 中文av字幕一区| 91天堂素人约啪| 亚洲少妇中出一区| 日本乱人伦一区| 亚洲高清不卡在线观看| 欧美日韩精品一区二区三区蜜桃| 亚洲图片自拍偷拍| 5月丁香婷婷综合| 久国产精品韩国三级视频| 久久蜜桃av一区二区天堂 | 欧美在线高清视频| 天天综合网 天天综合色| 欧美一二三区在线| 国产成人aaaa| 亚洲天堂2014| 欧美日韩一级二级| 免费精品视频最新在线| 久久久久久久久99精品| 91在线丨porny丨国产| 亚洲电影中文字幕在线观看| 欧美一区二区视频在线观看2020| 久久99精品一区二区三区三区| 久久精品亚洲麻豆av一区二区| 成人午夜视频免费看| 一区二区三区在线观看网站| 69av一区二区三区| 国产精品一区不卡| 综合激情网...| 这里是久久伊人| 国产精一区二区三区| 亚洲欧美欧美一区二区三区| 51精品久久久久久久蜜臀|