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

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

?? hd.c.bak

?? LINUX 0.11版內(nèi)核代碼。 并有代碼分析說明。
?? BAK
?? 第 1 頁 / 共 2 頁
字號:
  int i = inb_p (HD_STATUS);	// 取狀態(tài)信息。  if ((i & (BUSY_STAT | READY_STAT | WRERR_STAT | SEEK_STAT | ERR_STAT))      == (READY_STAT | SEEK_STAT))      return (0);		/* ok */  if (i & 1)      i = inb (HD_ERROR);	// 若ERR_STAT 置位,則讀取錯(cuò)誤寄存器。    return (1);}//// 向硬盤控制器發(fā)送命令塊(參見列表后的說明)。// 調(diào)用參數(shù):drive - 硬盤號(0-1); nsect - 讀寫扇區(qū)數(shù);// sect - 起始扇區(qū); head - 磁頭號;// cyl - 柱面號; cmd - 命令碼;// *intr_addr() - 硬盤中斷處理程序中將調(diào)用的C 處理函數(shù)。static void hd_out (unsigned int drive, unsigned int nsect, unsigned int sect,		    unsigned int head, unsigned int cyl, unsigned int cmd,		    void (*intr_addr) (void)){  register int port; //asm ("dx");	// port 變量對應(yīng)寄存器dx。  if (drive > 1 || head > 15)	// 如果驅(qū)動(dòng)器號(0,1)>1 或磁頭號>15,則程序不支持。    panic ("Trying to write bad sector");  if (!controller_ready ())	// 如果等待一段時(shí)間后仍未就緒則出錯(cuò),死機(jī)。    panic ("HD controller not ready");  do_hd = intr_addr;		// do_hd 函數(shù)指針將在硬盤中斷程序中被調(diào)用。  outb_p (hd_info[drive].ctl, HD_CMD);	// 向控制寄存器(0x3f6)輸出控制字節(jié)。  port = HD_DATA;		// 置dx 為數(shù)據(jù)寄存器端口(0x1f0)。  outb_p (hd_info[drive].wpcom >> 2, ++port);	// 參數(shù):寫預(yù)補(bǔ)償柱面號(需除4)。  outb_p (nsect, ++port);	// 參數(shù):讀/寫扇區(qū)總數(shù)。  outb_p (sect, ++port);	// 參數(shù):起始扇區(qū)。  outb_p (cyl, ++port);		// 參數(shù):柱面號低8 位。  outb_p (cyl >> 8, ++port);	// 參數(shù):柱面號高8 位。  outb_p (0xA0 | (drive << 4) | head, ++port);	// 參數(shù):驅(qū)動(dòng)器號+磁頭號。  outb (cmd, ++port);		// 命令:硬盤控制命令。}//// 等待硬盤就緒。也即循環(huán)等待主狀態(tài)控制器忙標(biāo)志位復(fù)位。若僅有就緒或?qū)さ澜Y(jié)束標(biāo)志// 置位,則成功,返回0。若經(jīng)過一段時(shí)間仍為忙,則返回1。static int drive_busy (void){  unsigned int i;  for (i = 0; i < 10000; i++)	// 循環(huán)等待就緒標(biāo)志位置位。    if (READY_STAT == (inb_p (HD_STATUS) & (BUSY_STAT | READY_STAT)))        break;    i = inb (HD_STATUS);	// 再取主控制器狀態(tài)字節(jié)。    i &= BUSY_STAT | READY_STAT | SEEK_STAT;	// 檢測忙位、就緒位和尋道結(jié)束位。  if (i == READY_STAT | SEEK_STAT)	// 若僅有就緒或?qū)さ澜Y(jié)束標(biāo)志,則返回0。      return (0);    printk ("HD controller times out\n\r");	// 否則等待超時(shí),顯示信息。并返回1。    return (1);}//// 診斷復(fù)位(重新校正)硬盤控制器。static void reset_controller (void){  int i;    outb (4, HD_CMD);		// 向控制寄存器端口發(fā)送控制字節(jié)(4-復(fù)位)。  for (i = 0; i < 100; i++)      nop ();			// 等待一段時(shí)間(循環(huán)空操作)。    outb (hd_info[0].ctl & 0x0f, HD_CMD);	// 再發(fā)送正常的控制字節(jié)(不禁止重試、重讀)。  if (drive_busy ())		// 若等待硬盤就緒超時(shí),則顯示出錯(cuò)信息。      printk ("HD-controller still busy\n\r");  if ((i = inb (HD_ERROR)) != 1)	// 取錯(cuò)誤寄存器,若不等于1(無錯(cuò)誤)則出錯(cuò)。      printk ("HD-controller reset failed: %02x\n\r", i);}//// 復(fù)位硬盤nr。首先復(fù)位(重新校正)硬盤控制器。然后發(fā)送硬盤控制器命令“建立驅(qū)動(dòng)器參數(shù)”,// 其中recal_intr()是在硬盤中斷處理程序中調(diào)用的重新校正處理函數(shù)。static void reset_hd (int nr){  reset_controller ();  hd_out (nr, hd_info[nr].sect, hd_info[nr].sect, hd_info[nr].head - 1,	  hd_info[nr].cyl, WIN_SPECIFY, &recal_intr);}//// 意外硬盤中斷調(diào)用函數(shù)。// 發(fā)生意外硬盤中斷時(shí),硬盤中斷處理程序中調(diào)用的默認(rèn)C 處理函數(shù)。在被調(diào)用函數(shù)指針為空時(shí)// 調(diào)用該函數(shù)。參見(kernel/system_call.s,241 行)。void unexpected_hd_interrupt (void){  printk ("Unexpected HD interrupt\n\r");}//// 讀寫硬盤失敗處理調(diào)用函數(shù)。static void bad_rw_intr (void){  if (++CURRENT->errors >= MAX_ERRORS)	// 如果讀扇區(qū)時(shí)的出錯(cuò)次數(shù)大于或等于7 次時(shí),    end_request (0);		// 則結(jié)束請求并喚醒等待該請求的進(jìn)程,而且// 對應(yīng)緩沖區(qū)更新標(biāo)志復(fù)位(沒有更新)。  if (CURRENT->errors > MAX_ERRORS / 2)	// 如果讀一扇區(qū)時(shí)的出錯(cuò)次數(shù)已經(jīng)大于3 次,    reset = 1;			// 則要求執(zhí)行復(fù)位硬盤控制器操作。}//// 讀操作中斷調(diào)用函數(shù)。將在執(zhí)行硬盤中斷處理程序中被調(diào)用。static void read_intr (void){  if (win_result ())    {				// 若控制器忙、讀寫錯(cuò)或命令執(zhí)行錯(cuò),      bad_rw_intr ();		// 則進(jìn)行讀寫硬盤失敗處理      do_hd_request ();		// 然后再次請求硬盤作相應(yīng)(復(fù)位)處理。      return;    }  port_read (HD_DATA, CURRENT->buffer, 256);	// 將數(shù)據(jù)從數(shù)據(jù)寄存器口讀到請求結(jié)構(gòu)緩沖區(qū)。  CURRENT->errors = 0;		// 清出錯(cuò)次數(shù)。  CURRENT->buffer += 512;	// 調(diào)整緩沖區(qū)指針,指向新的空區(qū)。  CURRENT->sector++;		// 起始扇區(qū)號加1,  if (--CURRENT->nr_sectors)    {				// 如果所需讀出的扇區(qū)數(shù)還沒有讀完,則      do_hd = &read_intr;	// 再次置硬盤調(diào)用C 函數(shù)指針為read_intr()      return;			// 因?yàn)橛脖P中斷處理程序每次調(diào)用do_hd 時(shí)    }				// 都會(huì)將該函數(shù)指針置空。參見system_call.s  end_request (1);		// 若全部扇區(qū)數(shù)據(jù)已經(jīng)讀完,則處理請求結(jié)束事宜,  do_hd_request ();		// 執(zhí)行其它硬盤請求操作。}//// 寫扇區(qū)中斷調(diào)用函數(shù)。在硬盤中斷處理程序中被調(diào)用。// 在寫命令執(zhí)行后,會(huì)產(chǎn)生硬盤中斷信號,執(zhí)行硬盤中斷處理程序,此時(shí)在硬盤中斷處理程序中調(diào)用的// C 函數(shù)指針do_hd()已經(jīng)指向write_intr(),因此會(huì)在寫操作完成(或出錯(cuò))后,執(zhí)行該函數(shù)。static void write_intr (void){  if (win_result ())  {				// 如果硬盤控制器返回錯(cuò)誤信息,      bad_rw_intr ();		// 則首先進(jìn)行硬盤讀寫失敗處理,      do_hd_request ();		// 然后再次請求硬盤作相應(yīng)(復(fù)位)處理,      return;			// 然后返回(也退出了此次硬盤中斷)。  }  if (--CURRENT->nr_sectors)  {				// 否則將欲寫扇區(qū)數(shù)減1,若還有扇區(qū)要寫,則      CURRENT->sector++;	// 當(dāng)前請求起始扇區(qū)號+1,      CURRENT->buffer += 512;	// 調(diào)整請求緩沖區(qū)指針,      do_hd = &write_intr;	// 置硬盤中斷程序調(diào)用函數(shù)指針為write_intr(),      port_write (HD_DATA, CURRENT->buffer, 256);	// 再向數(shù)據(jù)寄存器端口寫256 字節(jié)。      return;			// 返回等待硬盤再次完成寫操作后的中斷處理。  }  end_request (1);		// 若全部扇區(qū)數(shù)據(jù)已經(jīng)寫完,則處理請求結(jié)束事宜,  do_hd_request ();		// 執(zhí)行其它硬盤請求操作。}//// 硬盤重新校正(復(fù)位)中斷調(diào)用函數(shù)。在硬盤中斷處理程序中被調(diào)用。// 如果硬盤控制器返回錯(cuò)誤信息,則首先進(jìn)行硬盤讀寫失敗處理,然后請求硬盤作相應(yīng)(復(fù)位)處理。static void recal_intr (void){  if (win_result ())    bad_rw_intr ();  do_hd_request ();}// 執(zhí)行硬盤讀寫請求操作。void do_hd_request (void){  int i, r;  unsigned int block, dev;  unsigned int sec, head, cyl;  unsigned int nsect;  INIT_REQUEST;		// 檢測請求項(xiàng)的合法性(參見kernel/blk_drv/blk.h,127)。// 取設(shè)備號中的子設(shè)備號(見列表后對硬盤設(shè)備號的說明)。子設(shè)備號即是硬盤上的分區(qū)號。  dev = MINOR (CURRENT->dev);	// CURRENT 定義為(blk_dev[MAJOR_NR].current_request)。  block = CURRENT->sector;	// 請求的起始扇區(qū)。// 如果子設(shè)備號不存在或者起始扇區(qū)大于該分區(qū)扇區(qū)數(shù)-2,則結(jié)束該請求,并跳轉(zhuǎn)到標(biāo)號repeat 處// (定義在INIT_REQUEST 開始處)。因?yàn)橐淮我笞x寫2 個(gè)扇區(qū)(512*2 字節(jié)),所以請求的扇區(qū)號// 不能大于分區(qū)中最后倒數(shù)第二個(gè)扇區(qū)號。  if (dev >= 5 * NR_HD || block + 2 > hd[dev].nr_sects)  {      end_request (0);      goto repeat;		// 該標(biāo)號在blk.h 最后面。  }  block += hd[dev].start_sect;	// 將所需讀的塊對應(yīng)到整個(gè)硬盤上的絕對扇區(qū)號。  dev /= 5;			// 此時(shí)dev 代表硬盤號(0 或1)。// 下面嵌入?yún)R編代碼用來從硬盤信息結(jié)構(gòu)中根據(jù)起始扇區(qū)號和每磁道扇區(qū)數(shù)計(jì)算在磁道中的// 扇區(qū)號(sec)、所在柱面號(cyl)和磁頭號(head)。
  sec = hd_info[dev].sect;
  _asm {
	  mov eax,block
	  xor edx,edx
	  mov ebx,sec
	  div ebx
	  mov block,eax
	  mov sec,edx
  }//__asm__ ("divl %4": "=a" (block), "=d" (sec):"" (block), "1" (0),//	   "r" (hd_info[dev].//		sect));
  head = hd_info[dev].head;  _asm {
	  mov eax,block
	  xor edx,edx
	  mov ebx,head
	  div ebx
	  mov cyl,eax
	  mov head,edx
  }
