資源簡介
Linux0.0.1的源代碼,帶中文的注釋,是研究操作系統的不錯選擇。資源已經非常難得了。

代碼片段和文件信息
/*?bitmap.c?contains?the?code?that?handles?the?inode?and?block?bitmaps?*/
#include?
#include?
#include?
#define?clear_block(addr)?\
//此內嵌匯編的意思為:
// movl 0 %eax
// movl BLOCK_size/4 %edi
// movl *addr %edi
// cld
// rep?stosl //將eax傳送到es:edi
__asm__(“cld\n\t“?\
“rep\n\t“?\
“stosl“?\
::“a“?(0)“c“?(BLOCK_SIZE/4)“D“?((long)?(addr)):“cx““di“)
#define?set_bit(nraddr)?({\
register?int?res?__asm__(“ax“);?\
//此內嵌匯編的意思為:
// movl 0 %eax
// movl nr %ebx
// movl *addr %edx
// btsl %ebx %edx //測試位,將該位送CF,并將該位置1
// setb %al //CF=1,則al=1,反之為0
// movl %eax res
__asm__(“btsl?%2%3\n\tsetb?%%al“:“=a“?(res):“0“?(0)“r“?(nr)“m“?(*(addr)));?\
res;})
#define?clear_bit(nraddr)?({\
register?int?res?__asm__(“ax“);?\
//此內嵌匯編的意思為:
// movl 0 %eax
// movl nr %ebx
// movl *addr %ecx
// btrl %ebx %ecx
// setnb %al //CF=0al=1反之為0
// movl %eax res
__asm__(“btrl?%2%3\n\tsetnb?%%al“:“=a“?(res):“0“?(0)“r“?(nr)“m“?(*(addr)));?\
res;})
#define?find_first_zero(addr)?({?\
int?__res;?\
//此內嵌匯編的意思為:
// movl 0 %ecx
// movl *addr %esi
// cld
// 1: lodsl //將esi送入eax
// notl %eax //求反
// bsfl %eax %edx //測試eax中的各位,當遇到有1的位,ZF=0,且將該位的序號存入edx,如果eax中所有位為0,則ZF=1,且edx中的值無意義
// je 2f
// addl %edx %ecx
// jmp 3f
// 2: addl $32 %ecx
// cmpl $8192 %ecx //$8192==8K
// jl 1b
// 3: movl %eax _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;})
void?free_block(int?dev?int?block)
{
struct?super_block?*?sb;
struct?buffer_head?*?bh;
if?(!(sb?=?get_super(dev))) //在超級塊表中找包括dev的超級塊
panic(“trying?to?free?block?on?nonexistent?device“);
if?(block?s_firstdatazone?||?block?>=?sb->s_nzones) //這個塊是否小于超級所表示的第一數據區域或該塊是否超過了超級塊所表示的最大數據區域
panic(“trying?to?free?block?not?in?datazone“);
bh?=?get_hash_table(devblock);
if?(bh)?{
if?(bh->b_count?!=?1)?{ //如果這個bh是共享的,就不釋放
printk(“trying?to?free?block?(%04x:%d)?count=%d\n“
devblockbh->b_count);
return;
}
bh->b_dirt=0;
bh->b_uptodate=0;
brelse(bh); //釋放此bh
}
block?-=?sb->s_firstdatazone?-?1?; //此時塊代表在超級塊的相對區域,即在超級塊中的第幾塊區域
if?(clear_bit(block&8191sb->s_zmap[block/8192]->b_data))?{ //測試該相對塊位置在超級塊中的區域映射中表示的數據位是否為1,并從映射中清除該位,即表示該塊不在內存的區域MAP中
printk(“block?(%04x:%d)?“devblock+sb->s_firstdatazone-1);
panic(“free_block:?bit?already?cleared“);
}
sb->s_zmap[block/8192]->b_dirt?=?1; //表示已修改了超級塊區域映射表,需要寫盤
}
int?new_block(int?dev)
{
struct?buffer_head?*?bh;
struct?super_block?*?sb;
int?ij;
if?(!(sb?=?get_super(dev))) //取得該設備文件的超級塊
panic(“trying?to?get?new?block?from?nonexistant?device“);
j?=?8192; //8192==8K
for?(i=0?;?i<8?;?i++)
if?(bh=sb->s_zmap[i])
if?((j=find_first_zero(bh->b_data))<8192) //在s_zmap中尋找一個空的表項
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2004-05-21?22:23??boot\
?????文件????????8716??1999-03-09?21:58??boot\boot.s
?????文件????????7564??1999-03-10?11:13??boot\head.s
?????目錄???????????0??2004-05-21?22:23??fs\
?????文件????????5854??1999-03-10?13:19??fs\bitmap.c
?????文件????????2206??1999-03-10?13:35??fs\block_dev.c
?????文件????????7374??1999-03-10?14:24??fs\buffer.c
?????文件????????1419??1999-03-10?18:41??fs\char_dev.c
?????文件????????9404??1999-03-10?22:12??fs\exec.c
?????文件????????1664??1999-03-10?23:19??fs\fcntl.c
?????文件????????2338??1999-03-11?10:24??fs\file_dev.c
?????文件??????????59??1991-08-19?05:57??fs\file_table.c
?????文件????????7284??1999-03-11?13:37??fs\inode.c
?????文件????????1091??1999-03-11?13:50??fs\ioctl.c
?????文件????????4830??1991-09-17?23:14??fs\Makefile
?????文件???????17926??1999-03-11?23:06??fs\namei.c
?????文件????????4784??1999-03-12?21:09??fs\open.c
?????文件????????2491??1999-03-12?21:27??fs\pipe.c
?????文件????????3106??1999-03-12?21:41??fs\read_write.c
?????文件????????1290??1999-03-13?21:35??fs\stat.c
?????文件????????3125??1999-03-13?21:56??fs\super.c
?????文件????????1367??1999-03-17?11:49??fs\truncate.c
?????文件????????4352??1991-09-08?22:15??fs\tty_ioctl.c
?????目錄???????????0??2004-05-21?22:23??include\
?????文件????????6267??1991-09-17?23:10??include\a.out.h
?????目錄???????????0??2004-05-21?22:23??include\asm\
?????文件?????????886??1999-03-11?13:46??include\asm\io.h
?????文件?????????624??1999-03-11?21:45??include\asm\memory.h
?????文件????????1145??1999-03-13?21:11??include\asm\segment.h
?????文件????????2149??1999-03-17?10:56??include\asm\system.h
?????文件?????????336??1991-09-17?23:12??include\const.h
............此處省略68個文件信息
- 上一篇:基于單片機的煤氣報警器proteus仿真
- 下一篇:多元Logistic 回歸分析
評論
共有 條評論