




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
硬盘存储结构及分区简介硬盘结构简介:很久以前,硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘.也就是硬盘盘片的每一条磁道都具有相同的扇区数.由此人们定义硬盘参数为(CHS)参数,即磁头数(Heads),柱面数(Cylinders),扇区数(Sectors),以及相应的寻址方式。其中:磁头数表示硬盘总共有几个磁头,也就是有几面盘片,最大为255(用8个二进制位存储);柱面数表示硬盘每一面盘片上有几条磁道,最大为1023(用10个二进制位存储);扇区数(Sectors)表示每一条磁道上有几个扇区,最大为63佣6个二进制位存储);每个扇区一般是512个字节,理论上讲这不是必须的,但好象没有取别的值的;所以磁盘最大容量为:255*1023*63*512/1048576=8024GB(1M=1048576Bytes)或硬盘厂商常用的单位:255*1023*63*512/1000000=8414GB(1M=1000000Bytes)在CHS寻址方式中,磁头,柱面,扇区的取值范围分别为0到Heads-1,0到Cylinders-1,1到Sectors(注意是从1开始)在老式硬盘中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费很多磁盘空间(与软盘一样)。为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产硬盘。也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址。为了与使用3D寻址的老软件兼容在硬盘控制器内部安装了一个地址翻译器。由它负责将老式3D参数翻译成新的线性参数。这也是为什么现在硬盘的3D参数可以有多种选择的原因(不同的工作模式,对应不同的3D参数,如LBA,LARGE,NORMAL)。磁盘分区简介:BOOTSECTOR简介BootSector也就是硬盘的第一个扇区,它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分组成°MBR又称作主引导记录占用BootSector的前446个字节(0to0x1BD),存放系统主引导程序(它负责从活动分区中装载并运行系统引导程序).DPT即主分区表占用64个字节(0x1BEto0x1FD),记录了磁盘的基本分区信息,主分区表分为四个分区项,,每项16字节,分别记录了每个主分区的信息(因此最多可以有四个主分区).BootRecordID即引导区标记占用两个字节(0x1FEand0x1FF),对于合法引导区,它等于0xAA55,这是判别引导区是否合法的标志。BOOTSECTOR的具体结构如下图所示:MasterBootRecord主引导记录(446字节)分区信息1(16字节)分区信息2(16字节)分区信息3(16字节)分区信息4(16字节)~55AABOOTSECTOR结构图分区表结构简介分区表由四个分区项构成,每一项长度为16个字节,分区表结构如下图所示分区状态,0二未激活,0x80=激活(注意此项)0分区起始磁头号1分区起始扇区和柱面号,底字节的低6位为扇区号,咼2位为柱面号的第9,10位,咼字节为柱面号的低8位23分区类型,如0x0B-FAT32,0x83-Linux等,0表示此项未用4分区结束磁头号5分区结束扇区和柱面号,低字节的低6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位67在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址)89AB分区大小(总扇区数)注意:在DOS/Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/255/63的硬盘,分区的最小尺寸为255*63*512/1048576=7.844MBCDEF分区表结构图扩展分区简介由于主分区表中只能分四个分区,无法满足需求,因此设计了一种扩展分区格式.基本上说,扩展分区的信息是以链表形式存放的,但也有一些特别的地方.首先,主分区表中要有一个基本扩展分区项,所有扩展分区都隶属于它,也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中.对于DOS/Windows来说,扩展分区的类型为0x05(EXTENDX).除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,后一个扩展分区的数据项记录在前一个扩展分区的分区表中,但两个扩展分区的空间并不重叠.扩展分区类似于一个完整的硬盘,必须进一步分区才能使用.但每个扩展分区中只能存在一个其他分区.此分区在DOS/Windows环境中即为逻辑盘.因此每一个扩展分区的分区表(同样存储在扩展分区的第一个扇区中)中最多只能有两个分区数据项(包括下一个扩展分区的数据项).扩展分区的分区表存放在该分区的第一个扇区中它的结构与硬盘的BOOTSETOR基本相同,只是没有主引导纪录,即该扇区的0-0X1BD的数据是无效的,另外它的分区表只有前面两项是有效的。他的最后两个字节也是合法性检测标志即55AA下面是扩展分区的结构示意图
主扩展券区扩展■区项1:分区表分冈项2i罗姮盘1雷扩展芬冈24 扩展■区项1:分IK项2i罗宜盘勺扩展分冈3< 扩展•分IK项1分■区表紛区一项2燼辑盘3* 扩展分区的结构示意图硬盘分区类型0未使用分区项1DOS12一种Fat表为12位的分区主要用于早期小硬盘和部分软盘2xenix一种linux分区D0S16早期硬盘分区方法,分区表项为16位,最大支持32M分区大小EXTEND扩展分区的一种该分区的起始扇区为前面的第一个EXTENDX分区起始扇区+该分区的相对偏移BIGDOS即FAT16分区分区表为16位,每簇最大为32K,最大分区为2GNTFS分区BFAT32分区分区表为32位CFAT32X分区与FAT32基本相同EBIGDOSX即FAT16分区扩展分区表为16位,每簇最大可以超过32KFEXTENDX扩展分区的一种,起始扇区为该分区的相对偏移或者前面的前面的第一个EXTENDX分区起始扇区+该分区的相对偏移;如何找到一个逻辑分区前面介绍了硬盘的分区结构,下面主要讲解如何找到一个硬盘的逻辑分区首先读取硬盘BOOTSECTOR,读取该硬盘的分区表例如下面是一个15G硬盘的BOOTSECTOR0XO0Q0X0100X82a0^030oxesaOX06D0X0700X0800XB9S盼。0XO0Q0X0100X82a0^030oxesaOX06D0X0700X0800XB9S盼。OX0CD0XODS0X9E0OXQFQ0X1100X1$O0K13B0X149oxi6a0K17&0X180QX19H俯刖OX1BO0K1CAoxweexiro5D07弭1FFC6EID7CF3A4CBBDBE07B104C518L2F4CD188BFfiAC07BUB7QBonB40ECD13E0F2884&18807E帥&374OB0775D280D2QfiB3210073肪时07FB朋8B7E107UC8A0F5帥断05G0丽56C1243F9B醐PEFC朋D2E£42FZE239&6711CBa01U200ZC73F1llF74蚯32EU6A006SBB朋55BU¥1CD3BFtiClHI74616076胭6A7C硼136173BE7468D661F9C3497661677U696F6E?n7h6172296F6164696E6&6E67207379737467?B6F7fl65726174656D09曲阳Q0GO0009抽闻Uti0DBD0000noGODfl0C000809酬网CO越DF曲QUeT呱0目EE量FP3期DORd町BDBFFEFFFFCD2F阳朋M砒肌&1旳曲©0©0宦竝0©眦曲©0吐帥昶创肿脯崗繭00盹lidpartitiont3ble.Errorloddingoperatingsystingoperatingsysten 一个硬盘的BOOTSECTORS数据其中红色部分是主引导纪录(MBR)蓝色和浅绿色是分区表数据一共是4个分区项和显然后两个分区表项是未用的。最后两个字节是合法性标志。对于第一个分区表项可以知道该分区是一个活动分区,分区类型是0X0C(FAT16)分区分区相对扇区起始地址是0x3f(63)分区大小是0X32F8E(208782个扇区大小大概未100M由于这是柱分区该分区的起始扇区号就为0x3f;对于第二个分区表项可以知道该分区的分区类型是0x0F(EXTENDX)分区,起始扇区地址是0X32FCD(208845)分区大小是0X1BC6CD5(29125845)个扇区。读取扇区0X32FCD取出扩展分区得的分区表项0001010D07FEBF0A3F0000003F047D000000810B05FEFF097E047D003F823E000000000000000000000000000000000000000000000000000000000000000000取出第一个分区表项知道该分区是类型是7(NTFS分区)分区大小是0X7D043F分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0X3F=0X3300C取出第二个分区表项知道该分区是类型是5(EXTEND分区)分区大小是0X3E823F分区相对扇区号为0X7D047E可以算出分区的起始扇区是0X32FCD+0X7D047E=0X80344B读取扇区0X80344B取出扩展分区得的分区表项TOC\o"1-5"\h\z0001 810b 0b feff083f 0000000082 3e000000 c10a 05 feffffbd 86bb00 57a7 00010000 0000 00 000000 000000 0000 0000 000000 0000 00 000000 000000 0000 0000 00取出第一个分区表项知道该分区是类型是Ob(Fat32分区)分区大小是0X3e8200分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0x7d047e+0X3F=0X80348a取出第二个分区表项知道该分区是类型是5(EXTEND分区)分区大小是0X100a757分区相对扇区号为0Xbb86bd可以算出分区的起始扇区是0X32FCD+0Xbb86bd=0Xbbe68a读取扇区0Xbbe68a取出扩展分区得的分区表项OOO1c1OaO7feffff3fOOOOOO18a7OOO1OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO取出第一个分区表项知道该分区是类型是7(NTFS分区)分区大小是0X100a718分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0xbbe68a+3f=0Xbeb6c9逻辑分区简介:FAT16FAT32NTFS逻辑分区BOOTSECTOR逻辑分区的BOOTSECTOR的第一个扇区它由以下部分组成1•跳转指令2•硬盘分区类型的文本字符名3•分区参数块4.扩展的分区参数块5.启动指令块6.合法性标志55AA对于不同的分区类型这些块的内容与意义是不同的下面是FATFAT32NTFS各分区的BOOTSECTORD的内容语义的略图0H3Byte跳转指令EB3C903H8Byte硬盘分区类型的文本字符名MSD0S5.00BH25Byte分区参数块0BH2Byte每扇区字节数0DH1Byte每簇扇区数0EH2Byte保留扇区数10H1ByteFAT表份数11H2Byte根目录入口项13H2Byte磁盘大小15H1Byte介质类型16H2ByteFAT表占用扇区18H2Byte每道扇区数
1AH2Byte磁头数1CH2Byte隐藏扇区数:24H26Byte扩展的分区参数块24H1Byte物理磁盘号:25H1Byte当前磁头号26H1Byte0x28或0x2927H4Byte磁盘序列号:2BH11Byte卷衣36H8Byte系统标识符:3EH448启动指令块1FE2Byte合法性标志55AAFAT16分区BOOTSECTOR结构图0H3Byte跳转指令EB58903H8Byte硬盘分区类型的文本MSWIN4.10BH25Byte分区参数块0B2Byte每扇区字节0D1Byte每簇扇区数0E2Byte保留扇区数101ByteFAT表份数112Byte未用151Byte介质类型162Byte未用182Byte每道扇区数1A2Byte磁头数1C2Byte隐藏扇区数204Byte磁盘总扇区24H52Byte扩展的分区参数块244ByteFAT表占用2C1Byte根目录入口401Byte物理磁盘号421Byte0x29434Byte磁盘序列号478Byte系统标识符528Byte系统标识符58422启动指令块1FE2合法性标志55AAFAT32分区BOOTSECTOR结构图0H3Byte跳转指令EB529003H8Byte硬盘分区类型的文本字符名1NTFS0BH25Byte分区参数块0B2Byte每扇区字节数
0D1Byte每簇扇区数0E2Byte保留扇区数1101Byte0114Byte0151Byte介质类型:162Byte0182Byte每道扇区数1A2Byte磁头数1C2Byte隐藏扇区数204Byte0(未用)24H52Byte扩展的分区参数块244Byte0(未用)「288Byte总扇区数308ByteMFT表起始簇1388ByteMFT镜像起始簇404Byte每个记录段簇1444Byte每个索引占簇1488Byte磁盘序列号504Byte校验和54H426Byte启动指令块1FE2Byte合法性标志55AANTFS分区BOOTSECTOR结构图FAT16FAT32逻辑分区组成结构FAT16和FAT32的分区组成结构比较类似其基本如下:BOOTSETCOR
保留扇区 「FAT表1FAT表2
根目录区
磁盘内容FAT16FAT32逻辑盘结构图其中FAT16的根目录区是固定大小的紧跟在FAT表后,而FAT32的根目录区可以是不固定大小的在BOOTSECTOR中提供了根目录区的第一个簇的簇号。每一个目录项占20个字节这些字节的定义如下OxA文件名第一个字节为E5表示该目录项已被删除,为0表示未用,为2E表示是当前目录或者根目录。OxB是文件属性BIT0文档BIT1只读文件BIT2系统文件BIT3隐藏文件BIT4目录BIT5卷标0x10-0X13文件创建日期0x14-0X15文件或目录起始簇号高16位(对FAT16无效为0000)。0x16-0X19文件更改日期0X1A-0X1B文件或目录起始簇号低16位。0X1C-0X1F文件大小(对目录该项为0)整个磁盘空间是按簇划分,在BOOTSECTOR中记录了每个簇的大小参数。FAT表是用来记录整个磁盘空间的使用与分配情况的它的结构是一种链式结构。他每16个字节或者32个字节表示一个簇。例如我们在FAT16分区找到第121簇的使用情况过程如下:假设该分区大小为2G,起始扇区为63,FAT表为255个扇区,根目录有0X100个入口,每簇大小为64个扇区,隐含扇区为1个。该簇在FAT表中的位置为:A=121*2=241;B=A%512;IF(B!=0);B=1;C=63+1+A/512+B;读取扇区C到缓冲区取第A%512/2个字即为该扇区的下一个扇区,如果为0表示该扇区未用,为FFFF表示该扇区为最后一个扇区。其他的表示有下一个扇区。该簇的物理磁盘扇区号是63+1+255*2+0X100*20/512+(121-2)*64读于一个FAT32分区,要找到121簇的使用情况假设该分区大小为4G,起始扇区为200048,FAT表为3997个扇区,每簇大小为8个扇区,根目录起始簇号为2,隐含扇区为32个。该簇在FAT表中的位置为:A=121*4=241;B=A%512;IF(B!=0);B=1;C=20048+32+A/512+B;读取扇区C到缓冲区取第A%512/4个双字即为该扇区的下一个扇区,如果为0表示该扇区未用,为FFFFFFFF表示该扇区为最后一个扇区。其他的表示有下一个扇区。该簇的物理磁盘扇区号是20048+32+3997*2+(121-2)*8经过上面的介绍我们就比较亲楚整个FAT16FAT32分区的寻址方式例如读取文件C:\Windows\SYSTEM.INI首先找到逻辑盘C的起始扇区,然后读出他的根目录区,在根目录区中找到Windows子目录项,找到目录项中该子目录的起始簇,在FAT表中找到以该簇为起始簇的簇链,读出这些簇的所在的扇区内容然后找到文件名为SYTEM.INI的目录项,取得它的起始簇号,读出该簇为起始簇的簇链的所有扇区内容即可。NTFS逻辑分区组成结构NTFS分区的结构比FAT16和FAT32复杂。整个NTFS分区也是和FAT分区一样以簇为基本的的存储结构,但NTFS分区把整个分区的全部扇区都作为簇来划分,而FAT分区的BOOTSECTORFAT表,根目录(FAT32除外),作为另外的部分它的起始簇是在这些扇区之后的。NTFS分区的结构大概如下
BOOTSECTOR记录了MFT表的起始簇号,通过BOOTSECTOR找到MFT的起始扇区,(方法是磁盘起始扇区+簇号*每簇扇区数)。MFT表是由很多个MFT记录构成,每个MFT记录表示一个文件的信息,MFT表将整个文件系统的内容,都当成文件来处理包括它自己本身。MFT表记录将文件的所有信息都当成属性来处理。下面是MFT记录的头结构说明。起始长度意义04MFT记录标志FILE42修复效验偏移62修复数据长度,包含第个子节88LSN102序列号122链接个数(有多少个文件名链接在这个实际文件上)142第个属性的起始于该MFT记录的哪个子节162BIT0表示该记录中有属性值存于记录外,BIT1表示该记录中存有文件目录184该记录的有效字节数(记录头+所有属性长度和)1C4该记录的长度208高2字节主MFT记录的记录号,低2字节0282所有属性加12A6修复数据依赖于记录长度
MFT记录结构示意图MFT的记录由记录头和属性列表组成,每一个属性都有一个结构相同的属性头,属性头分两种,一种是属性内容在MFT表中,一种是属性的内容在磁盘分配的簇中,属性头分两部分对于所有属性第一部分结构是相同的第二部分结构不同:偏移(16进制)长度(16进制)内容的意义04属性类型42属性总长度81属性数据是否存在MFT表中,0表示是,1表示存在磁盘分配的空间91属性名长度A2属性内容相当于属性头起始地址的偏移C2属性值是否压缩,0表示没压缩,1表示压缩E2属性标志(通常为0)属性头的第一部分内容(前16字节)1041属性数据长度142属性数据起始字节(相当于属性头起始地址)162属性在MFT属性中是第几个属性(从0开始)属性内容在MFT表中的属性头第二部分内容1010H属性内容所在簇计算的起始簇202属性数据起始字节(相当于属性头起始地址)222属性内容压缩方法(不太清楚)288为属性数据的分配空间大小
308属性数据的实际大小388初始化数据长度(对于压缩的数据)408压缩前的长度(对于压缩数据)48ven1cnrunlength数据所在簇的位直(具体解释在后面)属性内容不在MFT表中的属性的第二部分内容属性头后紧跟的是属性内容NTFS的标准的属性包括以下几种。10H标准信息属性Standardinformation20H属性列表属性Attributelist30H文件名属性FileName40H卷表版本属性VolumeVersion50H安全性描述属性Securitydescriptor60H卷表名属性Volumename70H卷表信息属性Volumeinformation80H数据内容属性Data90H索引根目录属性IndexRootA0H索引分配表属性IndexAllocationB0H镜像属性BitMapC0H链接属性SymlinkD0HHPFS扩展属性信息属性HPFSextendedattributesinformationE0HHPFS扩展属性HPFSextendedattributes对于NTFS标准属性我并不完全了解下面就我所了解的部分进行介绍偏移(16进制)长度(16进制)内容的意义08文件创建时间88文件内容最后一次修改时间108文件别的属性最后一次修改时间188文件最后一次修改时间204文件存取控制800文件内容是压缩的,400文件是个连接,20文档标志,4系统文件标志,2隐含文件标志,1系统文件标志24C未用通常为0
标准信息属性内容定义偏移(16进制)长度(16进制)内容的意义04属性名42属性长度61属性字符名长度88属性簇号计算起始簇号108包含该属性的MFT记录号388文件存取控制381A长度为BIT6*2属性名的Unicode属性列表属性内容定义偏移(16进制)长度(16进制)内容的意义08该文件的根目录的MFT记录号820文件的时间信息(与基本信息中的相同)288属性分配空间308属性大小388文件属性3820文档标志4系统文件标志,2隐含文件标志,1系统文件标识,3908压缩3B10目录401文件名长度411文件名类型0posix1unicode2dos3bothdosandunicode42Q长度为BIT40*2文件名的Unicode文件名属性内容定义偏移(16进制)长度(16进制)内容的意义04总是30H44总是184索引记录大小C4每个簇可以记录的索引记录个数104总是10144整个属性大小+10H1C21如果有indexallocation属性存在1E2标志位(不知道意义)索引根目录属性定义索引分配表属性该属性分配索引空间以存放目录如果一个属性内容无法在MFT表中放下,MFT表就会申请磁盘空间,存放在申请的空间中,属性列表定义中第48字节开始说明了该属性所在的磁盘簇号。下面是该字段的意义的英文说明以及简单的翻译:Nonresidentattributesarestoredinintervalsofclusterscalledruns.Eachrunisrepresentedbyitsstartingclusteranditslength.Thestartingclusterofaruniscodedasanoffsettothestartingclusterofthepreviousrun.Lengthandstartingclusterarevariablesizefields.Thefirstbyteofarunindicatesthesizeofboth.Thesizeoftheoffsetisstoredinthehighnibble,andthesizeofthelengthinthelownibble.Forcompressedorsparseruns,theoffsetis0,andthesizeoftheoffsetisalso0.Eachcompressionunitstartsatamultipleof16clusters.Ifcompressionispossible,attheVCNofaunitwillbeoneormoredatarunsfollowedbyanemptyrun.Iftherearedatarunsformorethan16clusters,theunitwasnotcompressible.Ifthereisnodatarunatall(onlyalargeemptyrun),theunitconsistsofallzeroes.Example:2120ED52248748222128C8DBFirstrun:20clustersstartingfrom5ED(5EDto60D)2ndrun:748clustersstartingfrom5ED+2248(2835to2F7D)3rdrun:28clustersstartingfrom2835+DBC8(3FDto425)Notethattheoffsetisinterpretedassignedvalue不存储于MFT表中的属性值被存储于分散的簇中称为RUN。每个RUNS由它的起始簇和长度构成。起始簇号和长度存储于变长的域中,一个RUN的第一个字节表明了起始簇号和簇的个数分别占用的字节数,跟着簇的个数数据,接着是起始簇号的数据。入果没有RUN存在着RUN的起始字节为0,RUNS是一个累加和,第二个RUN的起始簇号需要加上第一个RUN的起始簇号,以此类推。NTFS分区的目录结构NTFS分区的目录结构由文件名索引组成,它由索引根目录属性(IndexRoot)索引分配表属性(IndexAllocation)索引根目录属性表明该MFT表记录是一个目录,索引分配表属性给该
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 可控核聚变研究-第1篇-洞察及研究
- 再生资源循环利用-洞察及研究
- 2025届湖南省长郡20校高三下学期考前模拟训练历史试题(含答案)
- 多尺度污染负荷模拟优化-洞察及研究
- 2025春季学期国开电大本科《管理英语4》一平台机考真题及答案(第五套)
- 2025年超星尔雅学习通《劳动通论》章节测试及答案(名校卷)
- 跨境电商智能物流配送网络布局规划
- 公务员心理测试题库及答案
- 2025年信息系统项目管理师考试题及答案
- 2025年心理学考古学专业研究生入学考试试题及答案
- 贷款后管理与客户满意度提升
- 五下音乐测试题及答案
- 考评员考试题及答案
- 中医骨科试题及答案
- 杭州市上城区2025年下半年下半年招考50名专职社区工作者易考易错模拟试题(共500题)试卷后附参考答案
- 2024年湖南省普通高中学业水平合格性考试地理试题(原卷版)
- 2025时政试题及答案(100题)
- 新22J01 工程做法图集
- 服装制衣厂常用缝纫机衣车中英文对照表单针平车NEEDLE
- 中考英语完成对话专项练习
- 省公司企业文化“五统一”宣贯方案.doc
评论
0/150
提交评论