文档库 最新最全的文档下载
当前位置:文档库 › 硬盘主引导扇区MBS结构,代码已注释

硬盘主引导扇区MBS结构,代码已注释

硬盘主引导扇区(MBS)结构,代码已注释

有的网友反映第五部分MBR源代码看不懂,我注释一下

我们经常遇到各种各样的硬盘故障,其中有相当部分是硬盘软故障,如有些朋友在安装Linux 后,发现无法安装Windows等,但很多朋友由于在对硬盘的逻辑结构不是很了解,无法判断合解决该类问题。

为了普及这些知识,增强大家的兴趣和做试验成功后的成就感,本人以提问的形式给大家展现这方面的知识,同时也提醒大家在实做时先用一个多余而且无重要数据的硬盘做试验,免得造成不必要的损失。另外,对于汇编不了解但有一定计算机基础的朋友,建议自己查找资料进一步学习,也可以记下本文中的代码,实做中灵活应用。

问题:我们在安装所有版本的Windows时,一般不管使用Win 9X的Fdisk命令对硬盘进行分区,还是由安装程序进行分区,基本上都只能分一个主分区和一个扩展分区,扩展分区里面又分若干逻辑分区,很少人尝试过分多个主分区或多个扩展分区,今天有空出下面问题,随便做了个试验(Linux下做直接读Linux分区的文件试验导致硬盘Linux彻底被破坏,干脆。。。),结果如下:10G硬盘分为了3个主分区,而且还可以从任何一个主分区启动,也就是说,3个主分区装了3个操作系统。

问题:

(1)在只有基本的DOS情况下是如何做到的?(除了DOS,不允许用其它任何软件)

(2)一块硬盘最多可分为几个主分区和几个扩展分区?

目的:通过讨论,让大家

(1)深刻理解硬盘0面0道1扇区的MBR+DPT+BRI结构;

(2)掌握手动修改MBR和DPT的手段,具备手动备份和还原硬盘0面0道1扇区的能力;(3)了解计算机从硬盘启动的过程,了解编写多重启动程序的基本方法;

(4)为将来学习其它操作系统打下良好的基础。

答案:(由于编辑窗口太小,可能有不少错误,也已修改不少,剩下的请指出)

关键词:

MBS- Master Boot Sector 主引导扇区

MBR-Master Boot Record 主引导记录

DPT-Disk Partition Table 硬盘分区表

BRI-Boot Record ID 引导记录标志

CHS-(Cylinder柱面,也就是磁道编号0-m Head 头,编号0-n Sector 扇区编号1-t)参数。

一、硬盘结构和逻辑编号

(1)硬盘物理结构

传统硬盘由多个双面磁碟组成,每个面都有一个读写磁头,磁头编号从0开始,所谓0面就是指0磁头所对应的面;每个面被划为若干磁道,编号从负数开始,磁道数越小,越靠近磁碟边缘,因为线速度越大,所以读写速度也越快;用户只能使用0道以后的磁道,负磁道为硬盘所带的微处理器使用的一些代码(Fireware)和本硬盘一些重要参数存放的地方;每个

磁道又分为若干扇区(每个磁道扇区数量都一样),扇区的编号从1开始(不是从0开始哟!),每个扇区存放536(这个数记不清楚了,呵呵)多个字节,但共用户使用的只有512个字节,剩下的作为校验(CRC)和其它用途。这就是著名的硬盘寻址CHS(Cylinder柱面,也就是磁道编号0-m Head 头,编号0-n Sector 扇区编号1-t)参数。

对于CHS中参数中

Cylinder柱,也就是磁道,用10个二进制数表示,所以最大为1024

Head 头,用一个字节表示,最大为256个磁头

Sector 扇区,用6为二进制数表示,所以最大为 64-1(不能用0呀)=63

所以使用CHS表示的硬盘最大容量为

1024X256X63X512=8455716864字节=8064M容量,这就是8G容量的由来。

明显看出,外道比内道长,被划分为同样扇区数是非常浪费的。现代磁盘基本上也只有2个左右的磁碟,4个面左右,每个磁道上的扇区数量都不相同,一般使用LBA表示方法来表示每个扇区,所谓LBA指每个扇区都有一个编号,从0开始(负编号不给用户使用),为了与CHS方式兼容,硬盘内部代码使用了一种CHS-LBA映射的方式。

(2)硬盘逻辑编号

当一台计算机挂多个IDE硬盘时,LinuxUnix对硬盘的编号最为科学。它是这样处理的hda—第一个IDE口主硬盘,

hdb—第一个IDE口从硬盘,

hdc—第二个IDE口主硬盘,

hdd—第二个IDE口从硬盘,

但对于BIOS,DOS和Windows,处理方式有点不一样,只要掌握下面原则就可以了

(1)上面4硬盘是连续编号,从小到大,光驱不算

(2)作为启动的硬盘编号最小,为0x80(16进制数)

如第一个IDE口,主挂硬盘,从挂光驱,第二个ide口挂2个硬盘,BIOS设置从第二个主硬盘启动,则它们的编号为:

第二个IDE主硬盘为0x80,第一个IDE主硬盘为0x81,第二个IDE从硬盘为0x82

又如第一个IDE口主空,从挂硬盘,第二个IDE口主挂光驱,从挂硬盘,BIOS设置从第一个从硬盘启动,则它们的编号为:

第一个IDE从硬盘为0x80,第二个IDE从硬盘为0x81

二、硬盘分区规范和制作多重启动程序的方法

所谓对硬盘分区,直观意义上理解,是逻辑上把硬盘分为几个块。本来就象西瓜一样,你爱怎么切就怎么切,如在CHS参数方式下,你完全可以把0面全部扇区当成一个区。为了能保证各个操作系统的一致,所以制定了一个硬盘分区规范,如果你不按这个规范做,硬盘肯定只能被你自己开发的操作系统使用。

这个规范规定:

(1) CHS参数中0面0道1扇区为硬盘分区信息和引导代码扇区(Master Boot Sector MBS),也就是LBA=0的扇区;

(2)分区是按空心圆柱形(蛋卷形状)划分,如图所示

由于0面0道1扇区(MBS)保存启动代码和硬盘分区信息,如果这个扇区物理损坏,这个硬盘也就无法进行分区,导致硬盘无法使用。但是对于现代硬盘,由于它内部使用的是映射机制,完全可以把个好的扇区映射过来,修复硬盘。很多硬盘修复软件可以做到这点,比较有名的是MHDD和PC3000

对于这个重要扇区(512个字节)的规范为:

MBR—Master Boot Record,主引导记录,共446个字节。规范并没有规定代码是什么,很多软件公司都有自己的MBR,如MS的MBR,Linux的Grub或Lilo,DM的等。我们常用的DOS 下的Fdisk mbr其实就是使用MS的MBR覆盖这446个字节,Fdisk程序内部本身包含这段代码,有兴趣可以把Fdisk.EXE改名为Fdisk.Txt,再用记事本打开,可以看到如下信息Invalid partition table.Error loading operating system.Missing operating system。

MS的这段代码的功能是查找引导分区信息或者叫活动分区(在MBR后面),如果没有或为2个以上,则显示以上信息,系统引导失败;否则再按引导分区项读对应引导扇区,判断结尾是否为55AA,是的话把CPU的控制权交给引导扇区对应的代码;否则引导失败。

当然我们也可以编写自己的MBR,做多重启动,这个大家先反汇编MS的MBR,认真研究以后就不难了,呵呵。

