题目描述:

编写一个函数实现Linux文件寻址的算法,即读取文件当前位置到物理存储位置的转换函数,需要给出运行的测试数据,可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块号logblkNum所对应的物理块的块号。

#include<stdio.h>
#include<stdlib.h>
#include<time.h> #define index (12) //直接索引块数目
#define first_index (1 << 7) // 一级索引块数目
#define second_index (1 << 14)
#define third_index (1 << 21)
#define blksize 512 //物理块大小
#define blknumsize 4 //索引块大小
#define index_blk_sum (15 + first_index + second_index + third_index) //索引块总数 struct inode
{
unsigned long i_block[15];
}inode; FILE *fp;
int bitmap[index_blk_sum] = {0}; int find_bitmap(int curpos)
{
int j, k;
for(j = k = curpos; bitmap[j] == 1 && bitmap[k] == 1 && k >= 0 && j < index_blk_sum; ++j, --k);
if(j < index_blk_sum && bitmap[j] == 0)
return j;
else if(k >= 0 && bitmap[k] == 0)
return k;
} void print(int buf[])
{
for(int i = 0; i < first_index; ++i)
printf("%d ", buf[i]);
printf("\n");
} void dirty(int pos)
{
bitmap[pos] = 1;
} void init_inode()
{
for(int i = 0; i < 15; ++i)
{
int tmp = rand() % index_blk_sum;
if(bitmap[tmp] == 1)
{
int j = find_bitmap(tmp);
inode.i_block[i] = j;
dirty(j);
}
else
{
inode.i_block[i] = tmp;
dirty(tmp);
}
}
} void init_filesys()
{
long long bufsize = index_blk_sum * blksize;
char *buf = malloc(sizeof(char) * bufsize);
fwrite(buf, sizeof(buf), 1, fp);
free(buf);
} void do_random(int buf[], int n)
{
for(int i = 0; i < n; ++i)
{
int tmp = rand() % index_blk_sum;
if(bitmap[tmp] == 1)
{
int j = find_bitmap(tmp);
buf[i] = j;
dirty(j);
}
else
{
buf[i] = tmp;
dirty(tmp);
}
}
} void put_inode()
{
fseek(fp, 0, SEEK_SET);
fwrite(&inode, sizeof(inode), 1, fp);
} void put_direct_index(unsigned long offset)
{
int buf[first_index] = {0};
do_random(buf, first_index);
fseek(fp, offset, SEEK_SET);
fwrite(buf, sizeof(int), first_index, fp);
} void put_first_index()
{
unsigned int buf_1[first_index];
put_direct_index(inode.i_block[13] * blksize);
fseek(fp, inode.i_block[13] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp); for(int i = 0; i < first_index; ++i)
put_direct_index(buf_1[i] * blksize);
} void put_second_index()
{
unsigned int buf_1[first_index] = {0};
unsigned int buf_2[first_index] = {0}; put_direct_index(inode.i_block[14] * blksize);
fseek(fp, inode.i_block[14] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp); for(int i = 0; i < first_index; ++i)
{
put_direct_index(buf_1[i] * blksize);
fseek(fp, buf_1[i] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
for(int j = 0; j < first_index; ++j)
{
put_direct_index(buf_2[j] * blksize);
}
}
} unsigned long ltop(unsigned long l_addr)
{
unsigned int buf_1[first_index] = {0};
unsigned int buf_2[first_index] = {0};
unsigned int buf_3[first_index] = {0}; if(l_addr < 0 || l_addr > index_blk_sum - 1)
return index_blk_sum;
else
{
if(l_addr < index)
{
return inode.i_block[l_addr];
}
else if(l_addr < (index + first_index))
{
fseek(fp, inode.i_block[12] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
return buf_1[l_addr - index];
}
else if(l_addr < (index + first_index + second_index))
{
fseek(fp, inode.i_block[13] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
fseek(fp, buf_1[(l_addr - (index + first_index)) / first_index] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
return buf_2[(l_addr - (index + first_index)) % first_index];
}
else if(l_addr < (index_blk_sum))
{
fseek(fp, inode.i_block[14] * blksize, SEEK_SET);
fread(buf_1, sizeof(int), first_index, fp);
fseek(fp, buf_1[(l_addr - (index + first_index + second_index)) / second_index] * blksize, SEEK_SET);
fread(buf_2, sizeof(int), first_index, fp);
fseek(fp, buf_2[(l_addr - (index + first_index + second_index)) % second_index / first_index] * blksize, SEEK_SET);
fread(buf_3, sizeof(int), first_index, fp);
return buf_3[(l_addr - (index + first_index + second_index)) % second_index % first_index];
}
}
} int main()
{
srand((unsigned)time(NULL));
unsigned long l_addr; fp = fopen("ext2", "w+");
if(fp == NULL)
{
printf("create filesys error!\n");
exit(0);
} init_inode();
init_filesys(); put_inode();
put_direct_index(inode.i_block[12] * blksize);
put_first_index();
put_second_index(); while(scanf("%ld", &l_addr) != EOF)
{
unsigned long p_addr = ltop(l_addr);
if(p_addr < index_blk_sum)
printf("logical blknum %ld to physical blknum %ld\n", l_addr, p_addr);
else
printf("out of memory\n");
}
fclose(fp);
return 0;
}

Linux文件寻址算法:逻辑地址到物理地址的转换的更多相关文章

  1. Linux从逻辑地址到物理地址

    转自:http://blog.chinaunix.net/uid-24774106-id-3427836.html 我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C ...

  2. Linux文件系统性能优化 (转)

    http://blog.chinaunix.net/uid-7530389-id-2050116.html 由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍 ...

  3. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

  4. Linux内存寻址之分段机制

    前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...

  5. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  6. Linux文件系统性能优化

    本文绝大部分是转载自CSDN刘爱贵专栏: http://blog.csdn.net/liuben/archive/2010/04/13/5482167.aspx另外根据参考文档增补了一部分内容. 由于 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux 文件压缩与归档

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  9. linux 文件系统结构及命令

    1.linux 文件系统结构 / 根目录 root |--mnt/ | |--sdcard/  挂载点 | |--usb0 | |--cdrom |--home | |--soft01 <- 用 ...

随机推荐

  1. html的第一个程序

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. UESTC - 618

    #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; const int N = 1e6; typed ...

  3. C# DictionaryHelper

    1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System ...

  4. linux中安装软件,查看、卸载已安装软件方法

    各种主流Linux发行版都采用了某种形式的包管理系统(PMS)来控制软件和库的安装. 软件包存储在服务器上,可以利用本地Linux系统上的PMS工具通过互联网访问.这些服务器称为仓库. 由于Linux ...

  5. js判断触摸方向

    $("body").on("touchstart", function(e) { e.preventDefault(); startX = e.original ...

  6. log4j的AppenderLayout格式符

    %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL. %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd ...

  7. IDEA 中,编译后不拷贝 mybatis 配置的 mapper 的 xml 文件

    在maven项目的pom.xml配置文件里添加 <build> <resources> <resource> <directory>src/main/j ...

  8. Nginx+Keepalived配置

    1. Nginx安装 (1) 环境:分别在2台服务器上部署nginx且步骤一致: 如192.138.86.1和192.138.86.2 (2) 下载官网最新稳定版,地址:https://nginx.o ...

  9. bnu 28890 &zoj 3689——Digging——————【要求物品次序的01背包】

    Digging Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID: 36 ...

  10. flutter Failed to setup Skia Gr context导致白屏

    添加 --enable-software-rendering参数运行 G:\soft\flutter\project\hello_world> flutter run --enable-soft ...