Linux-0.11 文件系统bitmap.c详解

模块简介

该模块包含了两对函数,第一对是和i节点相关的free_inode()和new_inode()。第二对是和逻辑块相关的free_block()和new_block()。

函数详解

free_block

void free_block(int dev, int block)

该函数的作用是释放设备dev上的序号为block的逻辑块。 入参中的block是磁盘上的绝对位置

首先从设备dev中取出超级快。如果找不到,则返回内核错误。

struct super_block * sb;
struct buffer_head * bh;if (!(sb = get_super(dev)))panic("trying to free block on nonexistent device");

接下来判断盘块号block的有效性,如果盘块号block小于数据区一个数据块的盘块号或者大于设备上的总的逻辑块, 则出错停机。

if (block < sb->s_firstdatazone || block >= sb->s_nzones)panic("trying to free block not in datazone");

接下来从哈希链表中查找bh块, 如果找到了, 如果引用计数>=2, 则返回。 如果引用计数为1, 则将bh块上的b_dirt和b_uptodate属性置为0,然后将引用计数减1。

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对应的数据块位图置为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;

new_block

int new_block(int dev)

该函数的作用是向设备申请一个逻辑块。

 struct buffer_head * bh;struct super_block * sb;int i,j;if (!(sb = get_super(dev))) //首先获取数据块的超级块panic("trying to get new block from nonexistant device");j = 8192;for (i=0 ; i<8 ; i++)if ((bh=sb->s_zmap[i])) /if ((j=find_first_zero(bh->b_data))<8192)//寻找空闲的标记位break;if (i>=8 || !bh || j>=8192)return 0;if (set_bit(j,bh->b_data))//设置已使用的标记panic("new_block: bit already set");bh->b_dirt = 1;

这里需要区别两个概念,即磁盘块号和逻辑块号。磁盘块号是一个绝对位置,而逻辑块号是一个相对位置。这两者之间有一个s_firstdatazone的差,即减去磁盘分区上的前几个块(引导块/超级快/i节点位图/逻辑块位图/i节点)。在超级块中s_firstdatazone记录了第一个数据块的磁盘号。所以,逻辑号和磁盘号之间有关系
block = nr + s_firstdatazone -1

下面这里在得到存储的逻辑位置(i,j)之后,计算绝对位置时,便使用了上述公式j += i*8192 + sb->s_firstdatazone-1:

 j += i*8192 + sb->s_firstdatazone-1;if (j >= sb->s_nzones)return 0;if (!(bh=getblk(dev,j)))//获取该block的bh块panic("new_block: cannot get block");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;

free_inode

void free_inode(struct m_inode * inode)

该函数的作用是释放指定的inode节点。该函数在iput函数(inode.c)中如果文件的链接数为0的时候被调用。

m_前缀代表是内存中存储的i节点格式。 d_前缀代表的是磁盘中i节点格式。

 struct super_block * sb;struct buffer_head * bh;if (!inode)//inode地址为空return;if (!inode->i_dev) {//i节点设备号为0,代表没有使用memset(inode,0,sizeof(*inode));return;}if (inode->i_count>1) {//i节点还有其他引用printk("trying to free inode with count=%d\n",inode->i_count);panic("free_inode");}if (inode->i_nlinks)//文件链接数不为0panic("trying to free inode with links");if (!(sb = get_super(inode->i_dev)))//获取i节点所在设备的超级块panic("trying to free inode on nonexistent device");if (inode->i_num < 1 || inode->i_num > sb->s_ninodes)panic("trying to free inode 0 or nonexistant inode");if (!(bh=sb->s_imap[inode->i_num>>13]))panic("nonexistent imap in superblock");if (clear_bit(inode->i_num&8191,bh->b_data))//清除使用标记位printk("free_inode: bit already cleared.\n\r");bh->b_dirt = 1;memset(inode,0,sizeof(*inode));

new_inode

struct m_inode * new_inode(int dev)

该函数的作用是向dev设备申请一个i节点。

 struct m_inode * inode;struct super_block * sb;struct buffer_head * bh;int i,j;if (!(inode=get_empty_inode()))//从内存i节点表获取一个空闲项return NULL;if (!(sb = get_super(dev)))panic("new_inode with unknown device");j = 8192;for (i=0 ; i<8 ; i++)if ((bh=sb->s_imap[i]))if ((j=find_first_zero(bh->b_data))<8192)//寻找空闲的标记位break;if (!bh || j >= 8192 || j+i*8192 > sb->s_ninodes) {iput(inode);return NULL;}if (set_bit(j,bh->b_data))panic("new_inode: bit already set");bh->b_dirt = 1;inode->i_count=1;//给i节点进行赋值inode->i_nlinks=1;inode->i_dev=dev;inode->i_uid=current->euid;inode->i_gid=current->egid;inode->i_dirt=1;inode->i_num = j + i*8192;inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;return inode;