对于这个MBR,MS非常霸道,如果你安装了Linux的Grub,你就别想在这个硬盘上安装Windows,这个问题在TPY BBS里面出现过多次(本人也回答过多次,对于一些人动不动就叫别人对硬盘低级格式化的做法有点反感),最快的解决方法是:Fdisk mbr,当然如果你的硬盘东西都不要的话,可以往MBS里面写一堆垃圾,破坏后面要说的BRI,让Windows安装程序认为MBS非法,然后在安装程序里面重新分区就可以了

DPT—Disk Partition Table 硬盘分区表,这是硬盘最重要的信息,这种信息被破坏,也就不知道硬盘是怎么分区的了,不过现在有些软件通过搜索可以找回分区信息,如easyrecovery.

DPT共64个字节,分为4项,每项16个字节对应一个分区。

分区规范规定:一个硬盘可以有多个主分区(Primary Partition),但最多只能有一个扩展分区(Extended Partition),一个扩展分区可以划分为多个逻辑分区,所以一个硬盘最多只能划为4个主分区或者3个主分区+一个扩展分区。

MS真懒,它的OS最多只让我们划一个主分区+一个扩展分区,其它OS没这个问题。

每个分区项的结构如下:

偏移内容大小

00h 0x80表示活动分区,00不活动 1BYTE,由于这个字节为MBR代码所识别,我们完全可以编写自己的MBR,不理会该字节内容,启动时选择所要启动的分区。甚至设置全部的分区为活动分区都可以。无论为怎么样填写,作为从盘,都能被操作系统所识别

01h 分区开始磁头编号(面号) 1BYTE

02h低6位分区开始扇区号 6位二进制数

02h高2位和03h 分区开始的柱面数,也叫道编号 10位二进制数

04h 分区类型 1Byte,标识这个分区的类型,如果我们把这个直接内容修改了,会使得操作系统不能认出这个分区,间接保护了这个分区的资料,当然我们也可以往MBS写一堆垃圾来保护整个硬盘资料,当我们自己要用时,就恢复MBS

05h 分区结束磁头编号 1Byte

06h 分区结束的柱面和扇区,结构同上 2byte

08h 该分区第一扇区到MBS的总扇区数量 4Byte

0Ch 该分区的总扇区数量 4Byte

分区类型:

00h 未知类型或不用

01h 12bit Fat

04h 16bit fat

05h 扩展MS_DOS分区

0Bh Fat32 容量最大2G

0Ch Fat32 ,采用LBA模式,调用int13h扩展中断

0Fh 扩展MS_DOS分区,Fat32 ,采用LBA模式,调用int13h扩展中断

07h NTFS

82h Linux

83h Linux Swap

BRI――Boot Record ID 引导记录标志接在DPT后面的最后2个字节为 55 AA,表示这个扇区是个正常的计算机启动时,BIOS把这个扇区读入内存,发现BRI不是55 AA,则会拒绝启动。

如下面一个MBS内容

0FA20200 33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C 3......P.P....

0FA20210 BF 1B 06 50 57 B9 E5 01-F3 A4 CB BE BE 07 B1 04 ...PW...........

0FA20220 38 2C 7C 09 75 15 83 C6-10 E2 F5 CD 18 8B 14 8B 8,.u...........

0FA20230 EE 83 C6 10 49 74 16 38-2C 74 F6 BE 10 07 4E AC ....It.8,t....N.

0FA20240 3C 00 74 FA BB 07 00 B4-0E CD 10 EB F2 89 46 25 .t...........F%

0FA20250 96 8A 46 04 B4 06 3C 0E-74 11 B4 0B 3C 0C 74 05 ..F....t....t.

0FA20260 3A C4 75 2B 40 C6 46 25-06 75 24 BB AA 55 50 B4 .u+@.F%.u$..UP.

0FA20270 41 CD 13 58 72 16 81 FB-55 AA 75 10 F6 C1 01 74 A..Xr...U.u....t

0FA20280 0B 8A E0 88 56 24 C7 06-A1 06 EB 1E 88 66 04 BF ....V$.......f..

0FA20290 0A 00 B8 01 02 8B DC 33-C9 83 FF 05 7F 03 8B 4E .......3.......N

0FA202A0 25 03 4E 02 CD 13 72 29-BE 46 07 81 3E FE 7D 55 %.N...r).F...}U

0FA202B0 AA 74 5A 83 EF 05 7F DA-85 F6 75 83 BE 27 07 EB .tZ.......u..'..

0FA202C0 8A 98 91 52 99 03 46 08-13 56 0A E8 12 00 5A EB ...R..F..V....Z.

0FA202D0 D5 4F 74 E4 33 C0 CD 13-EB B8 00 00 80 58 30 17 .Ot.3 0

0FA202E0 56 33 F6 56 56 52 50 06-53 51 BE 10 00 56 8B F4 V3.VVRP.SQ...V..

0FA202F0 50 52 B8 00 42 8A 56 24-CD 13 5A 58 8D 64 10 72 PR..B.V$..ZX.d.r

0FA20300 0A 40 75 01 42 80 C7 02-E2 F7 F8 5E C3 EB 74 49 .@u.B......^..tI

0FA20310 6E 76 61 6C 69 64 20 70-61 72 74 69 74 69 6F 6E nvalid partition

0FA20320 20 74 61 62 6C 65 00 45-72 72 6F 72 20 6C 6F 61 table.Error loa

0FA20330 64 69 6E 67 20 6F 70 65-72 61 74 69 6E 67 20 73 ding operating s

0FA20340 79 73 74 65 6D 00 4D 69-73 73 69 6E 67 20 6F 70 ystem.Missing op

0FA20350 65 72 61 74 69 6E 67 20-73 79 73 74 65 6D 00 00 erating system..

0FA20360 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA20370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA20380 00 00 00 8B FC 1E 57 8B-F5 CB 00 00 00 00 00 00 ......W.........

0FA20390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00

以上是MBR

80 01 ................

0FA203C0 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 00 00 00 .....~.....]...

0FA203D0 41 7F 05 FE FF 0F BF E2-5D 00 51 4C 62 00 00 00 A.......].QLb...

0FA203E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00

以上是DPT

55 AA ..............U.

最后这个是BRI了,呵呵

共2个分区,一个主分区(分区类型为0B)+一个扩展分区(分区类型为05)

第一个分区信息

80 01 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 00

80-这是一个活动分区

01-分区起始磁头号为1,也就是0头0道除了MBS使用一个扇区以外其它没有使用,我们可以在那里保存MBS内容(备份呀),也可以放代码,因为446个字节也许不够我们用,呵呵01 00 =0000001 00000000,分区开始扇区数为000001=1,开始磁道数为0000000000=0

0B-- Fat32主分区

FE--分区结束磁头数FE= 254,可以看出在CHS模式下,该硬盘有255个磁头

7F 7E=0111 1111 0111 1110,分区结束扇区数11 1111(b)=63

分区结束磁道数01 0111 1110=382

3F 00-00 00-分区前面的扇区数为0000003F=63,刚好是0道所占的扇区数

80 E2 5D 00-分区的总扇区数为005DE280=6152832, 6152832X512(1024X1024)= 3004.3125M=3G,完全正确!

三、使用BIOS直接对硬盘操作方法

(1) BIOS中断int 13

BIOS已经为我们准备了读写磁盘的代码,这就是Int 13(13h号中断),但很多操作系统在启动完成后都不使用这些代码,而使用扩展的LBA访问模式(驱动程序所带的代码),以突破8G容量的限制和实现DMA访问模式。另外在Winnt以上版本OS,由于MBS是重要的信息区,系统禁止用户对MBS进行读写操作,全部的防病毒软件也对该扇区进行了保护。

