7896|16

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何直接对硬盘读写 [复制链接]

我在写个操作系统,有个问题一直很困惑,那就是如何直接对硬盘读写,我一直用int13,不过这不是持久之计,有谁用IO指令写过直接对硬盘读写的程序么?能发个源码么,C语言的函数就不用了,因为他们都要调内核函数,而我写的就是内核,用汇编吧。
硬盘读写是一个复杂的过程,它涉及到硬盘的接口方式、寻址方式、控制寄存器模型等

IDE控制器的寄存器模型

计算机主机对IDE接口硬盘的控制是通过硬盘控制器上的二组寄存器实现
[1]一组为命令寄存器组(Task File Registers), I/O的端口地址为1F0H-1F7H, 其作用是传送命令与命令参数。
[2]一组为控制/诊断寄存器(Control/Diagnostic Registers),I/O的端口地址为3F6H-3F7H,其作用是控制硬盘驱动器。

表1   Task File Registers命令寄存器组
I/O地址  读(主机从硬盘读数据)  写(主机数据写入硬盘)
1F0H  数据寄存器  数据寄存器
1F1H  错误寄存器(只读寄存器)  特征寄存器
1F2H  扇区计数寄存器  扇区计数寄存器
1F3H  扇区号寄存器或LBA块地址0~7  扇区号或LBA块地址0~7
1F4H  磁道数低8位或LBA块地址8~15  磁道数低8位或LBA块地址8~15
1F5H  磁道数高8位或LBA块地址16~23  磁道数高8位或LBA块地址16~23
1F6H  驱动器/磁头或LBA块地址24~27  驱动器/磁头或LBA块地址24~27
1F7H  状态寄存器  命令寄存器

表2   Control/Diagnostic Registers控制/诊断寄存器 I/O地址  读  写
3F6H  交换状态寄存器(只读寄存器)  设备控制寄存器(复位)
3F7H  驱动器地址寄存器   

最新回复

lz是满腔热血型的。 不过建议写内核呢,最好不要把它当做一个事业来做,或者等有了更多的实践基础之后再当一个事业来做。 现阶段还是当成一个学习操作系统的途径来做比较好一点。  详情 回复 发表于 2010-5-9 18:21
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
= =
谁说内核用汇编写的...
硬件架构不明,你用什么汇编?
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
IDE控制器的寄存器模型 intel386
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
1F2H 扇区计数寄存器 扇区计数寄存器  
1F3H 扇区号寄存器或LBA块地址0~7 扇区号或LBA块地址0~7  
1F4H 磁道数低8位或LBA块地址8~15 磁道数低8位或LBA块地址8~15  
1F5H 磁道数高8位或LBA块地址16~23 磁道数高8位或LBA块地址16~23  
1F6H 驱动器/磁头或LBA块地址24~27 驱动器/磁头或LBA块地址24~27  
看来硬件才是真正的程序,程序最终都要译码成控制信号
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
内核不完全是asm写的,在linux下硬盘的读写属mash数据传送,应用DMA效率高很多。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
牛人,这个问题,应该问问 罗云杉,估计他能搞定,

我用MASM只写过bios
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果你有理论指导,

写个驱动对地址直接操作看看,

要有空硬盘试验才好,hoho,
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果我们可以直接对硬盘操作的话,我们可以在网线上接个驱动器直接把数据送到硬盘,不需要大型的PC机,这样可以用作军事间谍。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

9
 
对硬盘操作是对硬盘操作哈  不要想的太远
网线上接驱动器走啥网络协议?走了网卡再走CPU控制?hoho
开个玩笑。。。
建议LZ对硬盘的最底层汇编操作做个封装,再用C做相对高层的组织。
内核也不是都用汇编写的,事实上,内核中汇编的比例绝不会超过10%。否则怎么移植?
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(初级)

10
 
