自制操作系统吧 关注:47贴子:138
  • 10回复贴,共1

求助帖,保护模式读写硬盘

只看楼主收藏回复

【求助】看了30天自制OS 还有自己动手写OS 然后发现了很多问题,比如64位的系统怎么做。。读写硬盘的问题已解决了一部分。


IP属地:江苏1楼2015-10-09 18:45回复
    我是第9人


    IP属地:江苏2楼2015-10-09 18:47
    回复
      搜集了一些资料要的留邮箱


      IP属地:江苏3楼2015-10-09 18:48
      回复
        1150970706@qq.com谢谢


        来自iPad4楼2016-01-16 21:04
        回复
          读写硬盘建议自行扫描pci信息,直接io端口的方式已死,还有64位系统可以看x86/x64体系结构探索及编程


          IP属地:北京5楼2016-01-31 22:32
          收起回复
            void hd_read(
            lba_t lba,
            size_t secs,
            void *buf)
            {
            size_t cyln = lba / (HD0_HEADS * HD0_SECTS);
            size_t mo_val = (lba % (HD0_HEADS * HD0_SECTS));
            size_t head = mo_val / HD0_SECTS;
            size_t sect = mo_val % HD0_SECTS + 1;
            //pdebug("Hello?");
            /*S_SHOW_VALUE(secs, d);
            S_SHOW_VALUE(cyln, d);
            S_SHOW_VALUE(head, d);
            S_SHOW_VALUE(sect, d);*/
            //S_SHOW_VALUE(io_inb_p(0x1F7), 02X);
            while ((io_inb_p(0x1F7) & 0xC0) != 0x40);
            io_outb_p(secs, 0x1F2);
            io_outb_p(sect, 0x1F3);
            io_outb_p(cyln, 0x1F4);
            io_outb_p(cyln >> 8, 0x1F5);
            io_outb_p(head | 0xA0, 0x1F6);
            io_outb_p(0x20, 0x1F7);
            while (!(io_inb_p(0x1F7) & 0x08));
            io_insl(0x1F0, buf, secs << 7);
            //io_insb(0x1F0, buf, secs << 9);
            //__asm__ ("cld;rep;insb" :: "d" (0x1F0), "S" (buf), "c"(secs << 9));
            /*u32 eip;
            __asm__ ("call .14;.14:popl %%eax" : "=a" (eip));
            S_SHOW_VALUE(eip, p);*/
            //__asm__ __volatile__ (".0:insb;loop .0" :: "d" (0x1F0), "D" (buf), "c" (secs << 9));
            }
            void hd_write(
            lba_t lba,
            size_t secs,
            void *buf)
            {
            size_t cyln = lba / (HD0_HEADS * HD0_SECTS);
            size_t mo_val = (lba % (HD0_HEADS * HD0_SECTS));
            size_t head = mo_val / HD0_SECTS;
            size_t sect = mo_val % HD0_SECTS + 1;
            printk(PRK_MESG "Writing %d sectors from %p to HD0 LBA = %d");
            //S_SHOW_VALUE(io_inb_p(0x1F7), 02X);
            //pdebug("Hello...!");
            /*S_SHOW_VALUE(secs, d);
            S_SHOW_VALUE(cyln, d);
            S_SHOW_VALUE(head, d);
            S_SHOW_VALUE(sect, d);*/
            while ((io_inb_p(0x1F7) & 0xC0) != 0x40);
            //pdebug("Hello!");
            io_outb_p(secs, 0x1F2);
            io_outb_p(sect, 0x1F3);
            io_outb_p(cyln, 0x1F4);
            io_outb_p(cyln << 8, 0x1F5);
            io_outb_p(head | 0xA0, 0x1F6);
            io_outb_p(0x30, 0x1F7);
            while (!io_inb_p(0x1F7) & 0x08);
            io_outsl(buf, 0x1F0, secs << 7);
            //io_outsb(buf, 0x1F0, secs << 9);
            /*u32 eip;
            __asm__ ("call .48;.48:popl %%eax" : "=a" (eip));
            S_SHOW_VALUE(eip, p);*/
            //__asm__ __volatile__ (".1:outsb;loop .1" :: "d" (0x1F0), "S" (buf), "c" (secs << 9));
            }


            IP属地:上海6楼2016-08-23 14:37
            收起回复
              BIOS不可用,欢迎使用LBA


              IP属地:福建7楼2020-06-14 11:32
              回复
                先转16位实模式再调用BIOS然后再转回来保护模式


                8楼2021-07-07 14:45
                回复