当前位置: 首页 > news >正文

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详解 模块简介 该模块包含了两对函数&#xff0c;第一对是和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指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令&#xff08;重要&#xff09;重定向cat指令more指令less指令&#xff08;重要…...

CTF 2015: Search Engine-fastbin_dup_into_stack

参考&#xff1a; [1]https://gsgx.me/posts/9447-ctf-2015-search-engine-writeup/ [2]https://blog.csdn.net/weixin_38419913/article/details/103238963(掌握利用点&#xff0c;省略各种逆向细节) [3]https://bbs.kanxue.com/thread-267876.htm&#xff08;逆向调试详解&am…...

DRF之全局异常处理

一、REST framework 提供了异常处理&#xff0c;我们可以自定义异常处理函数 使用方式&#xff1a; from rest_framewoork.views import exception_handerdef custom_exception_handler(exc,context):# 先调用REST framework默认的异常处理方法获得标准错误响应对象response …...

AI创作工具的使用体验报告

下面是AI创作工具的使用体验报告&#xff0c;围绕以下三点展开&#xff1a; 一、工具的使用体验如何&#xff1f; CSDN博客AI创作工具是一款非常易用的工具&#xff0c;操作简单&#xff0c;可以很快地开始创建内容。在使用过程中&#xff0c;我发现它的语言模型很智能&#…...

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更新)

阿里云服务器收费标准分为包年包月和按量付费两种模式&#xff0c;包年包月是一种先付费后使用的计费方式&#xff0c;按量付费是一种先使用后付费的计费方式。选择包年包月的收费模式&#xff0c;用户可以提前预留资源&#xff0c;同时享受更大的价格优惠&#xff0c;帮您更大…...

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 是一系列标准&#xff0c;规定了集成电路卡和此类卡的使用 互换。 这些卡是用于在外部世界和卡中的集成电路之间协商的信息交换的识别卡。 作为信息交换的结果&#xff0c;卡传递信息&#xff08;计算结果、存储的数据&#xff09;和/或修改其内容&#xff0…...

学习C#反射(Reflection)

反射提供描述程序集、模块和类型的对象&#xff08;Type 类型&#xff09;。 可以使用反射动态地创建类型的实例&#xff0c;将类型绑定到现有对象&#xff0c;或从现有对象中获取类型&#xff0c;然后调用其方法或访问器字段和属性。 如果代码中使用了特性(Attribute)&#xf…...

Spring Boot的核心组件和工作原理

引言 Spring Boot是一个快速构建应用程序的框架&#xff0c;通过自动化配置和约定优于配置的原则&#xff0c;可以快速地创建可独立运行的、生产级别的Spring应用程序。Spring Boot的核心组件是自动配置、起步依赖和嵌入式Web服务器。 在本文中&#xff0c;我们将深入了解Spr…...

【指针的深刻理解】

如何看待下面代码中的a变量? #include<stdio.h> int main() {int a 0;//同样的一个a&#xff0c;在不同的表达式中&#xff0c;名称是一样的&#xff0c;但是含义是完全不同的&#xff01;a 10;//使用的是a的空间&#xff1a;左值int b a; //使用的是a的内容&#x…...

lintcode-图的拓扑排序(java)

拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图&#xff0c;图节点的拓扑排序定义如下: 对…...

【状态估计】基于随机方法优化PMU优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Rinne Loves Graph

Rinne Loves Graph (nowcoder.com) 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 Island 发生了一场暴乱&#xff01;现在 Rinne 要和 Setsuna 立马到地上世界去。 众所周知&#xff1a;Island 是有一些奇怪的城镇和道路构成的…...

第15章:索引的数据结构

一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则通过索引查找相关数据。如果不符合则需要全表扫描&#xff0c;一条一条查找记录&#xff0c;直到…...

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…...

机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037

Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…...

第五篇:强化学习基础之马尔科夫决策过程

你好&#xff0c;我是zhenguo(郭震) 今天总结强化学习第五篇&#xff1a;马尔科夫决策过程 基础 马尔科夫决策过程&#xff08;MDP&#xff09;是强化学习的基础之一。下面统一称为&#xff1a;MDP MDP提供了描述序贯决策问题的数学框架。 它将决策问题建模为&#xff1a; 状态…...

Oracle面试题

1. 什么是存储过程&#xff0c;使用存储过程的好处&#xff1f; 存储过程&#xff08;Stored Procedure &#xff09;是一组为了完成特定功能的SQL 语句集&#xff0c;经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数&#xff08;如果该存储过程带有参数&#…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...