所以只有DOS和Win 9X才能使用int 13h访问MBS

调用int 13h的入口参数为

ah=2 读磁盘=3 写磁盘

入口参数:AH=功能号,02为读盘操作;03为写磁盘;AL=一次读取的扇区数

; ESBX=读入内存的起始地址

; CH=10位柱面号的低8位;CL:高两位是10位柱面号的高两位,低6位是扇区号

; DH=磁头号;

DL=驱动器号,00代表第一个软驱;对于硬盘是硬盘编号,0x80为第一个硬盘,也就是系统启动的硬盘

(2) Debug使用方法

在DOS的DEBUG程序里面,我们可以编写简单的汇编程序,如使用A命令则是输入代码,使用U命令是反汇编,具体大家可以查找相应的教材,也可以使用命令得到帮助,如

注在DEBUG里面,所有数据全部为16进制数

CWINDOWSdebug

-(注获取帮助)

assemble A [address]

compare C range address

dump D [range]

enter E address

fill F range list

go G [=address] [addresses]

hex H value1 value2

input I port

load L [address] [drive] [firstsector] [number]

move M range address

name N [pathname] [arglist]

output O port byte

proceed P [=address] [number]

quit Q

register R [register]

search S range list

trace T [=address] [value]

unassemble U [range]

write W [address] [drive] [firstsector] [number]

allocate expanded memory XA [#pages]

deallocate expanded memory XD [handle]

map expanded memory pages XM [Lpage] [Ppage] [handle]

display expanded memory status XS

-a100(注从100开始汇编代码)

0FA20100 mov ax,201(注ah=2,读磁盘,al=1读一个扇区,如果是写一个扇区,就改为mov ax,301)

0FA20103 mov bx,200 (注内容放在200处)

0FA20106 mov cx,1 (注ch=0,cl=1,0面1扇区)

0FA20109 mov dx,80 (注dh=0,0道,dl=80 第一个硬盘,即启动硬盘)

0FA2010C int 13 (注执行磁盘操作代码)

0FA2010E int 20 (注:程序结束)

0FA20110

-

-u100(注反汇编)

0FA20100 B80102 MOV AX,0201

0FA20103 BB0002 MOV BX,0200

0FA20106 B90100 MOV CX,0001

0FA20109 BA8000 MOV DX,0080

0FA2010C CD13 INT 13

0FA2010E CD20 INT 20

0FA20110 0283470D ADD AL,[BP+DI+0D47]

0FA20114 02806F0A ADD AL,[BX+SI+0A6F]

0FA20118 2480 AND AL,80

0FA2011A 47 INC DI

0FA2011B 0A34 OR DH,[SI]

0FA2011D 00910F83 ADD [BX+DI+830F],DL

-g(注运行)

Program terminated normally

-d200 (显示读出来的结果,MBS)

0FA20200 33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C 3......P.P.... 0FA20210 BF 1B 06 50 57 B9 E5 01-F3 A4 CB BE BE 07 B1 04 ...PW........... 0FA20220 38 2C 7C 09 75 15 83 C6-10 E2 F5 CD 18 8B 14 8B 8,.u........... 0FA20230 EE 83 C6 10 49 74 16 38-2C 74 F6 BE 10 07 4E AC ....It.8,t....N. 0FA20240 3C 00 74 FA BB 07 00 B4-0E CD 10 EB F2 89 46 25 .t...........F% 0FA20250 96 8A 46 04 B4 06 3C 0E-74 11 B4 0B 3C 0C 74 05 ..F....t....t. 0FA20260 3A C4 75 2B 40 C6 46 25-06 75 24 BB AA 55 50 B4 .u+@.F%.u$..UP. 0FA20270 41 CD 13 58 72 16 81 FB-55 AA 75 10 F6 C1 01 74 A..Xr...U.u....t -d

0FA20280 0B 8A E0 88 56 24 C7 06-A1 06 EB 1E 88 66 04 BF ....V$.......f.. 0FA20290 0A 00 B8 01 02 8B DC 33-C9 83 FF 05 7F 03 8B 4E .......3.......N 0FA202A0 25 03 4E 02 CD 13 72 29-BE 46 07 81 3E FE 7D 55 %.N...r).F...}U 0FA202B0 AA 74 5A 83 EF 05 7F DA-85 F6 75 83 BE 27 07 EB .tZ.......u..'.. 0FA202C0 8A 98 91 52 99 03 46 08-13 56 0A E8 12 00 5A EB ...R..F..V....Z. 0FA202D0 D5 4F 74 E4 33 C0 CD 13-EB B8 00 00 80 58 30 17 .Ot.3.. 0

0FA202E0 56 33 F6 56 56 52 50 06-53 51 BE 10 00 56 8B F4 V3.VVRP.SQ...V.. 0FA202F0 50 52 B8 00 42 8A 56 24-CD 13 5A 58 8D 64 10 72 PR..B.V$..ZX.d.r -d

0FA20300 0A 40 75 01 42 80 C7 02-E2 F7 F8 5E C3 EB 74 49 .@u.B......^..tI 0FA20310 6E 76 61 6C 69 64 20 70-61 72 74 69 74 69 6F 6E nvalid partition 0FA20320 20 74 61 62 6C 65 00 45-72 72 6F 72 20 6C 6F 61 table.Error loa 0FA20330 64 69 6E 67 20 6F 70 65-72 61 74 69 6E 67 20 73 ding operating s 0FA20340 79 73 74 65 6D 00 4D 69-73 73 69 6E 67 20 6F 70 ystem.Missing op 0FA20350 65 72 61 74 69 6E 67 20-73 79 73 74 65 6D 00 00 erating system.. 0FA20360 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA20370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -d

0FA20380 00 00 00 8B FC 1E 57 8B-F5 CB 00 00 00 00 00 00 ......W.........

0FA20390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01 ................

0FA203C0 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 00 00 00 .....~.....]...

0FA203D0 41 7F 05 FE FF 0F BF E2-5D 00 51 4C 62 00 00 00 A.......].QLb...

0FA203E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

0FA203F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.

若要备份MBS内容,只要在Debug里面读出来后

使用以下命令就可以了

-n E;Boot.bin(放MBS的文件)

-rcx

200 (MBS的长度,16进制的0x200=十进制的512,一个扇区的字节数)

-w200 把200开始的地方按刚才的设置的512长度内容写入所设置的文件里面

若要恢复MBS内容,使用

-n E;Boot.bin(放MBS的文件)

-l 200(读入以上文件内容到200位置)

然后再使用A命令编写与上面类似代码,将内容写入MBS

四、本问题实做方法

通过对以上知识的了解,要达到本问题中将硬盘直接分为多个主分区的目的,其实最直接的方法是自己计算填写DPT+BRI,然后写入硬盘DBS,再用Fdisk mbr将mbr写入DBS。然而,这种计算比较繁琐和容易出错,能否借Fdisk帮助我们自动计算呢?可以!

(1)使用Fdisk先划一个主分区,再划一个扩展分区,无所谓里面建多少个逻辑分区,反正等下这个扩展分区要变为主分区。在划分时要留下空间给后面的主分区;

(2)不要重新启动计算机,使用debug编写程序读出该硬盘的MBS内容,将分区表第二项的分区类型由原来的0X05(扩展分区类型)改为主分区类型0X0B或0X0C,再写回分区表(3)在另外一个DOS窗口里面运行Fdisk,可以看到有2个主分区了,再建立一个扩展分区,退出,不要重新启动

