城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

fat文件系统查找删除创建目录

2月6日 程染筱投稿
  Fat文件系统查找过程
  查找一个文件是通过文件名查找的,对于fat文件系统,可以直接从vfatlookup函数看
  主体流程如下:vfatlookupvfatfindfatsearchlongwhile(1)fatgetentry(inode,cpos,bh,de)fatnamematch(sbi,name,namelen,bufname,len)fatbuildinodeinodenewinode(sb);inodeiinoiunique(sb,MSDOSROOTINO);fatfillinode(inode,de)
  vfatlookup调了fatsearchlong查找文件,其中qnamename就是文件名,比如说我们打开file。txt,就会先查找文件,这里传入的参数qnamename就是文件名,打印出来就是file。txt。staticintvfatfind(structinodedir,conststructqstrqname,structfatslotinfosinfo){unsignedintlenvfatstriptaillen(qname);if(len0)returnENOENT;returnfatsearchlong(dir,qnamename,len,sinfo);}
  fatsearchlong里面有个死循环,里面先调用fatgetentry(inode,cpos,bh,de)获取目录项,也就是de变量,msdosdirentry这个结构体,这个就是fdt表,也是fat文件系统的目录项。
  先判断文件名是否等于DELETEDFLAG,就是0xe5,如果是,代码这个是删除文件,直接continue获取下一个目录项继续解析。一般短文件名,通过fatnamematch(sbi,name,namelen,bufname,len)函数,匹配,匹配上的话,说明找到该文件,直接跳转到found,intfatsearchlong(structinodeinode,constunsignedcharname,intnamelen,structfatslotinfosinfo){structmsdossbinfosbiMSDOSSB(sb);structbufferheadbhNULL;wchartunicodeNULL;unsignedcharbufname〔FATMAXSHORTSIZE〕;lofftcpos0;interr,errENOENT;while(1){if(fatgetentry(inode,cpos,bh,de)1)parserecord:nrslots0;if(dename〔0〕DELETEDFLAG)if(deattr!ATTREXT(deattrATTRVOLUME))if(deattr!ATTREXTISFREE(dename))if(deattrATTREXT){intstatusfatparselong(inode,cpos,bh,de,unicode,nrslots);if(status0){}elseif(statusPARSEINVALID)elseif(statusPARSENOTLONGNAME)elseif(statusPARSEEOF)}Neverprepend。tohiddenfileshere。Thatisdoneonlyformsdosmounts(andonlywhendotsOKyes);ifweareexecutinghere,itisinthecontextofavfatmount。lenfatparseshort(sb,de,bufname,0);if(len0)Compareshortnameif(fatnamematch(sbi,name,namelen,bufname,len))if(nrslots){voidlongnameunicodeFATMAXUNICHARS;intsizePATHMAXFATMAXUNISIZE;Comparelongnamelenfatunitox8(sb,unicode,longname,size);if(fatnamematch(sbi,name,namelen,longname,len))}}found:includethedesinfoslotoffcposnrslotssizeof(de);sinfoiposfatmakeipos(sb,sinfobh,sinfode);err0;endofdir:if(unicode)putname(unicode);}
  找到文件后,会调用fatbuildinode建立索引节点信息,因为索引节点不是一直存在的,在我们嵌入式场景中,内存通常比较小,内存回收的时候会释放掉之前建立过的索引节点,所以这里大部分情况下都是走newinode(sb)分配新的inode,然后调iunique(sb,MSDOSROOTINO)查找一个没使用过的编号填充到inodeiino,通过都是从1开始往后分配,inodeiino就像是身份证一样的信息,区别每个inode,这个我们调试一些文件系统问题的时候通常会用到它。structinodefatbuildinode(structsuperblocksb,structmsdosdirentryde,lofftipos){fatlockbuildinode(MSDOSSB(sb));inodefatiget(sb,ipos);if(inode)inodenewinode(sb);if(!inode){inodeERRPTR(ENOMEM);}inodeiinoiunique(sb,MSDOSROOTINO);inodeiversion1;errfatfillinode(inode,de);if(err){iput(inode);inodeERRPTR(err);}fatattach(inode,ipos);insertinodehash(inode);out:fatunlockbuildinode(MSDOSSB(sb));}
  然后调用fatfillinode填充inode信息,可以看到第一个判断,如果这个目录项是目录,这里填充的一些信息,如:
  MSDOSI(inode)istartfatgetstart(sbi,de);就是获取簇号
  MSDOSI(inode)ilogstartMSDOSI(inode)
  其实就是簇号,可以参考创建目录时的处理,参考函数fatallocnewdir的实现。
  setnlink的作用是设置inlink,它代表的是该目录的子目录数量,fatsubdirs就是计算子目录数量,一个目录至少有2个子目录,当前目录和上级目录。我的代码是4。14版本的,这里还加了个判断fatvalidatedir判断该目录是否为有效目录,据我所知,内核4。4版本是没有该函数判断的,这会导致一些问题不能及时发现。intfatfillinode(structinodeinode,structmsdosdirentryde){structmsdossbinfosbiMSDOSSB(inodeisb);MSDOSI(inode)ipos0;inodeiuidsbioptions。inodeigidsbioptions。inodeigenerationgetseconds();if((deattrATTRDIR)!ISFREE(dename)){inodeigeneration1;inodeimodefatmakemode(sbi,deattr,SIRWXUGO);MSDOSI(inode)istartfatgetstart(sbi,de);MSDOSI(inode)ilogstartMSDOSI(inode)errorfatcalcdirsize(inode);if(error0)MSDOSI(inode)setnlink(inode,fatsubdirs(inode));errorfatvalidatedir(inode);if(error0)}else{notadirectoryinodeigeneration1;inodeimodefatmakemode(sbi,deattr,((sbioptions。showexec!isexec(dename8))?SIRUGOSIWUGO:SIRWXUGO));MSDOSI(inode)istartfatgetstart(sbi,de);MSDOSI(inode)ilogstartMSDOSI(inode)inodeisizele32tocpu(desize);MSDOSI(inode)}if(deattrATTRSYS){if(sbioptions。sysimmutable)inodeiflagsSIMMUTABLE;}fatsaveattrs(inode,deattr);inodeiblocks((inodeisize(sbiclustersize1))((lofft)sbiclustersize1))9;fattimefat2unix(sbi,inodeimtime,detime,dedate,0);if(sbioptions。isvfat){fattimefat2unix(sbi,inodeictime,dectime,decdate,dectimecs);fattimefat2unix(sbi,inodeiatime,0,deadate,0);}return0;}
  关于fat文件系统查找就介绍这几个函数,主要是要理解几个关键的结构体、inode,目录项这几个重要的东西在查找中的作用。fat文件系统删除
  对于文件系统删除,有2个系统调用,入口函数一个是dounlinkat,一个是dormdir,它们大体流程一致,这里主要有2件事,一个是释放目录项,给fdt表文件名首字节设置成0xe5,那么查找的时候先判断dename〔0〕如果是DELETEDFLAG就跳过了,不记得可以往上看回查找过程,一个是释放簇(在fat表写为0),数据区不变。dounlinkatvfsunlinkdiriopunlinkvfatunlinkvfatfindfatremoveentrieswhile(nrslotsde(structmsdosdirentry)bhbdata){dename〔0〕DELETEDFLAG;删除标志0xe5}dputdentrykilldentrykilliputiputfinalevictopevictinodefatevictinode这里进入到fat文件系统层,往下就是释放簇fat文件系统创建目录
  fatallocnewdir就是创建目录的函数,可以看到,创建的时候先在fat表找到一个未使用的簇号,分配出来,然后fatclustoblknr函数通过该簇号计算出扇区编号,然后用sbgetblk对应的扇区读到内存上,紧接着就是填充fdt表,de〔0〕就是当前目录,de〔1〕就是上级目录,还有就是填充一些其他信息,如修改时间,簇号等,fatzeroedcluster就是把该簇其他扇区数据清0。memcpy(de〔0〕。name,MSDOSDOT,MSDOSNAME);memcpy(de〔1〕。name,MSDOSDOTDOT,MSDOSNAME);intfatallocnewdir(structinodedir,structtimespects){structmsdossbinfosbiMSDOSSB(sb);structbufferheadbhs〔MAXBUFPERPAGE〕;le16date,u8interr,errfatallocclusters(dir,cluster,1);if(err)blknrfatclustoblknr(sbi,cluster);bhs〔0〕sbgetblk(sb,blknr);if(!bhs〔0〕){errENOMEM;}fattimeunix2fat(sbi,ts,time,date,timecs);de(structmsdosdirentry)bhs〔0〕fillingthenewdirectoryslots(。and。。entries)memcpy(de〔0〕。name,MSDOSDOT,MSDOSNAME);memcpy(de〔1〕。name,MSDOSDOTDOT,MSDOSNAME);deattrde〔1〕。attrATTRDIR;de〔0〕。lcasede〔1〕。lcase0;de〔0〕。timede〔1〕。de〔0〕。datede〔1〕。if(sbioptions。isvfat){extratimestampsde〔0〕。ctimede〔1〕。de〔0〕。ctimecsde〔1〕。de〔0〕。adatede〔0〕。cdatede〔1〕。adatede〔1〕。}else{de〔0〕。ctimede〔1〕。ctime0;de〔0〕。ctimecsde〔1〕。ctimecs0;de〔0〕。adatede〔0〕。cdatede〔1〕。adatede〔1〕。cdate0;}fatsetstart(de〔0〕,cluster);fatsetstart(de〔1〕,MSDOSI(dir)ilogstart);de〔0〕。sizede〔1〕。size0;memset(de2,0,sbsblocksize2sizeof(de));setbufferuptodate(bhs〔0〕);markbufferdirtyinode(bhs〔0〕,dir);errfatzeroedcluster(dir,blknr,1,bhs,MAXBUFPERPAGE);if(err)errorfree:fatfreeclusters(dir,cluster);error:}
