Linux-0.11 文件系统bitmap.c详解
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详解
Linux-0.11 文件系统bitmap.c详解 模块简介 该模块包含了两对函数,第一对是和i节点相关的free_inode()和new_inode()。第二对是和逻辑块相关的free_block()和new_block()。 函数详解 free_block void free_block(int dev, int block)该函数的作用是释放设备dev…...
【Linux】基本指令,拥抱Linux的第一步
[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令(重要)cp指令(重要)mv指令(重要)重定向cat指令more指令less指令(重要…...
CTF 2015: Search Engine-fastbin_dup_into_stack
参考: [1]https://gsgx.me/posts/9447-ctf-2015-search-engine-writeup/ [2]https://blog.csdn.net/weixin_38419913/article/details/103238963(掌握利用点,省略各种逆向细节) [3]https://bbs.kanxue.com/thread-267876.htm(逆向调试详解&am…...
DRF之全局异常处理
一、REST framework 提供了异常处理,我们可以自定义异常处理函数 使用方式: from rest_framewoork.views import exception_handerdef custom_exception_handler(exc,context):# 先调用REST framework默认的异常处理方法获得标准错误响应对象response …...
AI创作工具的使用体验报告
下面是AI创作工具的使用体验报告,围绕以下三点展开: 一、工具的使用体验如何? CSDN博客AI创作工具是一款非常易用的工具,操作简单,可以很快地开始创建内容。在使用过程中,我发现它的语言模型很智能&#…...
C++算法模板(转自acwing)
快速排序算法模板 —— 模板题 AcWing 785. 快速排序 void quick_sort(int q[], int l, int r) {if (l > r) return;int i l - 1, j r 1, x q[l r >> 1];while (i < j){do i ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i],…...
阿里云服务器最新优惠价格及最新收费标准(2023更新)
阿里云服务器收费标准分为包年包月和按量付费两种模式,包年包月是一种先付费后使用的计费方式,按量付费是一种先使用后付费的计费方式。选择包年包月的收费模式,用户可以提前预留资源,同时享受更大的价格优惠,帮您更大…...
React实现监听粘贴事件并获取粘贴板中的截图
目录 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件从粘贴板获取截图文件React监听事件 事件监听绑定的事件函数相关扩展 监听粘贴事件并获取粘贴板中的截图 TSX中给组件添加监听粘贴事件 ? 1 2 3 4 5 6 7 8 9 10 11 const pasteImageRef useRef<HTML…...
ISO_IEC_7816-3
介绍 ISO/IEC 7816 是一系列标准,规定了集成电路卡和此类卡的使用 互换。 这些卡是用于在外部世界和卡中的集成电路之间协商的信息交换的识别卡。 作为信息交换的结果,卡传递信息(计算结果、存储的数据)和/或修改其内容࿰…...
学习C#反射(Reflection)
反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性(Attribute)…...
Spring Boot的核心组件和工作原理
引言 Spring Boot是一个快速构建应用程序的框架,通过自动化配置和约定优于配置的原则,可以快速地创建可独立运行的、生产级别的Spring应用程序。Spring Boot的核心组件是自动配置、起步依赖和嵌入式Web服务器。 在本文中,我们将深入了解Spr…...
【指针的深刻理解】
如何看待下面代码中的a变量? #include<stdio.h> int main() {int a 0;//同样的一个a,在不同的表达式中,名称是一样的,但是含义是完全不同的!a 10;//使用的是a的空间:左值int b a; //使用的是a的内容&#x…...
lintcode-图的拓扑排序(java)
拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图,图节点的拓扑排序定义如下: 对…...
【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Rinne Loves Graph
Rinne Loves Graph (nowcoder.com) 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去。 众所周知:Island 是有一些奇怪的城镇和道路构成的…...
第15章:索引的数据结构
一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据。如果不符合则需要全表扫描,一条一条查找记录,直到…...
机械师曙光16电脑开机自动蓝屏怎么解决?
机械师曙光16电脑开机自动蓝屏怎么解决?有的用户在使用机械师曙光16电脑的时候,遇到了一些系统问题,导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏,无法进行任何操作。那么这个情况怎么去进行问题的解决呢?来…...
机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037
Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…...
第五篇:强化学习基础之马尔科夫决策过程
你好,我是zhenguo(郭震) 今天总结强化学习第五篇:马尔科夫决策过程 基础 马尔科夫决策过程(MDP)是强化学习的基础之一。下面统一称为:MDP MDP提供了描述序贯决策问题的数学框架。 它将决策问题建模为: 状态…...
Oracle面试题
1. 什么是存储过程,使用存储过程的好处? 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数&#…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
