操作系统文件使用磁盘的实现---20
2023-09-14 09:13:34 时间
操作系统文件使用磁盘的实现---20
再一次使用磁盘,通过文件使用
当调用了sys_write系统调用进行磁盘写数据的时候,需要传入文件描述符号,内存缓冲区指针和读取字节个数。
首先根据当前进程关联的flip (file pointer)表和fd下标查找到对应的file指针,然后根据file对象拿到当前文件对应的inode文件索引节点。
最终调用file_write方法完成磁盘写操作,这里需要传入的参数不多介绍了,但是有小伙伴会有疑问,读写文件的位置不需要传入吗?
其实读写文件的位置信息已经保存在了file对象中。
file_write的工作过程应该就是…
如果我们要删除test.c文件200-212这段地址范围内的数据,那么首先需要根据file指针中fseek读写指针的位置确定要操作数据的相较于当前文件的起始偏移地址,然后根据count,确定操作数据的范围。
有了操作数据的起始偏移地址,就可以根据inode中保存的当前文件对应的盘块号索引,计算出当前要操作的数据位于哪一个盘块中。
然后由盘块号和buf等信息形成request请求,加入电梯队列中。
file_write的实现
- 首先计算是对文件进行追加操作,还是读写当前文件读写指针所处的位置。
- 通过pos计算出,当前要操作的数据位置对应的盘块号
- 构造request请求,然后加入电梯队列,当前进程进入阻塞态
- 当前要操作的数据可能跨域了多个盘块号,那么当上一次的磁盘读写请求完成后,进程被唤醒,然后接着去读取下一个盘块,直到所有盘块全部读取完毕
create_block算盘块,文件抽象的核心
while(i<count){
//计算盘块号的核心方法
block=create_block(inode, pos/BLOCK_SIZE);
bh=bread(inode->i_dev, block);
_bmap函数是计算盘块号的核心:
//这里参数block传入的是逻辑数据库、块
int _bmap(m_inode *inode, int block, int create){
//(0-6):直接数据块
if(block<7){
if(create&&!inode->i_zone[block]){
inode->i_zone[block]=new_block(inode->i_dev);
inode->i_ctime=CURRENT_TIME; inode->i_dirt=1;
}
return inode->i_zone[block];
}
block-=7;
//(7):一重间接
if(block<512){
bh=bread(inode->i_dev,inode->i_zone[7]);
return (bh->b_data)[block];
}
...
struct d_inode{ unsigned short i_mode;...
unsigned short i_zone[9];
//(0-6):直接数据块,(7):一重间接,(8):二重间接 }
m_inode,设备文件的inode
不光一个普通有数据的文件叫做文件,一个设备文件也叫做文件。
如果是设备文件的话,不需要用inode完成映射关系,如果是普通文件的话,需要通过inode中存放的映射表,查找到当前读写文件的字符流位置到盘块号的映射。
如果当前inode代表一个设备文件,那么inode中保存的应该是主设备号和次设备号。
如果是普通文件,那么inode中的i_zone数组中存放的应该是映射表信息,但是如果是设备文件的话,i_zone中存放的就是对应的主设备号和从设备号了。
伟大的文件视图…
相关文章
- linux中如何给文件重命名_ppt重命名怎么恢复
- uni-app实现manifest.json等文件动态配置化
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
- SQLServer 错误 5515 无法打开 FILESTREAM 文件的容器目录“%.*ls”。 操作系统返回 Windows 状态代码 0x%x。 故障 处理 修复 支持远程
- SQLServer 错误 17204 %ls:无法打开文件号 %d 的文件 %ls。 操作系统错误: %ls。 故障 处理 修复 支持远程
- 修改时间Linux文件系统:最后修改时间研究(linux文件最后)
- 文件利用 Linux 操作系统快速创建纯文本文件(linux创建txt)
- 夹利用Linux命令行创建目录(linux目录下创建文件)
- 操作Linux文件路径操作实践指南(linux下文件路径)
- Linux下文件上传的命令指南(linux文件上传命令)
- files给 Linux 操作系统删除文件的方法(linuxdelete)
- 删除Linux操作系统中的日志文件(linux日志删除)
- 命令使用Linux zmore命令进行文件查看(linuxzmore)
- 利用.htaccess文件构成的PHP后门
- 如何将文件传输至Linux操作系统(将文件传到linux)
- Linux操作系统的隐藏文件复制技巧(拷贝隐藏文件linux)
- 注意:由于mongodb.dll是Windows操作系统中MongoDB数据库驱动程序文件的扩展名,因此建议您提供更为详细或具体的信息或上下文,以帮助我们更准确地为您提供标题。以下是针对不同情境的几个标题建议: 如何修复无法加载mongodb.dll文件的问题 遇到mongodb.dll缺失怎么办?快速恢复驱动程序 介绍Windows上使用mongodb.dll实现MongoDB数据库连接的方法 mongodb.dll文件及其在MongoDB应用程序中的作用(mongodb.dll)
- 轻松实现:本地文件传输至 Linux 操作系统(本地文件传到linux)
- Linux操作系统教程:简单学习run文件的运行方法(linux下run文件)
- Linux操作系统:将屏幕输出保存到文件中(linux屏幕输出到文件)
- MYSQL导入文件遭遇失败!(mysql导入文件失败)
- 一步到位使用Oracle轻松完成CSV文件倒入(oracle csv倒入)
- 收缩数据库日志文件的方法(仅适用于mssql2005)
- asp.net后台动态添加JS文件和css文件的引用实现方法