(4)再到(2)中窗口重新读出MBS内容,把MBR第三项分区类型改为主分区,且写回MBS;(5)进入Fdisk,这次看到应该是3个主分区,把剩余空间分为一个扩展分区,建立若干逻辑分区,激活3个主分区中的一个。退出后重新启动计算机

(6)最后对各分区进行格式化,因为第二和第三主分区在使用Fdisk时还建立了逻辑分区,导致格式化也许会出现错误,不用理会,Format会对该2个主分区进行完整的格式化。

五、最后在本人计算机上做了个MBR,让大家看看效果

本人计算机设置了2个主分区,前一个是Windows 98,另外一个是DOS 7.0,为保险期间,将原来的MBS备份到0面0道2扇区

MBR的源代码为:(Nasm编译,不是Masm,呵呵!看不懂?先看效果,再努力学习,回头再看!)

org 0h ;为了编译器准确定位,这里应该为绝对定位,BIOS把MBS内容读入00007c00h section .text

mov ax,7c0h ;段地址设置

mov ds,ax

mov ax,9000h ;目标段地址

mov es,ax

mov cx,200h ;200h个字,即512个字节

sub si,si ;源07c00000即00007c00h

sub di,di ;目的9000h0000

cld ;正向

repz movsw ;复制,把00007c00的512个Byte复制到9000h:0000,即MBS被复制到9000h:0000

jmp 9000hgo ;跳转到9000h的下条语句,因为使用绝对定位,所以go的偏移正确

go mov ds,ax ;ax=es=9000h

mov ss,ax ;设置堆栈段

mov sp,ax

call cls ;清屏幕,设置光标到(0,0)

mov cx,tail-head ;cx=要显示的文字长度

mov bx,0eh ;字符颜色 0eh为黄色

mov bp,head ;字符串的首地址偏移

mov ax,1301h ;int 10h的显示功能

int 10h ;显示

redo

mov ah,1 ;下面3句是清除键盘缓冲区内容

int 16h

jnz redo

sub ah,ah ;读键盘

int 16h ;返回:ah-ascii码,al-扫描码

sub al,31h ;与“1”的扫描码相减

jz next ;按的健确实是1

cmp al,1 ;原来扫描码是1+31=32即按键是“2”?

jz next ;按键是1和“2”,到下一步al=0按了“1”,al=1按键为2

jmp redo ;不是按“1”或“2”

next

sub ah,ah

shl al,4 ;al=al16,因为一个分区表项为16个字节,上面2句得到要启动的分区的分区表项与分区表首地址的相对位移

mov si,ax

mov bp,1beh ;分区表首地址

cmp byte[bp+si],80h ;要启动分区的分区表第一个字节是否为活动分区?(因为DOSWindows还会读分区表,所以必须修改分区表对应这个字节,对Linux则不需要) jz read

mov byte[bp],0 ;

mov byte[bp+16],0 ;前2个先改为非活动分区

mov byte[bp+si],80h ;被启动的改为活动

mov ax,301h

xor bx,bx

mov cx,1

mov dx,80h

int 13h ;写回MBS到硬盘

read

mov dx,[bp+si]

mov cx,[bp+si+2]

xor ax,ax

mov es,ax

mov bx,7c00h

mov ax,201h

int 13h ;以上是读被启动分区的第一个扇区(该分区的引导扇区)到00007c00h

call cls ;清屏幕,设置光标到(0,0)

jmp 07c00h ;远跳转到被启动分区的引导代码

cls

mov ax,3

int 10h ;设置显示模式为3(16色80X25 VGA模式,同时清屏) mov ah,02

sub dx,dx

sub bh,bh

int 10H ;设置光标位置为(0,0)

ret

head db Boot Loader. Made By Liao 2006.02.19,0dh,0ah

db Partition 1Microsoft Windows 98,0dh,0ah

db Partition 2Microsoft DOS 7.0,0dh,0ah

db Choose the Boot Partition Number(1,2)

tail

MBS内容为:

Dcodedebug

-a

0FA50100 mov ax,201

0FA50103 mov bx,200

0FA50106 mov cx,1

0FA50109 mov dx,80

0FA5010C int 13

0FA5010E int 20

0FA50110

-g

Program terminated normally

-d200

0FA50200 B8 C0 07 8E D8 B8 00 09-8E C0 B9 00 02 29 F6 29 .............).) 0FA50210 FF FC F3 A5 EA 19 00 00-09 8C C8 8E D8 8E C0 8E ................ 0FA50220 D0 BC 00 04 E8 70 00 B9-93 00 BB 07 00 BD A8 00 .....p.......... 0FA50230 B8 01 13 CD 10 B4 01 CD-16 75 FA B4 00 CD 16 3C .........u..... 0FA50240 31 75 06 BB BE 01 E9 07-00 3C 32 75 E8 BB CE 01 1u.......2u.... 0FA50250 80 3F 80 75 04 43 E9 22-00 53 BB BE 01 C6 07 00 ..u.C..S...... 0FA50260 BB CE 01 C6 07 00 5B C6-07 80 43 53 B8 01 03 BB ......[...CS.... 0FA50270 00 00 B9 01 00 BA 80 00-CD 13 5B B2 80 8A 37 43 ..........[...7C -d

0FA50280 8B 0F B8 00 00 8E C0 BB-00 7C B8 01 02 CD 13 E8 ............... 0FA50290 05 00 EA 00 7C 00 00 B8-03 00 CD 10 B4 02 BA 00 ............... 0FA502A0 00 B7 00 CD 10 C3 00 00-42 6F 6F 74 20 4C 6F 61 ........Boot Loa 0FA502B0 64 65 72 2E 20 4D 61 64-65 20 42 79 20 4C 69 61 der. Made By Lia 0FA502C0 6F 20 32 30 30 36 2E 30-32 2E 31 39 0D 0A 50 61 o 2006.02.19..Pa 0FA502D0 72 74 69 74 69 6F 6E 20-49 20 3A 4D 69 63 72 6F rtition I Micro 0FA502E0 73 6F 66 74 20 57 69 6E-64 6F 77 73 20 39 38 0D soft Windows 98. 0FA502F0 0A 50 61 72 74 69 74 69-6F 6E 20 49 49 3A 4D 69 .Partition IIMi -d

0FA50300 63 72 6F 73 6F 66 74 20-44 4F 53 20 37 2E 30 0D crosoft DOS 7.0. 0FA50310 0A 43 68 6F 6F 73 65 20-57 68 69 63 68 20 50 61 .Choose Which Pa 0FA50320 72 74 69 74 69 6F 6E 20-59 6F 75 20 57 61 6E 74 rtition You Want 0FA50330 20 42 6F 6F 74 3F 28 31-2C 32 29 00 00 00 00 00 Boot(1,2)..... 0FA50340 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA50350 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA50360 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA50370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -d

0FA50380 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA50390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA503A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA503B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01 ................ 0FA503C0 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 00

第一个主分区

00 00 .....~.....]...

0FA503D0 41 7F 0C FE FF 0F BF E2-5D 00 51 4C 62 00

第二个主分区

00 00 A.......].QLb...

0FA503E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0FA503F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.

再看看效果图,呵呵,本人姓廖

程序代码注释编写规范

程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ COPYRIGHT (C), MicTiVo International. Co., Ltd. FileName: Author:

C语言注释规范

