1

我的这个 Write28() 函数有问题,它在 28 位 PIO 模式下写入 ATA 驱动程序(HDD 驱动程序)。好吧,首先你可以在我的 kernel.c++ 中看到我称之为:

  ret_chr_arr file_contents=filealgo.File_to_char(sampleFile);
  ret_chr_arr math_wkst_file= filealgo.File_to_char(anotherSampleFile);

  ret_chr_arr file_1_contents = filealgo.File_to_char(file1);
  ret_chr_arr file_2_contents = filealgo.File_to_char(file2);
  ret_chr_arr file_3_contents = filealgo.File_to_char(file3);


  char* res_default = Lib::str::strcat(file_contents.str,math_wkst_file.str);
  res_default = Lib::str::strcat(res_default,file_1_contents.str);
  res_default = Lib::str::strcat(res_default,file_2_contents.str);
  res_default = Lib::str::strcat(res_default,file_3_contents.str);

//printf("\nres_default %s",res_default);

   vata.return_ata().Write28(0, res_default,0, Lib::str::strlen(res_default));
   vata.return_ata().Flush();

这完全有效,并写入硬盘...但是..这是问题所在...我正在制作一个命令 mkfile (现在默认为文件名生成文件),它写入 ATA 驱动程序还。

File tempFile;
tempFile.header.name = "FileGenerated";
ret_chr_arr file_contents_temp=filealgo.File_to_char(tempFile);
result_sector_one = Lib::str::strcat(result_sector_one,file_contents_temp.str);
            vata.return_ata().Write28(0, result_sector_one,0, Lib::str::strlen(result_sector_one));
vata.return_ata().Flush();
printf("\n%s\n",vata.return_ata().Read28(0));

有趣的是,这在 Read28 中发生在我身上,我不能多次调用 Read28 ......这是因为我之前 @millenburg 警告我返回一个指向局部变量的指针......基本上是 return (char*) str .. 当 str 是一个数组时。我删除了它似乎可以工作......但是 write28() 也没有使用它......我已经花了好几次尝试调试它并解决它,但它不起作用。如果有人对更多信息感兴趣,这是一个视频。这是我的 Write28 函数:

void AdvancedTechnologyAttachment::Write28(uint8_t sectorNum, char* data, uint32_t start, uint32_t count)
{
    if(!(accesible))
    {
        printf("Failed : Not Accessible");
        return;
    }
        //Larger Addressing Than 28
    //check first 4 bits are 0
    if(sectorNum > 0x0FFFFFFF)
    {
        printf("ERR");
        return;
    }

    if(count>512)
    {
        printf("ERR");
        return;
    }
//Identify What 
    //Drive You want to comunicate with
    //MASTER || SLAVE
    if(this->type == MASTER)
        p8b.out(0xE0 | ((sectorNum & 0x0F000000) >> 24),port_def + 0x6);
    else
        p8b.out(0xF0 | ((sectorNum & 0x0F000000) >> 24),port_def + 0x6);



    p8b.out(0,port_def + 0x1);
    p8b.out(1,port_def + 0x2);
    p8b.out( sectorNum & 0x000000FF,port_def + 0x3);
    p8b.out((sectorNum & 0x0000FF00) >> 8,port_def + 0x4);
    p8b.out((sectorNum & 0x00FF0000) >> 16,port_def + 0x5);
    p8b.out(0x30,port_def + 0x7); //WRITE COMMAND



 for(uint32_t i = start; i < count; i += 2)
    {
        uint16_t wdata = data[i];
        if(i+1 < count)
            wdata |= ((uint16_t)data[i+1]) << 8;
        p16b.out(wdata,port_def);

        char *text = "  \0";
        text[0] = (wdata >> 8) & 0xFF;
        text[1] = wdata & 0xFF;
 //       printf(text);
    }

    for(int i = count + (count%2); i < 512; i += 2)
        p16b.out(0x0000,port_def);


}

.. 我已经展示了 Minimal Code Possible 所以如果你想了解更多信息,请查看我的源代码(ata.c++ 用于 ata 代码):https ://github.com/amanuel2/OS_Mirror 。我正在尝试积极地找到这个错误,但我没有成功:(。任何提示或帮助将不胜感激!

4

0 回答 0