建议LZ对硬盘的最底层汇编操作个封装,再用C做相对高层的组织
现在是如何对硬盘进行最低层操作,我们把硬盘当个单片机来处理,而端口看成串口,缓存看成内存,让它与PC通讯。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
通常的CPU对于IDE都是用控制器来做的,所谓的控制器实际上就是一组寄存器,常规做法都是利用这组寄存器做驱动程序的,想绕开的可能性比较小。还是仔细读器件手册然后写驱程吧。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
是BIOS实现int 13h的

实现原理:直接访问FDC/HDC端口进行编程控制


03F0-03F7 ---- FDC 1  (1st Floppy Disk Controller) second FDC at 0370

PORT 01F0-01F7 - HDC 1(1st Fixed Disk Controller) (ISA, EISA)



I/O端口功能表
---------------------------
I/O地址 功能、用途
---------------------------
0    DMA通道0,内存地址寄存器(DMA控制器1(8237))
1    DMA通道0, 传输计数寄存器
2    DMA通道1,内存地址寄存器
3    DMA通道1, 传输计数寄存器
4    DMA通道2,内存地址寄存器
5    DMA通道2, 传输计数寄存器
6    DMA通道3,内存地址寄存器
7    DMA通道3, 传输计数寄存器
8    DMA通道0-3的状态寄存器
AH    DMA通道0-3的屏蔽寄存器
BH    DMA通道0-3的方式寄存器
CH    DMA清除字节指针
DH    DMA主清除字节
EH    DMA通道0-3的清屏蔽寄存器
FH    DMA通道0-3的写屏蔽寄存器
19H   DMA起始寄存器
20H-3FH 可编程中断控制器1(8259)使用
40H   可编程中断计时器(8253)使用,读/写计数器0
41H   可编程中断计时器寄存器
42H   可编程中断计时器杂项寄存器
43H   可编程中断计时器,控制字寄存器
44H   可编程中断计时器,杂项寄存器(AT)
47H   可编程中断计时器,计数器0的控制字寄存器
48H-5FH 可编程中断计时器使用
60H-61H 键盘输入数据缓冲区
61H   AT:8042键盘控制寄存器/XT:8255输出寄存器
62H   8255输入寄存器
63H   8255命令方式寄存器
64H   8042键盘输入缓冲区/8042状态
65H-6FH 8255/8042专用
70H   CMOS RAM地址寄存器
71H   CMOS RAM数据寄存器
80H   生产测试端口
81H   DMA通道2,页表地址寄存器
82H   DMA通道3,页表地址寄存器
83H   DMA通道1,页表地址寄存器
87H   DMA通道0,页表地址寄存器
89H   DMA通道6,页表地址寄存器
8AH   DMA通道7,页表地址寄存器
8BH   DMA通道5,页表地址寄存器
8FH   DMA通道4,页表地址寄存器
93H-9FH DMA控制器专用
A0H   NM1屏蔽寄存器/可编程中断控制器2
A1H   可编程中断控制器2屏蔽
C0H   DMA通道0,内存地址寄存器(DMA控制器2(8237))
C2H   DMA通道0, 传输计数寄存器
C4H   DMA通道1,内存地址寄存器
C6H   DMA通道1, 传输计数寄存器
C8H   DMA通道2,内存地址寄存器
CAH   DMA通道2, 传输计数寄存器
CCH   DMA通道3,内存地址寄存器
CEH   DMA通道3, 传输计数寄存器
D0H   DMA状态寄存器
D2H   DMA写请求寄存器
D4H   DMA屏蔽寄存器
D6H   DMA方式寄存器
D8H   DMA清除字节指针
DAH   DMA主清
DCH   DMA清屏蔽寄存器
DEH   DMA写屏蔽寄存器
DFH-EFH 保留
F0H-FFH 协处理器使用
100H-16FH保留
170H   1号硬盘数据寄存器
171H   1号硬盘错误寄存器
172H   1号硬盘数据扇区计数
173H   1号硬盘扇区数
174H   1号硬盘柱面(低字节)
175H   1号硬盘柱面(高字节)
176H   1号硬盘驱动器/磁头寄存器
177H   1号硬盘状态寄存器
1F0H   0号硬盘数据寄存器
1F1H   0号硬盘错误寄存器
1F2H   0号硬盘数据扇区计数
1F3H   0号硬盘扇区数
1F4H   0号硬盘柱面(低字节)
1F5H   0号硬盘柱面(高字节)
1F6H   0号硬盘驱动器/磁头寄存器
1F7H   0号硬盘状态寄存器
1F9H-1FFH保留
200H-20FH游戏控制端口
210H-21FH扩展单元
278H   3号并行口,数据端口
279H   3号并行口,状态端口
27AH   3号并行口,控制端口
2B0H-2DFH保留
2E0H   EGA/VGA使用
2E1H   GPIP(0号适配器)
2E2H   数据获取(0号适配器)
2E3H   数据获取(1号适配器)
2E4H-2F7H保留
2F8H   2号串行口,发送/保持寄存器(RS232接口卡2)
2F9H   2号串行口,中断有效寄存器
2FAH   2号串行口,中断ID寄存器
2FBH   2号串行口,线控制寄存器
2FCH   2号串行口,调制解调控制寄存器
2FDH   2号串行口,线状态寄存器
2FEH   2号串行口,调制解调状态寄存器
2FFH   保留
300H-31FH原形卡
320H   硬盘适配器寄存器
322H   硬盘适配器控制/状态寄存器
324H   硬盘适配器提示/中断状态寄存器
325H-347H保留
348H-357H DCA3278
366H-36FH PC网络
372H    软盘适配器数据输出/状态寄存器
375H-376H 软盘适配器数据寄存器
377H    软盘适配器数据输入寄存器
378H    2号并行口,数据端口
379H    2号并行口,状态端口
37AH    2号并行口,控制端口
380H-38FH SDLC及BSC通讯
390H-393H Cluster适配器0
3A0H-3AFH BSC通讯
3B0H-3B H MDA视频寄存器
3BCH    1号并行口,数据端口
3BDH    1号并行口,状态端口
3BEH    1号并行口,控制端口
3C0H-3CFH EGA/VGA视频寄存器
3D0H-3D7H CGA视频寄存器
3F0H-3F7H 软盘控制器寄存器
3F8H    1号串行口,发送/保持寄存器(RS232接口卡1)
3F9H    1号串行口,中断有效寄存器
3FAH    1号串行口,中断ID寄存器
3FBH    1号串行口,线控制寄存器
3FCH    1号串行口,调制解调控制寄存器
3FDH    1号串行口,线状态寄存器
3FEH    1号串行口,调制解调状态寄存器
3FFH    保留
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
获得硬盘序列号(原程序)
这是一个用端口对硬盘编程例子
本程序在必须在DOS下运行,我在qb4.5版本下运行通过