C语言注释规范 1.注释原则 同一软件项目开发中,尽量保持代码注释规范和统一。 注释方便了代码的阅读和维护。 边写代码边注释,修改代码时要相应修改注释,保证注释和代码的一致性。 注释要简洁明确,不要出现形容词。 对于写的好的注释,我们将是第一个受益者。 大型软件开发中,通过别人的注释可以快速知道他人所写函数的功能,返回值,参数的使用。 2.文件头部的注释 示例: / * Program Assignment : 该文件的作用 * Author: 作者 * Date: 2013/8/6 14:34 * Description: 该文件的描述 *****/ /* * Source code in : 源代码的路径 * Function List: * initLinear 初始化线性表 * destoryLinear 释放线性表申请的空间 * isLinearEmpty 判断线性表是否为空 * isLinearFull 判断线性表是否为满 * getLinearElementValue 取得下标为index的元素的值 */ 注意:这个函数列表可以快速查询到我们想要了解的函数。 3.结构体,全局变量等的注释 示例: typedef POLYNOMIAL USER_TYPE; /* 新的数据类型的描述*/ int a; /* 全局变量的作用*/ /* 说明结构体的功能*/ typedef struct LINEAR { USER_TYPE *data; /* 每个成员的意义(作用) */ int maxRoom; /* 每个成员的意义(作用) */

int elementCount; /* 每个成员的意义(作用) */ }LINEAR; 4.函数的注释 在逻辑性较强的的地方加入注释,以便其他人的理解,在一定的程度上排除bug。 示例: /* * Function Name: getLinearElementIndex * Purpose: 取得元素的index值 * Params : * @LINEAR linear 线性表实例 * @USER_TYPE var 类型为USER_TYPE的实例 * @int (*)() cmp 提供接口,让用户定义具体比较函数 * Return: int 返回元素的index值 * Limitation: 如果返回-1,则代表不存在var的元素 */ int getLinearElementIndex(LINEAR linear, USER_TYPE var, int (*cmp)()) { /* * 如果逻辑太过复杂,这里写明该算法的过程和思路。 */ boolean found = FALSE; int i; for(i = 0; i < && !found; i++) if(cmp[i], var) == 0) found = TRUE; if(i >= i = NOT_FOUND; return i; }

硬盘内部如此精彩——硬盘构造再揭秘

硬盘内部如此精彩——硬盘构造再揭秘 组装也是高科技 谈起参观WD泰国硬盘工厂,我们必须要明确的一点是,如果不加特别解释的话,我们通常所说的“硬盘工厂”,指的都是硬盘整机(即“硬盘驱动器”)组装厂。CPU的制造过程中也有封装的步骤,可以把这一步拿出来单独成立封装测试厂,但我们很难把CPU明确地再分解成若干部件,每种部件都有特定的供应商——要真这样的话Intel的CPU工厂只靠做些组装的活儿就能获取高额利润,那钱赚得岂不是太容易? 如果要类比的话,硬盘工厂(即整机组装厂,下同)应该与光驱生产厂更为接近,前者要用到的磁头、盘片及马达与后者要用到的光头、马达等往往都来自于供应商,大家做的都是一个组装的工作。更通俗一些的话,还可以想想PC的生产:CPU来自于Intel或AMD,主板来自于华硕、微星等有名或无名的大厂小厂,内存(条)来自于三星、英飞凌……这是大家最熟悉的组装过程了。当然,这些比喻那些硬盘供应商们听了会生气的,别的不说,就凭现代硬盘的(温彻斯特)工作原理要求内外部空气要相对隔绝这一点,就需要硬盘工厂斥巨资建立并维护Class 100(100级)甚至Class 10(10级)的净室,关键的生产步骤都在里面进行,技术要求和难度都远非PC和光驱的生产所能相比——不然,硬盘厂商也不至 于像现在这样“屈指可数”啊。 在净室中操作的工人们。环境要求:温度20℃±3℃,相对湿度40%~65%,直径大于0.5微米的微粒不超过100个,大于0.3微米的不超过300个。不同的工厂上述条件会有 出入,但都是很严格的。

当然,硬盘整机的制造是“来料加工”的组装过程,并不意味着硬盘厂商不具备部件的研发和生产能力。日立(Hitachi GST,以前的IBM硬盘部门)和希捷(Seagate)都采用所谓的垂直整合模式,即能够包办从磁头、盘片的研发生产直至硬盘整机制造的全过程。就像希捷公司台湾技术行销经理朱秋男先生所说,希捷拥有从部件到硬盘驱动器的全线技术,生产硬盘所用到的主要零部件中只有马达来自于日本厂家(在中国和泰国生产)。当然,这样做的代价也是巨大的,譬如希捷公司从2003年7月至2004年6月的硬盘技术研发投入达到了6.66亿美元,而在此期间其总收入为62.3亿美元,净收入5.29亿美元(若排除2004年4~6月的重组费用,为5.66亿美元)。 相比之下,WD(西部数据)公司采用的(在部件技术上的)跟随策略成本就要低很多,所冒的风险也小。同期WD的总收入为30.47亿美元,净收入1.513亿美元(若排除2003年第三季度收购Read-Rite的费用,为1.993亿美元),而在此期间的研发投入为1.84亿美元。即使考虑到不同的公司在不同时期经营业绩和研发投入会有一定的波动,这种对比 也是颇具参考价值的。 站在不同的角度去解读上述数据会得出不同的结论。笔者认同高投入才能有高产出的观点,希捷公司较高水平的利润率就与其高研发投入有很大的关系。不过,这样无疑会抬高硬盘行业的门槛,特别是对WD、三星等以生产较低利润的台式机硬盘为主的厂商更是如此——如果所有的硬盘厂商都必须采用垂直整合的业务模式,那么硬盘行业的格局就不会是今天这个样子。在这方面我们可以想想PC行业,虽然更有技术含量的IBM最终退出了这个自己一手开创的市场,但如果没有高度的分工合作带来的市场繁荣,今天用得起计算机的人能有这 么多吗? 越扯越远了,就此打住,言归正传。 部件举例之磁头上岗记(上) 强求每家硬盘厂商都走垂直整合之路不现实,但尽可能地掌握一些关键部件的技术却很有必要。特别是在盘片存储密度越来越高、磁头尺寸越来越小,以至一度因遭遇技术瓶颈而被迫放缓单碟容量提升速度的今天,缺乏盘片和磁头技术储备的硬盘厂商将会在新产品的推出上处于不利地位。迈拓(Maxtor)在2001年9月将MMC Technology变成了自己的全资子公司,现在后者已经是它最大的盘片提供者;WD则在2003年7月收购了磁头供应商Read-Rite,现在其位于加州Fremont的晶圆制造厂即得自该交易。垂直整合不是万能的, 但离核心技术太远是很容易无能的。 笔者没有去过Fremont,但有幸参观过日立GST设在深圳的磁头生产工厂。与硬盘工厂一样,磁头厂也不允许随便拍照,好在WD在其为此次访问专门准备的会议室里摆放了磁头生产过程中各个阶段的产品,我们可以一一展示给大家。

华为JAVA编程规范

1 Java 编程规范 1.1 排版 1.1.1 规则 规则1程序块要采用缩进风格编写,缩进的空格数为4个,不允许使用TAB缩进。(1.42+) 说明:缩进使程序更易阅读,使用空格缩进可以适应不同操作系统与不同开发工具。 规则2分界符(如大括号…{?和…}?)应各独占一行,同时与引用它们的语句左对齐。在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序 或者static、,synchronized等语句块中都要采用如上的缩进方式。(1.42+) 示例: if (a>b) { doStart(); } 规则3较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐, 语句可读。(1.42+) 示例: if (logger.isDebugEnabled()) { logger.debug("Session destroyed,call-id" + event.getSession().getCallId()); } 规则4不允许把多个短语句写在一行中,即一行只写一条语句(1.42+) 说明:阅读代码更加清晰 示例:如下例子不符合规范。 Object o = new Object(); Object b = null; 规则5if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while,switch等语句的执行语句无论多少都要加括号{},case 的执行语句中如果定义变量必须加括号{}。 (1.42+) 说明:阅读代码更加清晰,减少错误产生 示例: if (a>b) { doStart(); }

