• 大小: 16KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: inode.c  注释  

资源简介

linux内核系统下的ROMFS文件系统代码(inode.c)即节点部分的注释

资源截图

代码片段和文件信息

/* 
* linux/fs/inode.c 

* (C) 1991 Linus Torvalds 
*/  
  
#include      // 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。   
#include        // 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。   
  
#include     // 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,   
// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。   
#include    // 内核头文件。含有一些内核常用函数的原形定义。   
#include        // 内存管理头文件。含有页面大小定义和一些页面释放函数原型。   
#include      // 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。   
  
struct m_inode inode_table[NR_INODE] = { {0} };   // 内存中i 节点表(NR_INODE=32 项)。   
  
static void read_inode (struct m_inode *inode);  
static void write_inode (struct m_inode *inode);  
    /* 等待指定的i 节点可用 */
// 如果i节点已被锁定则将当前任务置为不可中断的等待状态。直到该i节点解锁
static inline void wait_on_inode (struct m_inode *inode)  
{  
  cli ();  
  while (inode->i_lock)  // 如果i 节点已被锁定
    sleep_on (&inode->i_wait);  // 不可中断的等待状态 
  sti ();  
}   
//// 对指定的i节点上锁锁定指定的i节点   
// 如果i节点已被锁定则将当前任务置为不可中断的等待状态。直到该i节点解锁然后对其上锁。
    /* 对指定的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节点解锁    
// 复位i节点的锁定标志并明确地唤醒等待此i节点的进程。
    /* 对指定的i 节点解锁 */
static inline void unlock_inode (struct m_inode *inode)  
{  
  inode->i_lock = 0;  // 复位i 节点的锁定标志
  wake_up (&inode->i_wait);  // 唤醒等待此i 节点的进程
}     
//// 释放内存中设备dev的所有i节点。     
// 扫描内存中的i节点表数组如果是指定设备使用的i节点就释放之。
    /* 释放内存中设备dev 的所有i 节点 */
void invalidate_inodes (int dev)  
{  
  int i;  
  struct m_inode *inode;  
  
  inode = 0 + inode_table;    // 让指针首先指向i节点表指针数组首项
  for (i = 0; i < NR_INODE; i++ inode++)  // 扫描i节点表指针数组中的所有i节点
    {                 
      wait_on_inode (inode);     // 等待该i节点可用(解锁) 
      if (inode->i_dev == dev)   // 如果是指定设备的i节点则 
    {           
      if (inode->i_count)       // 如果其引用数不为0则显示出错警告
        printk (“inode in use on removed disk\n\r“);  
      inode->i_dev = inode->i_dirt = 0;   // 释放该i节点(置设备号为0等)
    }  
    }  
}  
    //// 同步所有i节点。     // 同步内存与设备上的所有i节点信息。
    /* 同步内存(inode数组)与设备上的所有i 节点信息 */
void sync_inodes (void)  
{  
  int i;  
  struct m_inode *inode;  
  
  inode = 0 + inode_table;     // 让指针首先指向i节点表指针数组首项
  for (i = 0; i < NR_INODE; i++ inode++)  // 扫描i节点表指针数组
    {              
      wait_on_inode (inode);       // 等待该i节点可用(解锁) 
      if (inode->i_dirt && !inode->i_pipe)  // 如果该i节点已修改且不是管道节点
    write_inode (inode);      // 写盘
    }  
}  
 //// 块映射处理操作。(block位图处理函数bmap - block map)    
// 参数inode - i节点指针block - 数据块号create - 创建标志    
// 如果创建标志置位则在对应逻辑块不存在时就申请新磁盘块    
// 返回block数据块对应在设备上的逻辑块号
   /* 文件数据块映射到盘块的处理操作,可能需要建立新的逻辑块 */
static int _bmap (struct m_inode *inode int block int create)  
{   // inode 文件的i 节点;block (相对于文件而言)文件中的数据块号;create 创建标志 
// block是相对于文件而言,但是i_zone[block]则是相对于设备而言的。相对于文件的 
// block可能不止i_zone数组大小,所以如果block的值大于7时,需要使用间接来寻址。 
// 如

评论

共有 条评论