投诉 评论 转载

老河口市太平街老街访古有人说过,每一座喧嚣的城,或者每一座热闹的镇,都有一条古朴、静谧的老街,它沉淀着当地最原始最自然最真实的风土文化、民风民情,诉说着历史。距今已有百年历史的湖北省老河口市太……一家三口吃鸡蛋中毒住院!早晨来一碗开水冲蛋,是好是坏?每天早晨一睁开眼就开始发愁了,早餐吃什么呢?懒得动脑的人直接从冰箱里拿出几个鸡蛋,放在锅里煮一煮,然后喝上一袋牛奶就OK了。可是,就鸡蛋这么普通的食物,沈阳一家人却在它身上栽了……宝宝突然不爱洗澡,需要注意这三点,解决问题并不难1hr朋友说家里的小宝宝忽然不爱洗澡了,每次一到浴室门口就开始哭。反应特别强烈。原来天气不热的时候还可以给毛巾蘸水给孩子擦一擦,现在天气这么热,每天都要冲几遍澡才可以,可是孩子……石屏樱桃蓝莓酸甜来袭!想尝鲜的赶紧樱桃蓝莓成熟啦四月来临属于石屏的水果自由模式开启樱桃、蓝莓、杨梅、火龙果。。。。。。多种模式任君挑选去年粉丝们抱怨小旅推荐的太晚……尼加拉瓜是个什么样的地方?有9个成都大,拉美主要产金国之一在尼加拉瓜,这里每一个湖泊,每一座火山,它们有专属于自己的传说,有没有听到过太平洋的灯塔?说的就是尼加拉瓜的莫莫通博火山,具体位置就在马那瓜湖北岸。在尼加拉瓜,当地有一个……十种调料!能认出2种算你厉害沙爹酱,用以烹制沙茶牛柳、沙茶鸭脯等佳肴!麻辣鲜露,烹饪、点蘸、腌制,样样皆宜。热菜起锅前加入,可提鲜增香,其他烹饪手法如凉拌、淋汁、腌制、点蘸等使用本品均有极佳的效果,……互联网大厂裁员潮越演越烈,本质是游戏规则已经改变进入BATJ是多少做软件开发人的梦想,985211应届毕业生校招直接40万年薪起,并且互联网大厂offer接到手软。让多少人为之疯狂,让多少职场人为之汗颜。然而!最……夜雨丨唐道伏向存在的瞬间敞开读龙远信诗歌风,继续吹向存在的瞬间敞开读龙远信诗歌《风,继续吹》唐道伏我试着在夜里睡觉,早晨8点起床顺着阳光的方向,行进试着,在摆放整齐的秩序里,制造一点混乱我试……拉波尔塔确认格子交易完成转会费是2000万欧400万欧浮动条直播吧10月10日讯本周日,巴萨俱乐部召开了会员大会,期间巴萨主席拉波尔塔确认格列兹曼已经转会马竞。拉波尔塔说道:他们(马竞)应该支付给我们4000万欧元,球员已经参加了……fat文件系统查找删除创建目录Fat文件系统查找过程查找一个文件是通过文件名查找的,对于fat文件系统,可以直接从vfatlookup函数看主体流程如下:vfatlookupvfatfindfa……今秋不兴风衣卫衣了!大家都在穿的开衫,优雅显瘦还很时髦文:Nicolehi,我是Nicole,准备好一起变美了吗?开衫在春秋季节是最好的灵活穿搭品,不但保暖、百搭,平时穿脱起来也方便。而在开衫里面最得人心的就是针……苹果发布iOS16。1beta5测试版,正式版即将发布今天凌晨,苹果发布了iOS16。1beta5测试版,本次更新与上一个测试版发布仅相隔一周时间,那么这次的更新又有哪些变化呢?下面我们就来一起了解一下。更新后的版本号为:2……
国产手机也有高端机,这四款手机表现堪称完美,还买什么苹果?好的目标助你成功我认为目前最大的经济困境在产能过剩澳大利亚首次发现一块1亿年前的蛇颈龙化石R星自己操刀!GTA三部曲更新补丁全平台配信不要忘掉别人生气时说的话,因为那往往才是真相折叠屏手机比直屏旗舰好用?灵耀折叠屏笔记本更是生产力利器七块镶嵌在燕塞湖大坝上的石头永远不要在朋友面前,随便说这五句话人性的潜规则你被吊打的真相纯电越野注定要凉凉?东风猛士我偏要勉强聚技今年流行一种帽子叫遮额不遮耳,洋气又减龄,三木妈妈都上头
冬日里的母爱作文又一款!诺基亚3。1Plus安卓9Pie升级即将到来我最敬佩的人《青花瓷》教学反思对不起朋友米米的新衣我的妈妈2020最新学生励志经典语录榆林塑胶跑道陪读第二天(演讲)新手怎么选卫生棉条看品牌选规格

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