硬盘内部结构图解

硬盘内部结构图解 平时大家在论坛上对硬盘的认识和选购,大都是通过产品的外型、性能指标特征和网站公布的性能评测报告等方面去了解,但是硬盘的内部结构究竟是怎么样的呢,所谓的磁头、盘片、主轴电机又是长什么样子呢,硬盘的读写原理是什么,估计就不是那么多人清楚了。所以我就以一块二手西数硬盘WD200BB为例向大家讲解一下硬盘的内部结构,让硬件初学者们能够对硬盘有一个更深的认识。 在动手之前,先了解一些硬盘的结构理论知识。总得来说,硬盘主要包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份。所有的盘片都固定在一个旋转轴上,这个轴即盘片主轴。而所有盘片之间是绝对平行的,在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离比头发丝的直径还小。所有的磁头连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向动作,而盘片以每分钟数千转到上万转的速度在高速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作。由于硬盘是精密设备,尘埃是其大敌,所以必须完全密封。现在先贴上今日的主角西数WD200BB硬盘的“玉照”,它是容量为20G的7200转的普通3.5寸IDE硬盘,属于比较常见的产品,也是用户最经常接触的。除此之外,硬盘还有许多种类,例如老式的普通IDE硬盘是5.25英寸,高度有半高型和全高型,还有体积小巧玲珑的笔记本电脑,块头巨大的高端SCSI硬盘及非常特殊的微型硬盘。

在硬盘的正面都贴有硬盘的标签,标签上一般都标注着与硬盘相关的信息,例如产品型号、产地、出厂日期、产品序列号等,上图所示的就是WD200BB的产品标签。在硬盘的一端有电源接口插座、主从设置跳线器和数据线接口插座,而硬盘的背面则是控制电路板。从下图中可以清楚地看出各部件的位置。总得来说,硬盘外部结构可以分成如下几个部份:

程序代码编写规范

程序编写规范及约定 (仅供内部使用) 文档作者:_______________ 日期:___/___/___ 开发/测试经理:_______________ 日期:___/___/___ 项目经理:_______________ 日期:___/___/___ 请在这里输入公司名称 版权所有不得复制

目录 程序编写规范及约定 (3) 1编写目的 (3) 2代码编写风格 (3) 2.1单元风格 (3) 2.2语句风格 (3) 3命名规则 (3) 3.1命名约定 (3) 3.1.1标志符 (3) 3.1.2类class (3) 3.1.3枚举类型enum (4) 3.1.4委托delegate (4) 3.1.5常量const (4) 3.1.6接口interface (4) 3.1.7方法function (4) 3.1.8命名空间namespace (4) 3.1.9参数 (4) 3.1.10局部变量 (5) 3.1.11数据成员 (5) 3.1.12自定义异常类 (5) 3.1.13命名缩写 (5) 3.1.14数据库命名 (5) 3.2代码编写命名规范 (6) 3.3界面常用控件命名约定 (6) 3.4文件命名规范 (7) 3.4.1文档文件命名 (7) 3.4.2配置文件命名 (7) 3.4.3程序文件命名 (7)

程序编写规范及约定 1编写目的 为了使编写代码具有可读性、可理解性、可维护性,对程序编写人员代码实行统一风格,使得程序代码能够以名称反映含义、以形式反映结构。此文档可供程序代码编写人员及代码维护人员使用。 2代码编写风格 2.1单元风格 2.2语句风格 3命名规则 3.1命名约定 Pascal和Camel命名约定: 编程的命名方式主要有Pascal和Camel两种(Pascal:每个单词的首字母大写,例如ProductType;Camel:首个单词的首字母小写,其余单词的首字母大写,例如productType) 3.1.1标志符 规则:Pascal、Camel 实例与描述:例子说明 3.1.2类class 规则:Pascal 实例与描述:Application

程序代码注释编写规范

百度文库- 让每个人平等地提升自我 1 程序代码注释编写规范 为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* (C), MicTiVo International. Co., Ltd. 1.File : . History: Date: Author: Modification: 2. .. *************************************************/ 一、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************ (C), MicTiVo International. Co., Ltd. FileName: Author: Version : Date: : / /*receive _process() */ 意:与溢出中断写初值不同}

程序代码注释编写规范

程序代码注释编写规范 XXX份公司

为提高控制程序的阅读性与可理解性,现制定相关代码程序代码注释编写的编写规范。 一般情况下,源程序有效注释量必须在20%以上,注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。 常规注释有以下两种方式。 单行:以"//"符号开始,任何位于该符号之后的本行文字都视为注释。 多行:以"/*"符号开始,以"*/"结束。任何介于这对符号之间的文字都视为注释。 一、说明性文件 说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************* COPYRIGHT (C), MicTiVo International. Co., Ltd. File NAME: // 文件 Author: Version: Date: // 作者、版本及完成日期 DESCRIPTION: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1.... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. .. *************************************************/ 二、源文件头 源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。 /************************************************************

硬盘结构图

硬盘几种结构 硬盘是电脑中存贮数据的重要部件,可是由于它长期被封闭在机箱内部,属于那种“幕后英雄”,所以大部分用户可能对其了解不是很透彻。没有关系,在这里,我们将一起去冒险,对它作一个全面的了解吧。 由于SCSI硬盘平时我们接触较少,因此我们目前所提到的硬盘一般指的是IDE接口的硬盘。这种硬盘多属于温盘(Winchester),由头盘组件(HDA,Head Disk Assembly)与印刷电路板组件(PCBA,Print Circuit Board Assembly)组成。平时我们了解硬盘,多是从产品外观、产品特征及磁盘性能等方面去认识,那么硬盘的内部到底是什么样呢?相信许多用户都不太清楚,毕竟谁都不会去冒冒失失地将硬盘拆开来,所以了解硬盘内部结构的机会实在太少了。那么就随着我一起来看看吧。 1、硬盘外部结构 (1)接口:接口包括电源接口插座和数据接口插座两部分,其中电源插座就是与主机电源相连接,为硬盘正常工作提供电力保证。数据接口插座则是硬盘数据与主板控制芯片之间进行数据传输交换的通道,使用时是用一根数据线将其与主板IDE接口或与其他控制适配器的接口相连接,经常听说的40针、80芯的接口电缆也就是指数据线,数据接口可以分成IDE 接口和SCSI接口两大派系(见图1)。 图1 SCSI接口 (2)控制电路板:大多数的控制电路板都采用贴片式焊接,它包括主轴调速电路、磁头驱动与伺服定位电路、读写电路、高速缓存、控制与接口电路等。在电路板上还有一块ROM芯片,里面固化的程序可以进行硬盘的初始化,执行加电和启动主轴电机,加电初始寻道、定位以及故障检测等。在电路板上还安装有容量不等的高速数据缓存芯片。读写电路的作用就是控制磁头进行读写操作。磁头驱动电路直接控制寻道电机,使磁头定位。主轴调速电路是控制主轴电机带动盘体以恒定速率转动的电路。缓存(Cache)对磁盘性能所带来的作用是毋庸置疑的,在读取零碎文件数据时,大缓存能带来非常大的优势。 (3)外壳:硬盘的外壳与底板结合成一个密封的整体,正面的外壳保证了硬盘盘片和机构的稳定运行。在固定面板上贴有产品标签,上面印着产品型号、产品序列号、产地、生产日期等信息,由此我们可以对这款产品作一番大致的了解。除此,还有一个透气孔,它的作用就是使硬盘内部气压与大气气压保持一致。另外,硬盘侧面还有一个向盘片表面写入伺服信号的Servo孔。 Servo孔的作用是向硬盘盘片写入伺服信号 2、硬盘内部结构 拆下控制电路板后再将外面的保护面拆后就现出了硬盘的内脏(见图4)。它由磁头、盘片、主轴、电机、接口及其他附件组成,其中磁头盘片组件是构成硬盘的核心,它封装在硬盘的净化腔体内,包括有浮动磁头组件、磁头驱动机构、盘片、主轴驱动装置及前置读写控制电路这几个部分。将硬盘面板揭开后,内部结构即可一目了然。