主板上共有两个IDE接口,每个接口上又分主、从,所以可以接4个IDE设备,这4个端口号各不同,本程序用端口1F0-1F7是主板上的第一个IDE接口上的主接口,最常用的就是这个了。别的只是端口号不一样,编程方法原理一样。
CODE:  [Copy to clipboard]
--------------------------------------------------------------------------------

'获得硬盘序列号的程序(非逻辑盘卷标,有的把C盘的卷标说成是硬盘序列号)
'代码:QBASIC,运行环境:DOS

OUT &H1F6, &HA0
OUT &h1F2,1
OUT &H1F3, 1
OUT &h1F4,1
OUT &h1F5,1
OUT &H1F7, &HEC '获得硬盘信息的命令
DO WHILE flag <> &H58
  f lag = INP(&H1F7)
  if inkey$=chr$(27) then '如果按ESC键,终止程序
     print "无法获得硬盘序列号"
     end
  end if
LOOP
re$ = SPACE$(18)
FOR i% = 1 TO 18
  READ a$
  H$ = CHR$(VAL("&H" + a$))
  MID$(re$, i%, 1) = H$
NEXT i%
duan% = varSEG(re$):offe% = SADD(re$)
DEF SEG = duan%
print "本硬盘的序列号为 ";
FOR i = 1 TO 16
  CALL Absolute(r%, offe%) '调用在qb中的内嵌汇编机器码
  r1% = r% AND &HFF
  r2% = (r% AND &HFF00) / &H100
  IF i > 9 AND i < 15THEN PRINT CHR$(r1%); CHR$(r2%);
