首页
社区
课程
招聘
关于保护模式下读U盘和硬盘
发表于: 2013-5-19 19:52 10602

关于保护模式下读U盘和硬盘

2013-5-19 19:52
10602
情况是这样:
        我自己写了个简单的操作系统,想移植到U盘上通过U盘在真正的电脑上来启动运行,在模式下是通过int 13来实现对U盘读取,切到保护模式下通过I/O端口(0x1F0--0x1F7等)操作行不通.我打开了8259的14号中断并加入中断服务函数,给命令寄存器(端口:0x1F7)写入命令后,经测试发现并没有进入中断,而状态寄存器(0x1F7)根本没变
另外:
        由于我设置的是从U盘启动,所以在实模式下int 13读U盘时用的驱动器号为0x80,我猜测是因为从U盘启动所以U盘变成第一磁盘,所以猜测ATA第一通道也变成U盘,以上操作本是想读U盘的,但自己也觉得可能会有问题,毕竟U盘不是硬盘,但不能读U盘那也应该读出硬盘啊,事实上两者都没能读出.
期待大神支招:
        保护模式下读写硬盘,U盘方法,前提是没有任何API可用并且Kernel是通过U盘启动的
注:
        1.设置U盘启动时的标注是USB HDD

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
跟那没关系吧,Grub吧
2013-5-19 20:19
0
雪    币: 45
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
这个和grub没关的吧,因为是从U盘启动,所以上电自检后加载的是U盘第一扇区,这个扇区是自己写的,作用就是在U盘查找并加载Loader,Loader再查找加载Kernel,开启保护模式后就跳到Kernel入口...
2013-5-19 21:15
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
1.端口0x1f0--0x1f7这个端口是IDE接口硬盘使用的,换到笔记本的SATA接口上面就变了
2.建议乖乖的使用扩展int 13h中断读写磁盘,就是一个实模式/保护模式切换的问题,具体可以参看ntldr的实现方式
3.如果执意想使用IO端口的方式读写磁盘,那么请遍历PCI设备,查找到南桥存储控制器所在的Bus/Dev/Func 然后根据PCI规范读取相关的PCI配置空间以得到相关的IO端口信息
2013-5-19 21:57
0
雪    币: 45
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
你的意思是台式机和笔记本的硬盘的接口不一样,我再去看看ATA手册,希望能找到线索...
我曾看到过你说的那种实/保护模式切换读取的方式,但从长远来看,个人觉得这不是一个较好的最终方案,我偏向于端口操作.我虽然尝试写系统,但有好多硬件接口知识匮乏,最要命的是不知道从哪里查资料!昨天初步看了PCI,看来得深入下去了.谢谢大虾.
2013-5-19 22:31
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
实验性的作业系统你可以硬编码一个IDE的端口~但是要是实战的话 你要考虑IDE、SATA、SCSI、SAS等各种接口~然后呢,PCI的特性是自动分配IO端口等各种资源的,所以,你需要动态获取~
2013-5-19 22:49
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
还有啊,不是说台式机的端口和笔记本不一样,是如果台式机你在BIOS里开启了AHCI和不开启AHCI的端口也是不一样的~
2013-5-19 22:52
0
雪    币: 45
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8

我打开电脑看了一下SATA控制器的信息,然后问你一下,这个中断19是什么情况?8259只支持16个中断啊,难道这个是会像异常一样触发中断?
上传的附件:
2013-5-19 22:57
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=zevenfly;1178918]
我打开电脑看了一下SATA控制器的信息,然后问你一下,这个中断19是什么情况?8259只支持16个中断啊,难道这个是会像异常一样触发中断?[/QUOTE]
8259是几百年前的玩意了~奔腾以后的PC都是APIC的,也就是说1994年以后的PC都是APIC,一个APIC有一组24条IRQ线
2013-5-20 10:35
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
10
你参考一下老毛挑U盘PE系统的u盘引导程序就会明白!
2013-5-20 10:53
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我参考那个作甚?那个跟APIC有关系?
2013-5-21 12:52
0
雪    币: 45
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
对于中断号超过15这个问题,刚好这几天我看到相关的资料,说是有2种方法,一种增加中断号,另一种是共享中断号...看来中断控制器以后也要重新写了...
对了,我在bios里设置SATA为兼容模式用老的端口方式成功读出硬盘了,但是读不出U盘.
另外, 这几天我也看了PCI配置空间,初步可以实现读取配置空间和遍历设备,但没弄明白那6个地址的意思,求点拨.
2013-5-21 19:24
0
雪    币: 45
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
现在能够顺利引导,但就是到了保护模式读不了U盘...难道要自己写USB底层驱动?
2013-5-21 19:27
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
可以参考这个pdf
那6个地址就是IO基地址0~5
PCI_配置空间_int.pdf
上传的附件:
2013-5-21 20:06
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
没必要 你自己看一下相关的中断的说明就行了
2013-5-21 20:07
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
你好,请问你知道16位实模式下U盘读操作该怎么进行吗? 我现在想把一个软盘引导的系统改成u盘引导的系统,我的理解是系统本身是不需要修改的(读到内存里都一样,不必关心怎么读进来的),但引导区程序需要修改,因为软盘和U盘存储结构不同,虽然都用int 0x13进行读操作,但是读的过程和方法显然是不同的。软盘属于磁盘,有磁头、柱面等概念,但U盘不属于磁盘,U盘用的是闪存。
2013-6-19 10:40
0
游客
登录 | 注册 方可回帖
返回
//