C语言编写规范之注释

1、头文件包含Includes 2、私有类型定义 Private typedef 3、私有定义Private define 4、私有宏定义 Private macro 5、私有变量 Private variables 6、私有函数原型Private function prototypes 7、私有函数Private functions 8、私有函数前注释 /****************************************************************************** * * Function Name : FSMC_NOR_Init * Description : Configures the FSMC and GPIOs to interface with the NOR memory. * This function must be called before any write/read operation * on the NOR. * Input : None * Output : None * Return : None ******************************************************************************* / 9、程序块采用缩进风格编写,缩进空格为4。 10、相对独立的程序块之间、变量说明之后必须加空行; 11、较长的字符(>80字符)要分成多行书写,长表达式要在低优先级操作符划分新行,操作符放在新行之首,新行要恰当缩进,保持排版整齐; 12、循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首; 13、若函数或过程中的参数较长,则要进行适当的划分。 14、不允许把多个短语句写在一行中,即一行只写一条语句。 15、if、for、do、while、case、switch、default等语句自占一行,且if、for、 do、while等语句的执行语句部分无论多少都要加括号{}。 16、对齐只使用空格键,不使用TAB键; 17、 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求 18、 程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一 列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以 及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。 19、 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或

代码规范

目录 一.规范简介 1.1 目的 所有的程序开发手册都包含了各种规则。一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的。这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑。 本规范正是为培养规范设计和编程,养成良好的习惯,增强软件产品的稳定,健壮,可靠性;同时也为了提高软件的可读性,可以让程序员尽快而彻底地理解新的代码,使产品可维护性提高而制定的规范。 1.2 开发规范的重要性 (1)减少维护成本; 一个软件的生命周期中,80%的花费在于维护,另一方面,几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护,规范的编码减少人员变动带来的维护成本。 (2)改善软件的可读性 可以让程序员尽快而彻底地理解新的代码。在一个团队中,代码也容易在程序员之间共享。 (3)维护部门交付产品的规范形象。 二.具体规范 2.1 注释 注释是软件可读性的具体表现。程序注释量一般占程序编码量的20%,软件工程要求不少于20%。程序注释不能用抽象的语言,要精确表达出程序的处理说明。避免每行程序都使用注释,可以在一段程序的前面加一段注释,具有明确的处理逻辑。 注释必不可少,但也不应过多,不要被动得为写注释而写注释。

2.1.1 需要注释的部分 (1)文件头注释,文件创建及修改记录,版权归属,作者以及修订者,以及对文件的简短描述。 (2)类的目的(即类所完成的功能)、设置接口的目的以及应如何被使用。 (3)成员方法注释(对于设置与获取成员方法,在成员变量已有说明的情况下,可以不加注释;普通成员方法要求说明完成功能,参数含义以及返回值)。 (4)普通成员方法内部注释(控制结构、代码所起到的作用以及如此编写代码的原因,处理顺序等)。 (4)参数的含义以及其他任何约束或前提条件、字段或属性描述。而对于局部变量,如无特别意义的情况下则不加注释。 2.1.2 具体注释 (1)文件头注释 要求:遵循JavaDoc的规范,在每一个源文件的开头注明该文件的作用, 作简要说明, 并写上源文件的作者,版权信息编写日期。如果是修改别人编写的源文件,要在修改信息上注明修改者和修改日期。 例子: /** * @Title: 文件名 * @Copyright (C) 年份龙图软件 * @Description: 文件信息描述 * @Revision History: * @Revision 版本号日期作者. */ (2)类和接口的注释 要求:遵循JavaDoc的规范,在每一个类的开头注明该类的作用,作简要说明,并写上作者,编写日期。 例子: /** * @ClassName: 类(或接口)名 * @Description: Description of this class

程序源代码注释规范

程序注释规范说明 程序注释规范应包括以下三方面: 一、文件头部注释 在代码文件的头部进行注释,这样做的好处在于,我们能对代码文件做变更跟踪。在代码头部分标注出创始人、创始时间、修改人、修改时间、代码的功能,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的开发和修改。 样本: /***************************************************** ** 作者:Liuchao ** 创始时间:2007-11-12 ** 修改人:Liuchao ** 修改时间:2007-11-12 ** 修改人:Liaochao ** 修改时间:2007-11-12 ** 描述: ** 主要用于产品信息的资料录入,… *****************************************************/ 二、函数、属性、类等注释 请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protected,protected Internal,public声明的定义注释都建议以这样命名方法。 例如: ///

/// 用于从ERP系统中捞出产品信息的类 ///

class ProductTypeCollector { … } 三、逻辑点注释 在我们认为逻辑性较强的地方加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了… 四、变量注释 我们在认为重要的变量后加以注释,说明变量的含义,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG.我们常用///三斜线注释。 /// 用于从ERP系统中捞出产品信息的类 class ProductTypeCollector { int STData;/// … }

java注释规范总结大全

在软件开发的过程中总是强调注释的规范,但是没有一个具体的标准进行说明,通常都是在代码编写规范中简单的描述几句,不能作为一个代码注释检查的标准和依据,做什么都要有一个依据吗:),现在我特整理了一个《Java的注释规范》,内容来自网络、书籍和自己的实际积累。 JA V A注释规范 版本/状态作者版本日期 1.0 ghc 2008-07-02 一、背景 1、当我们第一次接触某段代码,但又被要求在极短的时间内有效地分析这段代码,我们需要什么样的注释信息? 2、怎么样避免我们的注释冗长而且凌乱不堪呢? 3、在多人协同开发、维护的今天,我们需要怎么样的注释来保证高质、高交的进行开发和维护工作呢? 二、意义 程序中的注释是程序设计者与程序阅读者之间通信的重要手段。应用注释规范对于软件本身和软件开发人员而言尤为重要。并且在流行的敏捷开发思想中已经提出了将注释转为代码的概念。好的注释规范可以尽可能的减少一个软件的维护成本, 并且几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护。好的注释规范可以改善软件的可读性,可以让开发人员尽快而彻底地理解新的代码。好的注释规范可以最大限度的提高团队开发的合作效率。长期的规范性编码还可以让开发人员养成良好的编码习惯,甚至锻炼出更加严谨的思维能力。 三、注释的原则 1、注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释。如果在其他项目组发现他们的注释规范与这份文档不同,按照他们的规范写代码,不要试图在既成的规范系统中引入新的规范。 2、注释的简洁 内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害。 3、注释的一致性 在写代码之前或者边写代码边写注释,因为以后很可能没有时间来这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。通常描述性注释先于代码创建,解释性注释在开发过程中创建,提示性注释在代码完成之后创建。修改代码的同时修改相应的注释,以保证代码与注释的同步。 4、注释的位置 保证注释与其描述的代码相邻,即注释的就近原则。对代码的注释应放在其上方相邻或右方的位置,不可放在下方。避免在代码行的末尾添加注释;行尾注释使代码更难阅读。不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释要对齐。 5、注释的数量 注释必不可少,但也不应过多,在实际的代码规范中,要求注释占程序代码的比例达到20%左右。注释是对代码的“提示”,而不是文档,程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱,注释的花样要少。不要被动的为写注释而写注释。 6、删除无用注释