NEXT i
DEF SEG
END
'此DATA中的数据为机器码,用于读端口字数据(qb中的端口语句只能按字节读写端口,不能按字读写)
DATA 55,89,e5,ba,f0,01,ed,86,e0,8b,5e,06,89,07,5d,ca,02 ,00
'55     push        bp
'89E5   mov        bp, sp
'BAF001 mov        DX, 01F0h
'ED     in        ax, dx
'86E0   xchg        ah, al
'8B5E06 mov        bx, [bp+06]
'8907   mov        [BX], AX
'5D     pop        BP
'CA0200 ret        2

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
code segment   
  assume cs:code   
  start:   
  push cs   
  pop ds   
  call waitfree   
  jnz err   
  mov dx,1f0h   
  add dx,3   
  mov al,3fh   
  out dx,al   
  call waitfree   
  jnz err   
  mov al,0   
  inc dx   
  out dx,al   
  call waitfree   
  jnz err   
  inc dx   
  out dx,al   
  call waitfree   
  jnz err   
  mov al,0e0h   
  inc dx   
  out dx,al   
  call waitfree   
  jnz err   
  mov dx,1f2h   
  mov al,2   
  out dx,al   
  call waitfree   
  jnz err   
  mov dx,1f7h   
  mov al,21h   
  out dx,al   
  call waitfree   
  jnz err   
  mov cx,256   
  mov dx,1f0h   
  mov di,offset   sector   
  push cs   
  pop es   
  read: in ax,dx   
  stosw   
  loop read   
  err:   
  add dx,7   
  in al,dx   
  mov bx,ax   
  __wait:   call         waitfree   
                  jnz           __wait   
  mov cx,256   
  mov dx,1f0h   
  read1: in ax,dx   
  stosw   
  loop read1   
  mov ax,4c00h   
  int 21h   
  waitfree proc   
  push cx   
  push dx   
  push ax   
  Mov DX,1f7H   
  Sub CX,CX   
  _Wait: In AL,DX   
                  and           al,0d0h   
  Cmp AL,50H   
  Jz Ok   
  Loop _Wait   
   
  ok: pop ax   
  pop dx   
  pop cx   
  ret   
  waitfree endp   
   
  align 16   
  sector dw 512   dup(0)   
  code ends   
  end start   
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
没太仔细看哈
不过觉得像这个代码都是汇编写的  但是实际上逻辑控制可以通过C来实现,只有对端口的操作用汇编实现,也可以封装成C来调用的。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
也不知道你真正想做什么,

只要有地址就可以直接操作,

操作还要自己移植一个文件系统,

理论上可以做到,不过没有人做,微软作好了,

网线走TCPip协议的,协议还有可能走加密算法,军用的都是独立的加密协议,你相想法太单纯了;

对ide硬盘读写,一个c52单片机就可以做到,也很容易,

关键是不知道你到底要做什么,表示怀疑一下,

针对,获得硬盘序列号程序,看来你对硬盘结构不了解,

0扇区的直接读取,有一组就是序列号,格式化的时候,写上去的,可以人为改动,

随便一个什么语言,vb delphi 都可以做到,不用汇编,

不过你要是学过驱动程序的编写,可以把你的程序移植到驱动里面,写一个读写序列号的驱动sys,

在写一个dll调用,

不过,没有人这么做,属于画蛇,要去制造墨汁了
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

17
 
lz是满腔热血型的。
不过建议写内核呢,最好不要把它当做一个事业来做,或者等有了更多的实践基础之后再当一个事业来做。
现阶段还是当成一个学习操作系统的途径来做比较好一点。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表