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

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

?? bitmap.c

?? 帶中文注釋的linux 0.11源碼 很好
?? C
字號:
/** linux/fs/bitmap.c** (C) 1991 Linus Torvalds*//* bitmap.c contains the code that handles the inode and block bitmaps *//* bitmap.c 程序含有處理i 節點和磁盤塊位圖的代碼 */#include <string.h>		// 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。// 主要使用了其中的memset()函數。#include <linux/sched.h>	// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/kernel.h>	// 內核頭文件。含有一些內核常用函數的原形定義。//// 將指定地址(addr)處的一塊內存清零。嵌入匯編程序宏。// 輸入:eax = 0,ecx = 數據塊大小BLOCK_SIZE/4,edi = addr。#define clear_block(addr) \__asm__( "cld\n\t" \		// 清方向位。"rep\n\t" \			// 重復執行存儲數據(0)。"stosl"::"a" (0), "c" (BLOCK_SIZE / 4), "D" ((long) (addr)):"cx", "di")//// 置位指定地址開始的第nr 個位偏移處的比特位(nr 可以大于32!)。返回原比特位(0 或1)。// 輸入:%0 - eax(返回值),%1 - eax(0);%2 - nr,位偏移值;%3 - (addr),addr 的內容。#define set_bit(nr,addr) ({\register int res __asm__( "ax"); \__asm__ __volatile__( "btsl %2,%3\n\tsetb %%al": \"=a" (res): "" (0), "r" (nr), "m" (*(addr))); \res;})//// 復位指定地址開始的第nr 位偏移處的比特位。返回原比特位的反碼(1 或0)。// 輸入:%0 - eax(返回值),%1 - eax(0);%2 - nr,位偏移值;%3 - (addr),addr 的內容。#define clear_bit(nr,addr) ({\register int res __asm__( "ax"); \__asm__ __volatile__( "btrl %2,%3\n\tsetnb %%al": \"=a" (res): "" (0), "r" (nr), "m" (*(addr))); \res;})//// 從addr 開始尋找第1 個0 值比特位。// 輸入:%0 - ecx(返回值);%1 - ecx(0);%2 - esi(addr)。// 在addr 指定地址開始的位圖中尋找第1 個是0 的比特位,并將其距離addr 的比特位偏移值返回。#define find_first_zero(addr) ({ \int __res; \__asm__( "cld\n" \		// 清方向位。  "1:\tlodsl\n\t" \		// 取[esi]??eax。  "notl %%eax\n\t" \		// eax 中每位取反。  "bsfl %%eax,%%edx\n\t" \	// 從位0 掃描eax 中是1 的第1 個位,其偏移值??edx。  "je 2f\n\t" \			// 如果eax 中全是0,則向前跳轉到標號2 處(40 行)。  "addl %%edx,%%ecx\n\t" \	// 偏移值加入ecx(ecx 中是位圖中首個是0 的比特位的偏移值)  "jmp 3f\n" \			// 向前跳轉到標號3 處(結束)。  "2:\taddl $32,%%ecx\n\t" \	// 沒有找到0 比特位,則將ecx 加上1 個長字的位偏移量32。  "cmpl $8192,%%ecx\n\t" \	// 已經掃描了8192 位(1024 字節)了嗎?  "jl 1b\n" \			// 若還沒有掃描完1 塊數據,則向前跳轉到標號1 處,繼續。  "3:" \			// 結束。此時ecx 中是位偏移量。: "=c" (__res): "c" (0), "S" (addr):"ax", "dx", "si");__res;})//// 釋放設備dev 上數據區中的邏輯塊block。// 復位指定邏輯塊block 的邏輯塊位圖比特位。// 參數:dev 是設備號,block 是邏輯塊號(盤塊號)。     void free_block (int dev, int block)     {       struct super_block *sb;       struct buffer_head *bh;// 取指定設備dev 的超級塊,如果指定設備不存在,則出錯死機。       if (!(sb = get_super (dev)))	 panic ("trying to free block on nonexistent device");// 若邏輯塊號小于首個邏輯塊號或者大于設備上總邏輯塊數,則出錯,死機。       if (block < sb->s_firstdatazone || block >= sb->s_nzones)	 panic ("trying to free block not in datazone");// 從hash 表中尋找該塊數據。若找到了則判斷其有效性,并清已修改和更新標志,釋放該數據塊。// 該段代碼的主要用途是如果該邏輯塊當前存在于高速緩沖中,就釋放對應的緩沖塊。       bh = get_hash_table (dev, block);       if (bh)	 {	   if (bh->b_count != 1)	     {	       printk ("trying to free block (%04x:%d), count=%d\n",		       dev, block, bh->b_count);	       return;	     }	   bh->b_dirt = 0;	// 復位臟(已修改)標志位。	   bh->b_uptodate = 0;	// 復位更新標志。	   brelse (bh);	 }// 計算block 在數據區開始算起的數據邏輯塊號(從1 開始計數)。然后對邏輯塊(區塊)位圖進行操作,// 復位對應的比特位。若對應比特位原來即是0,則出錯,死機。       block -= sb->s_firstdatazone - 1;	// block = block - ( -1) ;       if (clear_bit (block & 8191, sb->s_zmap[block / 8192]->b_data))	 {	   printk ("block (%04x:%d) ", dev, block + sb->s_firstdatazone - 1);	   panic ("free_block: bit already cleared");	 }// 置相應邏輯塊位圖所在緩沖區已修改標志。       sb->s_zmap[block / 8192]->b_dirt = 1;     }////向設備dev 申請一個邏輯塊(盤塊,區塊)。返回邏輯塊號(盤塊號)。// 置位指定邏輯塊block 的邏輯塊位圖比特位。int new_block (int dev){  struct buffer_head *bh;  struct super_block *sb;  int i, j;// 從設備dev 取超級塊,如果指定設備不存在,則出錯死機。  if (!(sb = get_super (dev)))    panic ("trying to get new block from nonexistant device");// 掃描邏輯塊位圖,尋找首個0 比特位,尋找空閑邏輯塊,獲取放置該邏輯塊的塊號。  j = 8192;  for (i = 0; i < 8; i++)    if (bh = sb->s_zmap[i])      if ((j = find_first_zero (bh->b_data)) < 8192)	break;// 如果全部掃描完還沒找到(i>=8 或j>=8192)或者位圖所在的緩沖塊無效(bh=NULL)則 返回0,// 退出(沒有空閑邏輯塊)。  if (i >= 8 || !bh || j >= 8192)    return 0;// 設置新邏輯塊對應邏輯塊位圖中的比特位,若對應比特位已經置位,則出錯,死機。  if (set_bit (j, bh->b_data))    panic ("new_block: bit already set");// 置對應緩沖區塊的已修改標志。如果新邏輯塊大于該設備上的總邏輯塊數,則說明指定邏輯塊在// 對應設備上不存在。申請失敗,返回0,退出。  bh->b_dirt = 1;  j += i * 8192 + sb->s_firstdatazone - 1;  if (j >= sb->s_nzones)    return 0;// 讀取設備上的該新邏輯塊數據(驗證)。如果失敗則死機。  if (!(bh = getblk (dev, j)))    panic ("new_block: cannot get block");// 新塊的引用計數應為1。否則死機。  if (bh->b_count != 1)    panic ("new block: count is != 1");// 將該新邏輯塊清零,并置位更新標志和已修改標志。然后釋放對應緩沖區,返回邏輯塊號。  clear_block (bh->b_data);  bh->b_uptodate = 1;  bh->b_dirt = 1;  brelse (bh);  return j;}//// 釋放指定的i 節點。// 復位對應i 節點位圖比特位。void free_inode (struct m_inode *inode){  struct super_block *sb;  struct buffer_head *bh;// 如果i 節點指針=NULL,則退出。  if (!inode)    return;// 如果i 節點上的設備號字段為0,說明該節點無用,則用0 清空對應i 節點所占內存區,并返回。  if (!inode->i_dev)    {      memset (inode, 0, sizeof (*inode));      return;    }// 如果此i 節點還有其它程序引用,則不能釋放,說明內核有問題,死機。  if (inode->i_count > 1)    {      printk ("trying to free inode with count=%d\n", inode->i_count);      panic ("free_inode");    }// 如果文件目錄項連接數不為0,則表示還有其它文件目錄項在使用該節點,不應釋放,而應該放回等。  if (inode->i_nlinks)    panic ("trying to free inode with links");// 取i 節點所在設備的超級塊,測試設備是否存在。  if (!(sb = get_super (inode->i_dev)))    panic ("trying to free inode on nonexistent device");// 如果i 節點號=0 或大于該設備上i 節點總數,則出錯(0 號i 節點保留沒有使用)。  if (inode->i_num < 1 || inode->i_num > sb->s_ninodes)    panic ("trying to free inode 0 or nonexistant inode");// 如果該i 節點對應的節點位圖不存在,則出錯。  if (!(bh = sb->s_imap[inode->i_num >> 13]))    panic ("nonexistent imap in superblock");// 復位i 節點對應的節點位圖中的比特位,如果該比特位已經等于0,則出錯。  if (clear_bit (inode->i_num & 8191, bh->b_data))    printk ("free_inode: bit already cleared.\n\r");// 置i 節點位圖所在緩沖區已修改標志,并清空該i 節點結構所占內存區。  bh->b_dirt = 1;  memset (inode, 0, sizeof (*inode));}//// 為設備dev 建立一個新i 節點。返回該新i 節點的指針。// 在內存i 節點表中獲取一個空閑i 節點表項,并從i 節點位圖中找一個空閑i 節點。struct m_inode *new_inode (int dev){  struct m_inode *inode;  struct super_block *sb;  struct buffer_head *bh;  int i, j;// 從內存i 節點表(inode_table)中獲取一個空閑i 節點項(inode)。  if (!(inode = get_empty_inode ()))    return NULL;// 讀取指定設備的超級塊結構。  if (!(sb = get_super (dev)))    panic ("new_inode with unknown device");// 掃描i 節點位圖,尋找首個0 比特位,尋找空閑節點,獲取放置該i 節點的節點號。  j = 8192;  for (i = 0; i < 8; i++)    if (bh = sb->s_imap[i])      if ((j = find_first_zero (bh->b_data)) < 8192)	break;// 如果全部掃描完還沒找到,或者位圖所在的緩沖塊無效(bh=NULL)則 返回0,退出(沒有空閑i 節點)。  if (!bh || j >= 8192 || j + i * 8192 > sb->s_ninodes)    {      iput (inode);      return NULL;    }// 置位對應新i 節點的i 節點位圖相應比特位,如果已經置位,則出錯。  if (set_bit (j, bh->b_data))    panic ("new_inode: bit already set");// 置i 節點位圖所在緩沖區已修改標志。  bh->b_dirt = 1;// 初始化該i 節點結構。  inode->i_count = 1;		// 引用計數。  inode->i_nlinks = 1;		// 文件目錄項鏈接數。  inode->i_dev = dev;		// i 節點所在的設備號。  inode->i_uid = current->euid;	// i 節點所屬用戶id。  inode->i_gid = current->egid;	// 組id。  inode->i_dirt = 1;		// 已修改標志置位。  inode->i_num = j + i * 8192;	// 對應設備中的i 節點號。  inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;	// 設置時間。  return inode;			// 返回該i 節點指針。}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产自产拍在线| 欧美亚洲动漫精品| 国产亚洲一区二区在线观看| 青青草原综合久久大伊人精品优势| 91丝袜美腿高跟国产极品老师| 国产日产欧美一区| 成人激情图片网| 国产精品传媒视频| 欧美主播一区二区三区| 国产精品一区二区91| 国产精品久久久久久妇女6080| 99久久综合狠狠综合久久| 亚洲精品欧美激情| 欧美日韩三级在线| 韩国精品主播一区二区在线观看 | 欧美一区二区高清| 国产99久久久国产精品| 一区二区三区蜜桃| 欧美大片一区二区| 99久久精品国产毛片| 午夜精品福利一区二区蜜股av| 精品日韩欧美一区二区| 成人午夜激情片| 天天做天天摸天天爽国产一区| 精品国产免费人成电影在线观看四季| 色综合视频在线观看| 亚洲色大成网站www久久九九| 91精品国产入口在线| 风流少妇一区二区| 美日韩一区二区三区| 亚洲欧美日本在线| 精品国产99国产精品| 欧美怡红院视频| 国产激情91久久精品导航| 天天射综合影视| 亚洲免费成人av| 国产精品福利一区二区| 久久久久久久久久久黄色| 欧美一级欧美一级在线播放| 色欧美片视频在线观看 | 亚洲激情自拍偷拍| 国产精品伦一区二区三级视频| 欧美一区二区久久| 欧美久久婷婷综合色| 91蝌蚪国产九色| 成人精品免费看| 成人一区在线观看| aa级大片欧美| 欧美自拍丝袜亚洲| 6080亚洲精品一区二区| 69久久夜色精品国产69蝌蚪网| 欧美日韩dvd在线观看| 欧美日韩成人综合在线一区二区| 91高清视频在线| 欧美撒尿777hd撒尿| 欧美日韩国产综合一区二区三区 | 国产成人精品免费| 一道本成人在线| 91精品国产aⅴ一区二区| 欧美一区二区黄色| 久久影视一区二区| 国产精品麻豆久久久| 无码av免费一区二区三区试看 | 亚洲免费在线观看| 亚洲成a天堂v人片| 不卡一卡二卡三乱码免费网站| 日韩欧美一区在线| 一区二区三区在线观看国产| 免费成人在线观看| proumb性欧美在线观看| 欧美日韩国产123区| 国产片一区二区三区| 五月天激情综合| 94色蜜桃网一区二区三区| 欧美乱妇一区二区三区不卡视频| 国产区在线观看成人精品 | 亚洲一线二线三线视频| 麻豆成人免费电影| 一本一道久久a久久精品| 久久久久久日产精品| 久久99深爱久久99精品| 欧美丝袜自拍制服另类| 国产精品网站导航| 国产电影一区在线| 精品国产乱码久久久久久蜜臀| 日本欧美在线观看| 在线免费观看一区| 亚洲最新视频在线观看| 99精品视频一区二区| 精品久久久久久久久久久久久久久 | 国产成人午夜电影网| 久久婷婷国产综合国色天香| 午夜精品久久久久久久久| 91美女在线视频| 亚洲国产精品久久人人爱蜜臀| 在线观看精品一区| 亚洲一区二区高清| 欧美视频中文字幕| 石原莉奈在线亚洲三区| 91精品国产丝袜白色高跟鞋| 午夜视频久久久久久| 欧美麻豆精品久久久久久| 免费在线观看精品| 亚洲小说春色综合另类电影| 欧美一区二区三区视频在线观看| 亚洲sss视频在线视频| 欧美日韩一区二区不卡| 青青草国产成人99久久| 久久亚洲私人国产精品va媚药| 久久99国产精品久久| 日本一区二区三区视频视频| www.欧美.com| 亚洲国产精品一区二区久久 | 国产91精品精华液一区二区三区| 中文字幕视频一区| 日韩片之四级片| 成人av在线播放网址| 午夜精彩视频在线观看不卡| 久久久精品综合| 欧美激情一区二区三区蜜桃视频| 日本高清不卡aⅴ免费网站| 日本午夜一本久久久综合| 国产欧美日韩视频一区二区 | 99久久久国产精品免费蜜臀| 久久精品国产一区二区| 亚洲免费视频中文字幕| 久久影院午夜论| 91.xcao| 色婷婷综合久色| 国产美女在线观看一区| 人禽交欧美网站| 一区二区视频在线看| 国产欧美日韩卡一| 精品播放一区二区| 6080日韩午夜伦伦午夜伦| 色婷婷综合五月| 99久久精品国产观看| 成人免费视频免费观看| 国产福利精品一区二区| 韩国成人在线视频| 日本午夜精品视频在线观看| 亚洲一区电影777| 午夜成人在线视频| 亚洲在线一区二区三区| 亚洲免费资源在线播放| 亚洲自拍偷拍麻豆| 亚洲一区二区成人在线观看| 亚洲在线视频免费观看| 亚洲国产精品久久久男人的天堂| 亚洲青青青在线视频| 亚洲欧美日韩久久精品| 亚洲欧美日韩国产综合| 午夜婷婷国产麻豆精品| 一区二区理论电影在线观看| 一区二区三区在线观看网站| 亚洲mv大片欧洲mv大片精品| 亚洲国产成人av好男人在线观看| 亚洲高清视频的网址| 精品一区二区三区久久| 国产成人av福利| 在线电影一区二区三区| 国产人成一区二区三区影院| 国产成人av电影在线播放| 日韩视频国产视频| 亚洲综合图片区| 不卡电影一区二区三区| 久久蜜臀精品av| 麻豆精品久久精品色综合| 欧美日韩在线精品一区二区三区激情| 欧美mv和日韩mv国产网站| 国产精品三级av在线播放| 免费成人在线影院| 在线亚洲+欧美+日本专区| 久久―日本道色综合久久| 图片区小说区区亚洲影院| 91免费视频观看| 综合激情成人伊人| 成人ar影院免费观看视频| 日韩免费成人网| 亚洲成a人v欧美综合天堂下载 | 国产超碰在线一区| 久久一留热品黄| 日本美女一区二区三区视频| 一本一道综合狠狠老| 国产精品福利一区二区| 国产老女人精品毛片久久| 日韩视频免费直播| 日韩精品91亚洲二区在线观看| 欧美亚一区二区| 亚洲一区二区三区四区在线观看| 成人精品一区二区三区四区| 精品999在线播放| 麻豆成人免费电影| 精品国产乱码久久久久久图片 | 国产一区二区成人久久免费影院 | 欧美大片免费久久精品三p| 麻豆精品蜜桃视频网站| 精品国产青草久久久久福利| 国产自产2019最新不卡| 中文乱码免费一区二区|