xv6の勉強をしていて、xv6.imgとか、fs.imgとかがロードできたほうが良いなと思ったので、その機能を追加しておいた。
どうやら、単純にimgファイルは中身を読み取ってそれを転送していくだけで良いみたいだ。 ただし、今はテスト段階のため、512バイト(xv6で言う1ブロック)を転送するのみにした。
uint32_t EnvBase::LoadImage (std::string filename) { uint8_t buf[512]; // open binary int fs_img = open (filename.c_str(), O_RDONLY, S_IREAD); if (fs_img < 0) { perror (filename.c_str()); exit (EXIT_FAILURE); } // Read head 512byte of image file if (read (fs_img, buf, 512) != 512){ perror ("read"); exit (EXIT_FAILURE); } fprintf (g_debug_fp, "<Load Image %s>\n", filename.c_str()); for (int byte = 0; byte < 512; byte++) { StoreMemoryDebug (byte, buf[byte], Size_Byte); if (g_img_dump == true) { if ((byte % 16) == 0) { fprintf (stdout, "%08x : ", byte); } fprintf (stdout, "%02x ", buf[byte]); if ((byte % 16) == 15) { fprintf (stdout, "\n"); } } } return 0; }
--imgfileオプションでロードできる。--img_dumpオプションで、ロードしたイメージの内容をダンプする。
swimmer_mips --debug --imgfile xv6.img --out debug.log --debug_func --debug_gvar --max 1000000 --img_dump