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

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

?? bitmap.c

?? LINUX 0.11版內核代碼。 并有代碼分析說明。
?? C
字號:
/* passed *  linux/fs/bitmap.c * *  (C) 1991  Linus Torvalds */#include <set_seg.h>
/* bitmap.c 程序含有處理i 節點和磁盤塊位圖的代碼 */

// 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。
// 主要使用了其中的memset()函數。#include <string.h>// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,
// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。#include <linux/sched.h>
// 內核頭文件。含有一些內核常用函數的原形定義。#include <linux/kernel.h>
//// 將指定地址(addr)處的一塊內存清零。嵌入匯編程序宏。
// 輸入:eax = 0,ecx = 數據塊大小BLOCK_SIZE/4,edi = addr。
extern _inline void clear_block(char *addr)
{_asm{	pushf
	mov edi,addr
	mov ecx,BLOCK_SIZE/4
	xor eax,eax
	cld
	rep stosd	popf
}}//#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 的內容。
extern _inline int set_bit(unsigned long nr,char* addr)
{
//	volatile register int __res;
	_asm{
		xor eax,eax
		mov ebx,nr
		mov edx,addr
		bts [edx],ebx
		setb al
//		mov __res,eax
	}
//	return __res;
}
//#define set_bit(nr,addr) ({\//register int res __asm__("ax"); \//__asm__ __volatile__("btsl %2,%3\n\tsetb %%al": \//"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \//res;})
//// 復位指定地址開始的第nr 位偏移處的比特位。返回原比特位的反碼(1 或0)。
// 輸入:%0 - eax(返回值),%1 - eax(0);%2 - nr,位偏移值;%3 - (addr),addr 的內容。
extern _inline int clear_bit(unsigned long nr,char* addr)
{
//	volatile register int __res;
	_asm{
		xor eax,eax
		mov ebx,nr
		mov edx,addr
		btr [edx],ebx
		setnb al
//		mov __res,eax
	}
//	return __res;
}//#define clear_bit(nr,addr) ({\//register int res __asm__("ax"); \//__asm__ __volatile__("btrl %2,%3\n\tsetnb %%al": \//"=a" (res):"0" (0),"r" (nr),"m" (*(addr))); \//res;})
//// 從addr 開始尋找第1 個0 值比特位。
// 輸入:%0 - ecx(返回值);%1 - ecx(0);%2 - esi(addr)。
// 在addr 指定地址開始的位圖中尋找第1 個是0 的比特位,并將其距離addr 的比特位偏移值返回。
extern _inline int find_first_zero(char *addr)
{
//	int __res;
	_asm{		pushf
		xor ecx,ecx
		mov esi,addr
		cld   /*清方向位。*/
	l1: lodsd   /*取[esi] -> eax。*/
		not eax   /*eax 中每位取反。*/
		bsf edx,eax   /*從位0 掃描eax 中是1 的第1 個位,其偏移值 -> edx。*/
		je l2   /*如果eax 中全是0,則向前跳轉到標號2 處(40 行)。*/
		add ecx,edx   /*偏移值加入ecx(ecx 中是位圖中首個是0 的比特位的偏移值)*/
		jmp l3   /*向前跳轉到標號3 處(結束)。*/
	l2: add ecx,32   /*沒有找到0 比特位,則將ecx 加上1 個長字的位偏移量32。*/
		cmp ecx,8192   /*已經掃描了8192 位(1024 字節)了嗎?*/
		jl l1  /*若還沒有掃描完1 塊數據,則向前跳轉到標號1 處,繼續。*/
//	l3: mov __res,ecx  /*結束。此時ecx 中是位偏移量。*/
	l3: mov eax,ecx		popf
	}
//	return __res;
}/*#define find_first_zero(addr) ({ \int __res; \__asm__("cld\n" \	"1:\tlodsl\n\t" \	"notl %%eax\n\t" \	"bsfl %%eax,%%edx\n\t" \	"je 2f\n\t" \	"addl %%edx,%%ecx\n\t" \	"jmp 3f\n" \	"2:\taddl $32,%%ecx\n\t" \	"cmpl $8192,%%ecx\n\t" \	"jl 1b\n" \ 	"3:" \ 	:"=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 ;	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 節點指針。}

/*
	本程序的功能和作用即簡單又清晰,主要用于對i 節點位圖和邏輯塊位圖進行釋放和
占用處理。操作i 節點位圖的函數是free_inode()和new_inode(),操作邏輯塊位圖的函數
是free_block()和new_block()。
	函數free_block()用于釋放指定設備dev 上數據區中的邏輯塊block。具體操作是復位
指定邏輯塊block對應邏輯塊位圖中的比特位。它首先取指定設備dev 的超級塊,并根據超
級塊上給出的設備數據邏輯塊的范圍,判斷邏輯塊號block 的有效性。然后在高速緩沖區中
進行查找,看看指定的邏輯塊現在是否正在高速緩沖區中,若是,則將對應的緩沖塊釋放掉。
接著計算block 從數據區開始算起的數據邏輯塊號(從1開始計數),并對邏輯塊(區段)位圖
進行操作,復位對應的比特位。最后根據邏輯塊號設置相應邏輯塊位圖在緩沖區中對應的
緩沖塊的已修改標志。
	函數new_block()用于向設備dev 申請一個邏輯塊,返回邏輯塊號。并置位指定邏輯塊
block 對應的邏輯塊位圖比特位。它首先取指定設備dev 的超級塊。然后對整個邏輯塊位圖
進行搜索,尋找首個是0 的比特位。若沒有找到,則說明盤設備空間已用完,返回0。否則
將該比特位置為1,表示占用對應的數據邏輯塊。并將該比特位所在緩沖塊的已修改標志置位。
接著計算出數據邏輯塊的盤塊號,并在高速緩沖區中申請相應的緩沖塊,并把該緩沖塊清零。
然后設置該緩沖塊的已更新和已修改標志。最后釋放該緩沖塊,以便其它程序使用,并返回
盤塊號(邏輯塊號)。	函數free_inode()用于釋放指定的i 節點,并復位對應的i 節點位圖比特位;new_inode()
用于為設備dev建立一個新i 節點。返回該新i 節點的指針。主要操作過程是在內存i 節點表
中獲取一個空閑i 節點表項,并從i 節點位圖中找一個空閑i 節點。這兩個函數的處理過程
與上述兩個函數類似,因此這里就不用再贅述。
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区成人在线视频| 中文字幕日韩精品一区| av电影一区二区| 国内精品嫩模私拍在线| 天天影视涩香欲综合网| 亚洲第一福利视频在线| 五月婷婷另类国产| 亚洲午夜视频在线| 日韩国产精品久久久| 日韩福利电影在线| 91美女在线观看| 91网页版在线| 欧美三级视频在线观看| 在线电影一区二区三区| 日韩午夜激情av| 久久久久久电影| 国产精品私房写真福利视频| 日韩理论在线观看| 亚洲第一激情av| 日本不卡视频在线| 国产乱对白刺激视频不卡| 国产成人亚洲综合a∨婷婷| 成人h精品动漫一区二区三区| 色94色欧美sute亚洲线路一ni| 91国偷自产一区二区开放时间 | 中文字幕国产精品一区二区| 国产亚洲1区2区3区| 亚洲欧洲一区二区在线播放| 亚洲国产精品尤物yw在线观看| 日本午夜一区二区| 粉嫩欧美一区二区三区高清影视| 91一区二区三区在线播放| 日本高清免费不卡视频| 日韩欧美美女一区二区三区| 国产欧美日韩中文久久| 一区二区三区欧美在线观看| 美日韩一区二区| 成人av网在线| 日韩一区二区三区av| 国产精品久线在线观看| 日韩不卡在线观看日韩不卡视频| 国产成人在线免费观看| 欧美日韩成人一区二区| 国产精品五月天| 日本中文在线一区| 色婷婷av一区| 久久久亚洲欧洲日产国码αv| 艳妇臀荡乳欲伦亚洲一区| 国产精品自拍av| 欧美一区二区三区电影| 国产精品视频九色porn| 美女视频一区二区| 欧美日韩国产区一| 亚洲人成网站色在线观看| 国产精品自拍三区| 日韩一区二区在线观看视频播放| 最新国产成人在线观看| 国产真实乱偷精品视频免| 欧美精品v国产精品v日韩精品| 日韩成人午夜电影| 91麻豆精品在线观看| 日本一区二区免费在线| 国产综合色在线| 欧美成人欧美edvon| 日韩精品成人一区二区三区| 在线观看免费成人| 综合在线观看色| 91亚洲国产成人精品一区二三 | 一区二区中文字幕在线| 国产乱人伦偷精品视频免下载| 欧美一级日韩不卡播放免费| 午夜激情一区二区| 日本高清成人免费播放| 一区二区三区欧美| 欧美中文字幕久久| 亚洲一卡二卡三卡四卡| 欧美影视一区二区三区| 亚洲综合视频网| 91国偷自产一区二区三区成为亚洲经典 | 欧美精品xxxxbbbb| 日韩在线一区二区三区| 欧美视频一区二区在线观看| 亚洲超碰精品一区二区| 777色狠狠一区二区三区| 图片区小说区区亚洲影院| 制服丝袜激情欧洲亚洲| 蜜乳av一区二区三区| 日韩精品在线看片z| 精品亚洲免费视频| 国产精品色婷婷| 99综合影院在线| 亚洲一区二区高清| 欧美日韩电影在线播放| 久久99国产精品成人| 国产欧美一区二区三区网站| 99久久综合精品| 亚洲一区免费视频| 欧美一区二区三区免费在线看| 精品写真视频在线观看| 国产精品久久久久久久久免费相片| 不卡一区二区在线| 亚洲午夜精品在线| 精品福利av导航| 波多野结衣精品在线| 亚洲大片一区二区三区| 欧美www视频| www.一区二区| 日韩精品一级二级| 国产精品久久久久久久久久久免费看| 色综合一区二区| 蓝色福利精品导航| 亚洲视频在线一区| 亚洲欧美中日韩| 日韩一级片在线观看| 成人综合日日夜夜| 午夜电影网亚洲视频| 国产午夜精品在线观看| 欧美男男青年gay1069videost | 亚洲一区二区精品视频| 久久综合给合久久狠狠狠97色69| 99精品国产91久久久久久 | 国产在线视频精品一区| 亚洲一区二区三区四区在线| 国产丝袜在线精品| 7799精品视频| 在线观看亚洲一区| 国产91丝袜在线播放| 免费看日韩精品| 亚洲狠狠丁香婷婷综合久久久| 精品国产99国产精品| 欧美日韩二区三区| 91亚洲男人天堂| 国产高清成人在线| 热久久久久久久| 天堂蜜桃91精品| 亚洲精品欧美专区| 国产精品欧美久久久久无广告 | 国产成人小视频| 免费观看日韩av| 亚洲自拍欧美精品| 亚洲乱码中文字幕综合| 国产精品午夜在线观看| 欧美va亚洲va| 日韩欧美区一区二| 日韩视频一区在线观看| 欧美精品18+| 欧美欧美欧美欧美首页| 欧美日韩国产一二三| 在线观看一区不卡| 欧美综合一区二区三区| 在线一区二区三区四区| 91搞黄在线观看| 欧美最新大片在线看 | 午夜精品久久一牛影视| 午夜精品一区二区三区电影天堂| 亚洲动漫第一页| 午夜国产精品影院在线观看| 丝袜亚洲另类欧美综合| 免费成人深夜小野草| 日韩电影一区二区三区四区| 麻豆精品在线播放| 国模套图日韩精品一区二区| 国产精品亚洲视频| 国产成人啪免费观看软件| 成人一区二区视频| 成av人片一区二区| 在线中文字幕一区| 在线成人av影院| 日韩视频免费观看高清完整版在线观看 | 日韩欧美高清dvd碟片| 欧美夫妻性生活| 成人美女在线观看| 成人小视频在线| 波多野结衣中文一区| 在线免费不卡电影| 日韩丝袜美女视频| 久久久久九九视频| 中文字幕一区二区三区不卡在线| 亚洲人成人一区二区在线观看 | 欧美性受xxxx| 欧美一二三四在线| 欧美激情一区二区在线| 亚洲老司机在线| 麻豆精品在线看| av在线综合网| 欧美一区二区三区在线观看| 久久免费午夜影院| 亚洲国产日韩在线一区模特| 久久国内精品视频| 91香蕉视频mp4| 日韩免费在线观看| 亚洲视频一区二区在线观看| 日韩av一区二| 成人av在线资源| 日韩欧美一区在线| 一区二区三区中文字幕电影 | 欧美视频三区在线播放| 精品少妇一区二区三区在线视频| 中文字幕在线不卡一区| 免费在线看一区|