题目描述:

编写一个函数实现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. 【DP】【构造】NOIp模拟题 演讲 题解

        极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...

  2. 109th LeetCode Weekly Contest Number of Recent Calls

    Write a class RecentCounter to count recent requests. It has only one method: ping(int t), where t r ...

  3. naginx安装入门

    一.nginx是什么 nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件.它是一个俄罗斯人lgor sysoev开发的,作者将源代码开源出来供全球使用. nginx比它大哥apach ...

  4. 【中间件】IIS短文件名枚举漏洞

    1.1.1  漏洞描述 为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3 短文件名. 在Windows下查看对应的短文件名,可以使用命令 ...

  5. 基于memcache的缓存机制的6个指令

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  6. 转-------基于R-CNN的物体检测

    基于R-CNN的物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187029 作者:hjimce 一.相关理论 本篇博文主要讲解2014 ...

  7. elasticsearch 2.4.0执行update的时候发现的一个问题

    请关注inline参数的变化 正确: POST /test/type1/1/_update{ "script" : { "inline": "ctx. ...

  8. java中HashMap的keySet()和values()

    我们通常说,keySet()返回所有的键,values()返回所有的值,其实是不太对的,因为无论是keySet()和values(),其实都没有实质的内容,且容我慢慢说来. 他们前者返回了一个Set, ...

  9. js中函数带不带var的本质区别是什么

    本质区别是:带var的是定义,属于statement:不带var的是赋值,属于expression.不带var时,解释器认为变量已经定义过了,会在函数中找相应的定义,如果找不到,就会认为变量是在外一层 ...

  10. Javascript 简单实现鼠标拖动DIV

    http://zhangbo-peipei-163-com.iteye.com/blog/1740078 比较精简的Javascript拖动效果函数代码 http://www.jb51.net/art ...