linux 0.11 内核学习 -- inode.c

本文档详细介绍了Linux 0.11内核中inode结构及其管理,包括等待、锁定和解锁inode,以及同步和无效化i节点的相关函数。此外,还涉及到文件数据块映射到磁盘块的操作,如_bmap函数,用于处理文件逻辑块到物理块的映射。最后,讲解了如何获取空闲i节点和释放i节点的流程。
摘要由CSDN通过智能技术生成

/*

 *  linux/fs/inode.c

 *

 *  (C) 1991  Linus Torvalds

 */

 

#include <string.h>

#include <sys/stat.h> // 文件状态头文件

 

#include <linux/sched.h>

#include <linux/kernel.h>

#include <linux/mm.h>

#include <asm/system.h>

 

struct m_inode inode_table[NR_INODE]={ {0,},}; // 内存中i 节点表

 

static void read_inode(struct m_inode * inode);

static void write_inode(struct m_inode * inode);

 

/* 等待指定的i 节点可用 */

static inline void wait_on_inode(struct m_inode * inode)

{

cli();

while (inode->i_lock) // // 如果i 节点已被锁定

sleep_on(&inode->i_wait); // 不可中断的等待状态

sti();

}

 

/* 对指定的i 节点上锁 */

static inline void lock_inode(struct m_inode * inode)

{

cli();

while (inode->i_lock)

sleep_on(&inode->i_wait);

inode->i_lock=1; // 置锁定标志

sti();

}

 

/* 对指定的i 节点解锁 */

static inline void unlock_inode(struct m_inode * inode)

{

inode->i_lock=0; // 复位i 节点的锁定标志

wake_up(&inode->i_wait); // 唤醒等待此i 节点的进程

}

 

/* 释放内存中设备dev 的所有i 节点 */

void invalidate_inodes(int dev)

{

int i;

struct m_inode * inode;

 

inode = 0+inode_table;

for(i=0 ; i<NR_INODE ; i++,inode++)

{

wait_on_inode(inode); // 等待该i 节点可用

if (inode->i_dev == dev)

{

if (inode->i_count) // 如果其引用数不为0

printk("inode in use on removed disk/n/r");

inode->i_dev = inode->i_dirt = 0; // 释放该i 节点,只是一个标记

}

}

}

 

/* 同步内存(inode数组)与设备上的所有i 节点信息 */

void sync_inodes(void)

{

int i;

struct m_inode * inode;

 

inode = 0+inode_table; // 第一项

for(i=0 ; i<NR_INODE ; i++,inode++) 

{

wait_on_inode(inode); // 等待该i 节点可用

// 如果该i 节点已修改且不是管道节点

if (inode->i_dirt && !inode->i_pipe)

write_inode(inode); // 写盘

}

}

 

/* 文件数据块映射到盘块的处理操作,可能需要建立新的逻辑块 */

static int _bmap(struct m_inode * inode,int block,int create)

{

// inode 文件的i 节点;block (相对于文件而言)文件中的数据块号;create 创建标志

// block是相对于文件而言,但是i_zone[block]则是相对于设备而言的。相对于文件的

// block可能不止i_zone数组大小,所以如果block的值大于7时,需要使用间接来寻址。

// 如下的映射 :

//    |-----------|          |------------------------------|

//    |file block |   --->   |         disk block           |

//    |-----------|          |------------------------------|

// 如果create = 1,需要建立新的逻辑块,

 

struct buffer_head * bh;

int i;

 

if (block<0) // 块号小于0 ?

panic("_bmap: block<0");

if (block >= 7+512+512*512) // 超出文件系统表示范围

panic("_bmap: block>bi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些命令的功能分别是: - sh demo.sh:运行名为 demo.sh 的脚本文件。 - ls -ilr ./tstdir:列出目录 tstdir 中的所有文件和子目录,并显示它们的 inode 号、权限、所有者、大小、日期和名称等信息,以逆序排列。 - find ./tstdir -maxdepth 2 -name "*.txt":在目录 tstdir 中查找所有深度为 2 的子目录和文件,匹配名字为 *.txt 的文件,并列出它们的路径。 - find ./tstdir -links 2:在目录 tstdir 中查找所有硬链接数为 2 的文件或目录,并列出它们的路径。 - find ./tstdir -gid $UID:在目录 tstdir 中查找所有属于当前用户组的文件或目录,并列出它们的路径。 - find ./tstdir -type l:在目录 tstdir 中查找所有符号链接文件,并列出它们的路径。 - find ./tstdir -size 1k:在目录 tstdir 中查找所有大小为 1KB 的文件,并列出它们的路径。 - find ./tstdir -name "t*" -perm -644:在目录 tstdir 中查找所有文件名以 t 开头且权限为 644 的文件,并列出它们的路径。 - find ./tstdir -type f -o -type l:在目录 tstdir 中查找所有普通文件和符号链接文件,并列出它们的路径。 - find ./tstdir -type f -o -type l -exec ls -l {} \;:在目录 tstdir 中查找所有普通文件和符号链接文件,并执行 ls -l 命令以列出它们的详细信息。 - find ./tstdir ! -name "*.txt":在目录 tstdir 中查找所有不以 .txt 结尾的文件或目录,并列出它们的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值