C++ Write28 dosent始终写入硬盘/磁盘

C++ Write28 dosent始终写入硬盘/磁盘,c++,x86,hard-drive,osdev,ata,C++,X86,Hard Drive,Osdev,Ata,我的Write28()函数有问题,它以28位PIO模式写入ATA驱动程序(HDD驱动程序)。首先,你可以在我的内核中看到。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.Fi

我的Write28()函数有问题,它以28位PIO模式写入ATA驱动程序(HDD驱动程序)。首先,你可以在我的内核中看到。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(现在它的文件名默认为generatedFile),它也会写入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之前警告我返回一个指向局部变量的指针。。基本上返回(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);


}
void AdvancedTechnologyAttachment::Write28(uint8_t sectorNum,char*data,uint32_t start,uint32_t count)
{
如果(!(可接受))
{
printf(“失败:不可访问”);
返回;
}
//大于28的寻址
//检查前4位是否为0
如果(扇区数>0x0FFFFFFF)
{
printf(“ERR”);
返回;
}
如果(计数>512)
{
printf(“ERR”);
返回;
}
//确定什么
//你想与之交流的驱动器
//主人| |奴隶
如果(此->类型==主)
p8b.输出(0xE0 |((扇区和0x0F000000)>>24),端口定义+0x6);
其他的
p8b.输出(0xF0 |((扇区和0x0F000000)>>24),端口定义+0x6);
p8b.输出(0,端口定义+0x1);
p8b.输出(1,端口定义+0x2);
p8b.输出(扇区和0x000000FF,端口定义+0x3);
p8b.输出((扇区号和0x0000FF00)>>8,端口号_def+0x4);
p8b.输出((sectorNum&0x00FF0000)>>16,端口_def+0x5);
p8b.out(0x30,端口定义+0x7);//写入命令
对于(uint32_t i=start;i8)和0xFF;
text[1]=wdata&0xFF;
//printf(文本);
}
对于(int i=count+(计数%2);i<512;i+=2)
p16b.输出(0x0000,端口定义);
}

。。我已经显示了最小的代码可能,所以如果你想要更多的信息,请看我的源代码(ATA。C++的ATA代码):我正在积极地寻找这个bug,但我没有成功:(.任何提示或帮助都将不胜感激!

我很好奇,您是否曾经尝试使用我建议的GDB/QEMU调试设置说明来编辑我以前的答案(请参阅设置QEMU内核调试一节):。主动调试是否意味着您实际使用了实际的调试器来调试代码?我是在回答您问题中的最后一句话“非常感谢您的任何提示或帮助!”我给你一些提示。使用调试器。我给了你一个链接,指向一个显示如何设置DDD和/或GDB的答案。你问了一些提示,我给了你最好的提示。直到今天,你仍然拒绝接受使用调试器是很有用的,事实上它正是我在你的内核上为你调试它的工具。如果你学会了,我会告诉你t、 然后你可能可以自己解决大部分问题。实际上,我正在尽我所能帮助你,但可惜你忽视了这些建议。@MichaelPetch:几个月前,我在SO的asm聊天室与这个家伙有过类似的经历。他不断地问我问题,有一半的时间甚至不花时间去ca,就请求更多的解释重新阅读我的答案(或其中的链接),更不用说用它们作为跳板来搜索这些术语并了解更多。IIRC,他15岁了。我想他是在大约第十次人们叫他读东西而不是一直问坏问题后才开始阅读的。我希望一个学生能成功。他只需要认真地接受任何好的建议。@MichaelPetch好的。。是的,我会的我花了几天时间研究如何使用GDB之类的调试器。希望能解决这个问题。谢谢你给我提示并帮助我成功。我很好奇你是否曾尝试使用我建议的GDB/QEMU调试设置说明来编辑我以前的答案(请参阅使用内核设置QEMU调试一节):。主动调试是否意味着您实际使用了实际的调试器来调试代码?我是在回答您问题中的最后一句话“任何提示或帮助都将不胜感激!”我给你一些提示。使用调试器。我给了你一个链接,指向一个显示如何设置DDD和/或GDB的答案。你问了一些提示,我给了你最好的提示。直到今天,你仍然拒绝接受使用调试器是很有用的,事实上它正是我在你的内核上为你调试它的工具。如果你学会了,我会告诉你t、 然后你可能可以自己解决大部分问题。实际上,我正在尽我所能帮助你,但可惜你忽视了这些建议。@MichaelPetch:几个月前,我在SO的asm聊天室与这个家伙有过类似的经历。他不断地问我问题,有一半的时间甚至不花时间去ca,就请求更多的解释重新阅读我的答案(或其中的链接),更不用说用它们作为跳板来搜索这些术语并了解更多。IIRC,他15岁了。我想他是在大约第十次人们叫他读东西而不是一直问坏问题后才开始阅读的。我希望一个学生能成功。他只需要认真地接受任何好的建议。@MichaelPetch好的。。是的,我会的我花了几天时间研究如何使用GDB之类的调试器。希望能解决这个问题。谢谢你给我提示并帮助我成功。