Re: [問題] 如何讀 partition table?

看板LinuxDev作者 (啦 )時間17年前 (2008/08/06 06:29), 編輯推噓2(204)
留言6則, 4人參與, 最新討論串3/3 (看更多)
※ 引述《phterry (小風)》之銘言: : ※ 引述《Xphenomenon (啦 )》之銘言: : : 請問一下,在 Linux 下我去 open() 某一個 device 之後, : : 已知這個 device 的某一個 partition 的系統的 file, : : 我要如何去讀取他的 partition table 呢? : : 是不是要下 ioctl() ? 麻煩各位大大 :> : 磁碟的最前面 512 bytes 叫做 Master Boot Record (簡稱 MBR), : 在這 512 bytes 的 MBR 裡, 前 446 個 bytes 是放 bootloader 的地方, : 而後面 66 bytes 則是放 Partition table. : 要讀取 Partition table 並不需要用到 ioctl, 只要用 seek() 和 read() : 就可以了. 不寫程式用 dd 的方式也可以讀寫你的 partition table. 我寫了以下的程式: #include <stdio.h> #include <stdlib.h> struct PARTITIONINFO { unsigned char bootable; /* bootable? 0=no, 128=yes */ unsigned char begin_head; /* beginning head number */ unsigned char begin_sector; /* beginning sector number */ unsigned char begin_cylinder; /* 10 bit nmbr, with high 2 bits put in begsect */ unsigned char partition_type; /* Operating System type indicator code (partition type) */ unsigned char end_head; /* ending head number */ unsigned char end_secttor; /* ending sector number */ unsigned char end_cylinder; /* also a 10 bit nmbr, with same high 2 bit trick */ long int relsect; /* first sector relative to start of disk */ long int numsect; /* number of sectors in partition */ }; struct MBR { unsigned char codes_area[446]; struct PARTITIONINFO partition[4]; short int mbrid; }; int main(void) { printf("%d", sizeof(struct MBR)); return 0; } 不知道為甚麼我的輸出是 516 而不是我所預期的 512,我去 printf("%d", sizeof(struct PARTITIONINFO)) 是 16 沒錯 而 short int 也是 2 bytes, 但是整個就是不對,麻煩大大為我解答一下,感謝 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.244.54.130 ※ 編輯: Xphenomenon 來自: 210.66.37.44 (08/06 14:29)

08/06 20:32, , 1F
struct PARTITIONINFO { ... } __attribute__ ((packed));
08/06 20:32, 1F

08/06 20:33, , 2F
應該是少加這個 我沒有驗證 你可以試看看
08/06 20:33, 2F

08/06 22:53, , 3F
應該是 strict MBR {...} __attribute__((packed));
08/06 22:53, 3F

08/06 22:54, , 4F
446變448 short int 變 int 剛好多4bytes
08/06 22:54, 4F

08/07 19:19, , 5F
struct alignment?
08/07 19:19, 5F

08/07 19:48, , 6F
感謝,可以了!
08/07 19:48, 6F
文章代碼(AID): #18cKJ9Ir (LinuxDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
1
完整討論串 (本文為第 3 之 3 篇):
1
1
0
2
文章代碼(AID): #18cKJ9Ir (LinuxDev)