On 04/16/2015 02:07 PM, 乔天香 wrote:
Hi, all
Hi!
I'm learning operating system and trying to write a little toy kernel.
Before doing disk I/O, I issued the *ATA identify* command to obtain
information about the master device on the primary channel. When I ran
my code with QEMU, I found it gives some ASCII string fields in a wrong
byte order, for example, the model name is given as:
EQUMH RADDSI K
but actually it should be
QEMU HARDDISK
So I referred to the source code file `hw/ide/core.c` and found a
function doing this:
61 static void padstr(char *str, const char *src, int len)
62 {
63 int i, v;
64 for(i = 0; i < len; i++) {
65 if (*src)
66 v = *src++;
67 else
68 v = ' ';
69 str[i^1] = v;
70 }
71 }
And it is called like:
112 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
Now I'm wondering why it does this "byte swapping"? I read the ATA
specification about this *ATA identify* command and didn't find anything
related to byte order. Is it required by hardware?
Thanks for your kind help.
The reason is that the ASCII data is, for whatever reason, stored as an
array of 2 byte chunks. Any historical reasons for doing so are not
known to me, but:
Please check out ATA8 ATA/ATAPI Command Set 3, Revision 1b (or whichever
ATA spec you have handy)
Section 3.3.10 "ATA string convention"
'Each pair of bytes in an ATA string is swapped as shown in table 5.'
Why?
It's a mystery to me.
Please don't hesitate to comment on any other oddities you come across
within the IDE system.
Thanks,
--js