java编程规范+数据库命名规范

Java编程规范 本编程规范建立在标准的Java编程规范的基础上,如和标准的Java编程规范有冲突,以本编程规范为准。 1.1 程序结构 包名 引入包/类名 类注释 类 常量//常量注释 构造器注释 构造器 构造器注释 构造器 方法注释 方法 方法注释 方法 1.2 命名规范 命名规范使得程序更易理解,可读性更强。并且能够提供函数和标识符的信息。 文件命名规范: java程序使用如下的文件名后缀: 文件类型后缀 Java 源文件.java Java 字节码文件.class 对系统的文件命名方式有待于根据实际业务决定。 包命名规范: 包名应该唯一,它的前缀可以为任何小写的ASCII字符,包名按照公司内部的命名规范,这些规范指出了某种目录名,主要包括部门,项目,机器,或者登录名。 命名规则为: app.系统名.模块名.xxx.xxx 包命名举例: app.oa.interceptor.xxx app.oa.sys.xxx 类命名规范: 类名应该是名词,并且是大小写混合的。首字母要大写。尽量保证类名简单并且描述性强。避免使用只取单词首字母的简写或者单词的缩写形式,除非缩写形式比单词的完整形式更常用(例如:URL或者HTML)。文件名必须和public的类名保持一致,注意大小写(JBuilder 等一些编译器可以忽略大小写,要特别注意)。如是实现类命名后缀+Impl。 类命名举例: classLoginAction; classUserServiceImpl; 接口命名规范:

接口命名方式与类命名方式相同。 接口命名举例: interfaceIUserService; interfaceSysYhjsDAO; 方法命名规范; 方法名应该为动词,并且是大小写混合的。首字母要小写,方法名的第 二个单词的第一个字母大写。 方法命名举例: String getNoticeNo(); Collection findByCondition(String); 变量命名规范 变量,以及所有的类实例应为首字母小写的大小写混合形式。变量名的第二个单词 的首字母大写。变量名的首字母不能为下划线或者$符。 变量名应该尽可能的短小,但要有意义。变量名应该便于记忆,也就是说变量名应 该尽可能的做到见名知意。除了暂时使用的变量外(一般用于循环变量),应该避免使 用只有一个字母的变量名。对于临时变量一般说来:i,j,k,m,n代表整型变量。c,d,e代表字符型变量。 变量命名举例: String dataType; String name; inti; char c; 常量命名规范: 声明为类常量的变量或者ANSI常量应该全部为大写字母,并且每个单词间用下划 线“_”隔开。为了便于调试,应避免使用ANSI常量。 常量命名举例: static final int MIN_WIDTH = 4; 1.3 注释规范 Java 提供了两种类型的注释:程序注释和文档注释。程序注释是由分隔符/*…*/,和// 隔开的部分,这些注释和C++ 中的注释一样。文档注释(即“doc 注释”)是Java 独有的。由分隔符/**…*/隔开。使用javadoc工具能够将文档注释抽取出来形成HTML 文件。程序注释主要是对程序的某部分具体实现方式的注释。文档注释是对程序的描述性注释,主要是提供给不需要了解程序具体实现的开发者使用。注释应该是代码的概括性描述,提供不易直接从代码中得到的信息,并且只包含对阅读和理解程序有用的信息。例如注释中包含相应的包如何编译或者在哪个目录下,而不应该包括这个包驻留在哪儿的信息。注释中可以描述一些精妙的算法和一些不易理解的设计思想,但应该避免那些在程序代码中很清楚的表达出来的信息。尽可能的避免过时的信息。错误的注释比没有注释更有害。经常性的注释有时也反映出代码质量的低下。 …程序注释: 程序注释有四种格式:块注释格式,单行注释,跟随注释,行尾注释 ?块注释格式 块注释主要用于描述:文件、方法、数据结构和算法。一般在文件或者方法定义的 之前使用。也可以用在方法定义里面,如果块注释放在函数或者方法定义里,它必须与它所描述的代码具有相同的缩进形式。

代码编写规范说明书

代码编写规范说明书(c#.net与https://www.wendangku.net/doc/9a690806.html,)目录 1 目的 2 范围 3 注释规范 3.1 概述 3.2 自建代码文件注释 3.3 模块(类)注释 3.4 类属性注释 3.5 方法注释 3.6 代码间注释 4 命名总体规则 5 命名规范 5.1 变量(Variable)命名 5.2 常量命名 5.3 类(Class)命名 5.4 接口(Interface)命名 5.5 方法(Method)命名 5.6 名称空间Namespace)命名 6 编码规则 6.1 错误检查规则 6.2 大括号规则 6.3 缩进规则 6.4 小括号规则 6.5 If Then Else规则 6.6 比较规则 6.7 Case规则 6.8 对齐规则 6.9 单语句规则 6.10 单一功能规则 6.11 简单功能规则 6.12 明确条件规则 6.13 选用FALSE规则 6.14 独立赋值规则 6.15 定义常量规则 6.16 模块化规则 6.17 交流规则 7 编程准则 7.1 变量使用 7.2 数据库操作 7.3 对象使用 7.4 模块设计原则 7.5 结构化要求 7.6 函数返回值原则 8 代码包规范 8.1 代码包的版本号

8.2 代码包的标识 9 代码的控制 9.1 代码库/目录的建立 9.2 代码归档 10 输入控制校验规则 10.1 登陆控制 10.2 数据录入控制 附件1:数据类型缩写表 附件2:服务器控件名缩写表 1 目的 一.为了统一公司软件开发设计过程的编程规范 二.使网站开发人员能很方便的理解每个目录,变量,控件,类,方法的意义 三.为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。 四.编码规范和约定必须能明显改善代码可读性,并有助于代码管理、分类范围适用于企业所有基于.NET平台的软件开发工作 2 范围 本规范适用于开发组全体人员,作用于软件项目开发的代码编写阶段和后期维护阶段。 3 注释规范 3.1 概述 a) 注释要求英文及英文的标点符号。 b) 注释中,应标明对象的完整的名称及其用途,但应避免对代码过于详细的描述。 c) 每行注释的最大长度为100个字符。 d) 将注释与注释分隔符用一个空格分开。 e) 不允许给注释加外框。 f) 编码的同时书写注释。 g) 重要变量必须有注释。 h) 变量注释和变量在同一行,所有注释必须对齐,与变量分开至少四个“空格”键。 如:int m_iLevel,m_iCount; // m_iLevel ....tree level // m_iCount ....count of tree items string m_strSql; //SQL i) 典型算法必须有注释。 j) 在循环和逻辑分支地方的上行必须就近书写注释。 k) 程序段或语句的注释在程序段或语句的上一行 l) 在代码交付之前,必须删掉临时的或无关的注释。 m) 为便于阅读代码,每行代码的长度应少于100个字符。 3.2 自建代码文件注释 对于自己创建的代码文件(如函数、脚本),在文件开头,一般编写如下注释: /****************************************************** FileName: Copyright (c) 2004-xxxx *********公司技术开发部 Writer: create Date: Rewriter:

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

相关文档