问题标签 [ata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 当传输长度超过 1345 时,Linux scsi ata cmd 写入或读取有时有效,有时无效
我的代码如下:
如果我发送超过 1345 的 cmd 传输长度,它有时会起作用,有时会不起作用。如果传输长度增加,不工作的部分也会增加。cmd 不工作时没有 uart 日志或内核日志。
附言。如果 cmd 不起作用,errno 会说22(invalid argument)
c - 什么是 PATA/IDE 状态代码,它们是什么意思?
我正在编写一个有趣的操作系统,我正在尝试编写一个 PATA/IDE 驱动程序来访问磁盘,但是它不起作用。我有这行unsigned char status = port_byte_in(ATAPort + COMMANDPORT);
返回 88(十进制)的值。由于这可能表明我做错了什么,并且作为其他人的参考,PATA/IDE 状态代码是什么?
我的驱动程序遵循28 位 PIO PATA/IDE 进程。
编辑-澄清一下,这是port_byte_in
功能:
并且ATAPort
是0x1F0
, COMMANDPORT
=0x07
python - 尝试在 python 中使用 ioctl 读取驱动器属性时出现溢出错误
尝试为我的一个驱动器 (cmd = 0x89) 提取特定于供应商的功能时,出现溢出错误:OverflowError: signed integer is greater than maximum
. 调用 ioctl 后立即抛出错误。回溯也不是很丰富:
ATA 命令传递参考:http ://www.t10.org/ftp/t10/document.04/04-262r8.pdf
我哪里出错了?
c - xv6 引导加载程序:使用 CHS 从磁盘读取扇区
我一直试图围绕 xv6 引导加载程序的 C 部分(问题在代码下方)
所以它使用CHS 寻址方案,即将扇区索引、柱面编号和磁头编号输出到磁盘端口并发出读取命令(请参阅 参考资料readsect(dst, offset)
)。
该offset
函数采用的参数应该包含从磁盘起始扇区开始的偏移量。例如,如果您0x01000203
作为偏移量(16777731
十进制)传递,它会将其拆分0x03
为扇区索引、0x0002
柱面编号和0x01
磁头编号。问题是扇区索引不能从0x00
to 0xFF
,它只能从0x01
to 0x3F
(十进制的1
to 63
),所以这个寻址方案是不连续的。例如, anoffset
0x100002EE
将是无效的,因为没有扇区索引0xEE
。
我真的不明白内核是如何成功加载到内存中的。在readseg()
函数中,很明显您可以将任何内存偏移量传递给它,它会将其转换为扇区偏移量并传递给readsect()
,可能会传递无效的扇区索引。如果内核大小永远不会超过63 * 512 = 32256
字节,那就没问题了,因此永远不会达到无效的扇区索引,但它实际上是 170k 左右。
到底是怎么回事?
c - Os Dev 的 PCI IDE 教程中的 insl 函数有什么作用?
这是调用 insl 的函数。
assembly - 使用 ATA/IDE PIO 读取磁盘扇区时出现奇怪的数据
当我读取磁盘扇区时,我得到了一些意想不到的数据。
我试图在没有内核的情况下读取磁盘数据,但得到了奇怪的数据。我有一个文件fs.img
并像使用它一样使用它qemu-system-i386 -drive file=fs.img,index=0,media=disk,format=raw,if=ide ......
我得到的数据:
读取扇区的代码:
如果我更改要读取的地址,我会得到与以前相同的输出。如果我使用文本文件作为磁盘映像,我会得到如下输出:
只有 0x01 和 0x37 已从 0x14 更改为 0x02。
hard-drive - 是否可以访问 pata 驱动器(驱动器 0 和驱动器 1)中的所有寄存器?
我正在研究 ATA 规范来为我的爱好操作系统实现 PATA 驱动程序。我阅读了第一个 ATA 规范草案(ATA/ATAPI-1, 1994),因为它只有大约 70 页(ATA/ATAPI-6 大约有 500 页)。在阅读规范时,有一些我不明白的地方,我想检查一下我到目前为止是否正确理解。
据我所知,与 ATA 兼容的控制器的物理配置如下图所示。
根据规范,电信号被发送到两个驱动器,因为驱动器共享相同的电线。所以我认为将数据写入寄存器(例如outb(0x1F6,...))会影响两个驱动器控制器的寄存器,并且当命令(读/写扇区)发送到命令寄存器时,两个控制器都会读取自己的寄存器和决定谁运行命令并使用 40 针连接器。
- 那么当试图读取状态寄存器时会发生什么?
1-1。哪个控制器响应 I/O 端口读取指令?是否只有主机响应读取指令并且主机的状态寄存器包含有关两个驱动器的所有信息?(例如,如果主驱动器不忙,而从驱动器忙,则设置状态寄存器中的 BSY 位。
1-2。如果状态寄存器包含有关两个驱动器的所有信息,假设 BSY 位已清除并且 DRQ 已设置,那么我如何知道哪个驱动器已准备好将数据从缓冲区发送到处理器?
- 如果无法读取两个驱动器中的寄存器,是否意味着无法同时从两个驱动器读取/写入扇区?
如果只有一个驱动器连接到 40 针连接器,一切都会对我产生影响。但是,每个主接口和辅助接口最多允许两个驱动器,所以我很困惑。
谢谢你的帮助。
kernel - 关于 ATA 的问题
现在我想实现 ATA PIO 和 ATA DMA(PCI 总线主控)驱动程序。我为他们阅读了 OSdev wiki 页面,经过一整天的折腾,我终于对 ATA 驱动器有了很多了解,但这些文章让我在阅读了一些部分后提出了一些问题:
1)在 IDENTIFY 部分,它讨论了 ATAPI 和 SATA 如何中止 IDENTIFY 命令并用识别字节填充 0x1f4 和 0x1f5,有人告诉我这对于 SATA 驱动器是错误的,我需要对此进行澄清。
2)如果我想使用DMA代替,PIO页面中驱动器类型的检测是否仍然相同?
3)根据osdev ATA DMA页面:
总线主控寄存器的“地址”存储在磁盘控制器的 PCI 配置空间中的 BAR4 中。总线主寄存器一般是一组 16 个顺序 IO 端口。它也可以是一个 16 字节的内存映射空间。
如果有人可以尽可能深入地解释该部分并澄清其真实性,我将非常高兴。
linux - udevadm 和 ATA 寻址
在udevadm info /dev/sda
中,为什么提供不同的 ata 值,哪一个是首选/更准确的地址?
我看到旁路是,但DEVPATH有它,ID_ATA是...ata-1.0
.../ata3/...
1
我会假设以设备为目标的最准确方法是,/dev/disk/by-path/...
但我不了解 ata 值的变化。