Linux-0.11 文件系统bitmap.c详解相关推荐

  1. linux 0.11 源码学习(十四)

    文件系统综述 linux 文件系统是基于MINIX 1.0文件系统,这部分的代码量是整个内核里最大的,但代码结构对应着MINIX文件系统的构成,还是比较清晰易读的. MINIX文件系统 MINIX的文 ...

  2. linux 0.11 init/main.c初始化部分

    在head设置了页表.GDT和IDT之后,然后就进入了main程序,这里首先介绍一些参数: ORIG_ROOT_DEV,该参数是读取0x901FC的两个byte读取的数据,这两个byte就是boots ...

  3. 转载:linux驱动层到应用层的重要接口sys文件系统---/sys目录详解

    linux驱动层到应用层的重要接口sys文件系统---/sys目录详解 Linux2.6内核中引入了sysfs文件系统.sysfs文件系统整理的设备驱动的相关文件节点,被视为dev文件系统的替代者.同 ...

  4. Linux Kernel 6.0 CXL Core pci.c 详解

    文章目录 前言 相关链接 Ref 正文 前言 CXL 是一个比较新的技术,所以我研究的内核源码是选了当前比较新的内核版本 linux 6.0.打算将内核关于 CXL 的驱动进行解析一遍,一步一步慢慢来 ...

  5. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  6. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  7. Linux中/proc目录下文件详解(二)

    Linux中/proc目录下文件详解(二) /proc/mdstat文件 这个文件包含了由md设备驱动程序控制的RAID设备信息. 示例: [root@localhost ~]# cat /proc/ ...

  8. Linux 0.11内核分析02:系统启动

    目录 1. 内核镜像的构建 1.1 内核源码结构 1.1.1 boot 1.1.2 fs 1.1.3 include 1.1.4 init 1.1.5 kernel 1.1.6 lib 1.1.7 m ...

  9. Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

    http://blog.chinaunix.net/uid-10449864-id-2956854.html 原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息, ...

最新文章

  1. 链表中倒数第k个节点
  2. Forcepoint DLP解决方案持续推高各机构的业务发展进程
  3. Struts2的配置文件——web.xml
  4. python项目构建工具zc.buildout
  5. collections系列
  6. 海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...
  7. UML类图介绍及简单用法
  8. [转载] 杜拉拉升职记——43 偷听者
  9. 494. 目标和(JavaScript)
  10. 《Excel 职场手册:260招菜鸟变达人》一第 26 招 对齐两个字的名字
  11. Dynamic Programming之Longest Increasing Subsequence (LIS)问题
  12. 资深程序员是用五年时间攒够100万,老婆是关键
  13. window环境下杀死tomcat
  14. ios 8 适配须知
  15. 二元关系的矩阵和图表示
  16. Hibernate第四篇【集合映射、一对多和多对一】
  17. 证明四元数表示旋转的过程实部为0,虚部为罗德里格斯公式结果
  18. iOS图片压缩成指定大小
  19. 所有ICO项目100%都会归零!STO证券型代币才是区块链融资正确打开方式
  20. css+分散,【原】css实现两端对齐的3种方法

热门文章

  1. 永恒之境服务器维护,4月25日服务器维护公告 虚空梦境
  2. 阿里土话------记录职场经典语录
  3. 指针和 php引用的区别,c的指针和php中的引用的区别
  4. 双线biubiu区服务器位置,剑灵火力全开biubiu活动地址 剑灵新区双线biubiu区礼包领取活动地址...
  5. Smartbi电子表格软件架构与差异化特色
  6. UWB监狱室内人员定位技术,高精准室内人员定位-新导智能
  7. 奔三的尴尬年纪,你要知道的44件事
  8. 计算机网络Netsh,netsh命令详解(netsh命令详解).doc
  9. [原创]Cadence软件使用记录8_Allegro绘制PCB菜鸟初成
  10. “东数西算”工程来了—模组厂商如何助力打造5G+AIoT数智世界?