//__asm__ ("divl %4": "=a" (cyl), "=d" (head):"" (block), "1" (0),//	   "r" (hd_info[dev].//		head));  sec++;  nsect = CURRENT->nr_sectors;	// 欲讀/寫的扇區(qū)數(shù)。// 如果reset 置1,則執(zhí)行復(fù)位操作。復(fù)位硬盤和控制器,并置需要重新校正標(biāo)志,返回。  if (reset)  {      reset = 0;      recalibrate = 1;      reset_hd (CURRENT_DEV);      return;  }// 如果重新校正標(biāo)志(recalibrate)置位,則首先復(fù)位該標(biāo)志,然后向硬盤控制器發(fā)送重新校正命令。  if (recalibrate)  {      recalibrate = 0;      hd_out (dev, hd_info[CURRENT_DEV].sect, 0, 0, 0,	      WIN_RESTORE, &recal_intr);      return;  }// 如果當(dāng)前請求是寫扇區(qū)操作,則發(fā)送寫命令,循環(huán)讀取狀態(tài)寄存器信息并判斷請求服務(wù)標(biāo)志// DRQ_STAT 是否置位。DRQ_STAT 是硬盤狀態(tài)寄存器的請求服務(wù)位(include/linux/hdreg.h,27)。  if (CURRENT->cmd == WRITE)  {      hd_out (dev, nsect, sec, head, cyl, WIN_WRITE, &write_intr);      for (i = 0; i < 3000 && !(r = inb_p (HD_STATUS) & DRQ_STAT); i++)/* nothing */ ;// 如果請求服務(wù)位置位則退出循環(huán)。若等到循環(huán)結(jié)束也沒有置位,則此次寫硬盤操作失敗,去處理// 下一個(gè)硬盤請求。否則向硬盤控制器數(shù)據(jù)寄存器端口HD_DATA 寫入1 個(gè)扇區(qū)的數(shù)據(jù)。      if (!r)	  {	  bad_rw_intr ();	  goto repeat;		// 該標(biāo)號在blk.h 最后面,也即跳到301 行。	  }      port_write (HD_DATA, CURRENT->buffer, 256);// 如果當(dāng)前請求是讀硬盤扇區(qū),則向硬盤控制器發(fā)送讀扇區(qū)命令。  }  else if (CURRENT->cmd == READ)  {      hd_out (dev, nsect, sec, head, cyl, WIN_READ, &read_intr);  }  else    panic ("unknown hd-command");}// 硬盤系統(tǒng)初始化。void hd_init (void){  blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;	// do_hd_request()。  set_intr_gate (0x2E, &hd_interrupt);	// 設(shè)置硬盤中斷門向量 int 0x2E(46)。// hd_interrupt 在(kernel/system_call.s,221)。  outb_p (inb_p (0x21) & 0xfb, 0x21);	// 復(fù)位接聯(lián)的主8259A int2 的屏蔽位,允許從片// 發(fā)出中斷請求信號。  outb (inb_p (0xA1) & 0xbf, 0xA1);	// 復(fù)位硬盤的中斷請求屏蔽位(在從片上),允許// 硬盤控制器發(fā)送中斷請求信號。}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产九色精品成人porny| 亚洲一区在线观看免费| 狠狠色综合播放一区二区| 日韩写真欧美这视频| 免费成人结看片| 久久亚洲综合av| 国产精品一区二区男女羞羞无遮挡 | 欧美一级久久久| 久久国产精品露脸对白| 精品久久久久久亚洲综合网 | 久久午夜羞羞影院免费观看| 国产一区二区福利| 最新成人av在线| 欧美日韩午夜精品| 国产在线看一区| 国产精品久久久久久久久晋中 | 久久精品视频免费| www.成人网.com| 亚洲第一二三四区| 精品国产不卡一区二区三区| 成人黄色电影在线| 亚洲一区二区五区| 精品成人一区二区| 日本精品视频一区二区| 免费成人深夜小野草| 中文字幕一区av| 91精品国产乱码| 成人高清免费观看| 日韩精品91亚洲二区在线观看 | 午夜a成v人精品| 久久久久九九视频| 在线视频你懂得一区| 久久精品噜噜噜成人av农村| 国产精品国产三级国产| 欧美一区二区在线不卡| 成人黄色网址在线观看| 麻豆国产精品视频| 亚洲人成精品久久久久| 精品久久久久久亚洲综合网| 色哟哟亚洲精品| 国产精品1024| 亚洲一区二区精品3399| 亚洲国产精品精华液2区45| 欧美精品少妇一区二区三区| 粉嫩一区二区三区在线看| 日韩和欧美一区二区三区| 亚洲日本va午夜在线影院| 久久久亚洲欧洲日产国码αv| 欧美日韩一级片在线观看| av不卡免费电影| 国内外精品视频| 日韩和的一区二区| 亚洲欧洲综合另类| 日本一区二区三区四区| 欧美mv日韩mv国产网站| 欧美日本一区二区在线观看| 不卡的av电影| 国产宾馆实践打屁股91| 蜜臀99久久精品久久久久久软件| 亚洲综合av网| 亚洲嫩草精品久久| 国产精品久久久久影视| 久久久精品国产免费观看同学| 欧美浪妇xxxx高跟鞋交| 91国在线观看| 91麻豆国产自产在线观看| 久久不见久久见中文字幕免费| 亚洲成人精品一区二区| 一区二区三区四区av| 日韩美女精品在线| 中文字幕色av一区二区三区| 久久久www成人免费无遮挡大片 | 国产美女在线观看一区| 男男视频亚洲欧美| 日韩黄色片在线观看| 亚洲一区二区av在线| 国产三级三级三级精品8ⅰ区| 久久这里都是精品| 欧美精品一区二区在线观看| www国产成人免费观看视频 深夜成人网| 日韩午夜电影av| 欧美xxxx老人做受| 久久精品一区蜜桃臀影院| 久久夜色精品国产欧美乱极品| 26uuu精品一区二区在线观看| 久久综合九色综合97婷婷| 久久久国产精品麻豆| 国产精品午夜在线| 日韩美女精品在线| 亚洲午夜免费福利视频| 爽好久久久欧美精品| 日韩国产欧美在线播放| 国产在线一区二区综合免费视频| 韩国毛片一区二区三区| 国产91色综合久久免费分享| 99精品视频在线观看免费| 色一区在线观看| 欧美人动与zoxxxx乱| 欧美成人福利视频| 国产精品网友自拍| 依依成人综合视频| 日产欧产美韩系列久久99| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品一品视频| 一本一道综合狠狠老| 91精品国产综合久久精品性色| 精品日韩一区二区三区免费视频| 中文字幕av一区二区三区免费看 | 99国产精品久久久久| 欧美日韩一区高清| 精品成a人在线观看| 日韩一区日韩二区| 蜜桃视频在线一区| 成人动漫一区二区在线| 欧美日韩一区二区三区免费看 | 在线观看视频一区二区| 日韩午夜在线影院| 国产精品国产a| 蜜臀av一区二区在线免费观看| 不卡视频免费播放| 日韩一卡二卡三卡四卡| 中文字幕精品—区二区四季| 婷婷中文字幕一区三区| 国产一区二区剧情av在线| 91久久线看在观草草青青| 精品欧美乱码久久久久久| 国产精品久久久久精k8 | 精品国产一区二区国模嫣然| 亚洲欧美一区二区三区国产精品 | 一区二区三区四区五区视频在线观看| 奇米777欧美一区二区| 99久久综合国产精品| 欧美成人伊人久久综合网| 一区二区三区加勒比av| 国模无码大尺度一区二区三区| 色94色欧美sute亚洲13| 久久久另类综合| 日本91福利区| 欧亚洲嫩模精品一区三区| 欧美高清在线一区| 久久国内精品自在自线400部| 一本久久精品一区二区| 国产欧美综合在线观看第十页| 日韩精品亚洲专区| 91官网在线免费观看| 国产亚洲欧美一区在线观看| 午夜精品一区二区三区电影天堂 | 亚洲色图第一区| 国产成人精品免费看| 欧美成人精精品一区二区频| 亚洲www啪成人一区二区麻豆| 国产高清在线观看免费不卡| 日韩三级.com| 视频一区二区国产| 欧美综合视频在线观看| 综合久久综合久久| 99免费精品在线| 国产精品久久久久久久久晋中| 国产精品白丝jk白祙喷水网站| 精品国产露脸精彩对白| 久久精品国产成人一区二区三区 | 亚洲欧美日韩久久| 成人ar影院免费观看视频| 久久精品日韩一区二区三区| 美女被吸乳得到大胸91| 日韩免费一区二区三区在线播放| 性欧美疯狂xxxxbbbb| 欧美日韩三级一区| 亚洲图片一区二区| 欧美日韩dvd在线观看| 亚洲国产成人av网| 69堂亚洲精品首页| 日韩福利电影在线观看| 6080午夜不卡| 蜜臀久久99精品久久久久宅男 | 国产成都精品91一区二区三| 久久精品日韩一区二区三区| 国模少妇一区二区三区| 久久久久久久久蜜桃| 国产一区999| 国产精品动漫网站| 92国产精品观看| 亚洲午夜一二三区视频| 欧美精选一区二区| 久久国产福利国产秒拍| 精品成人一区二区三区四区| 国产美女一区二区三区| 国产精品你懂的在线| 91亚洲精华国产精华精华液| 一区二区久久久久| 欧美一级日韩一级| 国产成人久久精品77777最新版本| 欧美国产精品久久| 欧美午夜不卡视频| 老鸭窝一区二区久久精品| 久久久噜噜噜久久中文字幕色伊伊| 成人美女在线视频| 亚洲一区二区欧美| 久久综合丝袜日本网| 91香蕉国产在线观看软件|