资源简介
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 < sb->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 回归分析
相关资源
- 剖析Linux系统下基于NUMA构建的服务
- linux SPI设备注册和驱动小结
- 周立功PCI CAN卡LINUX驱动ubuntu16.04内核
- 实现Windows与Linux两系统间自由切换
- 在双引导Linux系统上实现OS自动切换
- 如何删除Linux系统后找回Windows的启动
- Linux命令详解,循序渐进Linux
- Linux系统文件命令精通指南(下)
- Linux系统命令及Shell脚本实践指南
- RK3308 LINUX开发者指南(1).pdf
- S3C4510 开发板中uCLinux系统开发
- 嵌入式操作系统的解析
- Linux点阵字库和字库生成器.rar
- Linux-UNIX系统编程手册上、下册中文版
- 基于ARM的电子相册源码含动态库可运
- PSFTP.EXE 工具
- 如何实现Linux与windows文件互传
- Linux内核函数Start_kernel()的功能
- 一只老鸟的嵌入式ARM学习心得
- cximage的linux版本源码
- yaf-2.1.17.tgz
- IBM eServer xSeries 445 EXP400在Linux下的双
- 如何在本地无光驱软驱时通过PXE远程
- Linux操作系统下配置无密码的RSH访问
- 如何利用mdadm在Linux中配置RAID
- db2 v9.5 linux 许可证
- linux telnet服务安装包
- SUSE Linux Enterprise——助力曙光高
- 运行LINUX的中高端HP INTEGRITY服务器
- lsoflist open files命令
评论
共有 条评论