Cách tạo hình ảnh đĩa mềm và ghi đè MBR


3

Tôi đang cố gắng tạo một hình ảnh mềm với hệ thống tệp đang hoạt động để tôi có thể kiểm tra bộ tải khởi động 2 giai đoạn. Khi tôi cố gắn đĩa mềm và sau đó cpnhị phân thứ hai cho nó, mounttất cả đều không vui. Dưới đây là các bước tôi đang cố gắng sử dụng:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img
dd if=boot1.bin of=floppy.img bs=512 count=1
su -c 'mount -t msdos -o loop floppy.img /mnt'

dmesg | tail

[591461.669870] FAT: invalid media value (0x09)
[591461.669876] VFS: Can't find a valid FAT filesystem on dev loop0.

Câu trả lời:


3

Bạn đang tìm hiểu một số vấn đề khi sử dụng bộ công cụ POSIX cho loại công cụ này. Cài đặt chương trình bootstrap vào VBR của một ổ đĩa không phải là vấn đề chỉ cần đổ lỗi cho một khu vực chứa đầy dữ liệu vào khu vực # 0 từ một hình ảnh. Bạn phải bảo tồn Khối tham số BIOS hiện có , đối phó với một số biến thể BPB.

Các công cụ đi kèm với các hệ điều hành như MS / PC / DR-DOS, OS / 2 và Windows NT biết tất cả về những thứ như BPB. Khác nhau của họ sys, sysinstx, bootsectvà các công cụ khác biết làm thế nào điều có nghĩa vụ phải được xử lý. Nhưng nếu bạn sử dụng các công cụ POSIX như ddbạn phải tự nói với họ những byte nào sẽ ghi đè lên VBR và những gì cần giữ nguyên.

ms-syscũng biết cách bảo quản BPB, nhưng nó không có tùy chọn áp dụng chương trình bootstrap tùy chỉnh. Đi và yêu cầu nó như là một tính năng mới.


"Yêu cầu nó như một tính năng mới" - Tiện ích Solaris fdformat có tùy chọn cài đặt chương trình khởi động đĩa mềm tùy chỉnh.
mùn cưa

fdformatTiện ích Linux không có, và Linux là những gì người hỏi đang hỏi về. fdformatTiện ích Solaris được thay thế bởi rmformat, không có tùy chọn như vậy, vì chức năng định dạng cấp cao đã được chuyển sang mkfs_pcfs. mkfs_pcfsreserve=tùy chọn, quá.
JdeBP

2

Tôi thực sự đã viết một bộ tải khởi động mềm hai giai đoạn từ lâu. Bất chấp những thông số kỹ thuật khác nhau có thể nói (từ Microsoft hoặc các "chuyên gia" khác), khu vực đầu tiên của đĩa mềm phải tuân theo đĩa mềm MS-DOS tiêu chuẩn với Khối tham số BIOS, BPB. Thông báo lỗi mà bạn nhìn thấy dường như cho thấy "boot1.bin" của bạn không đáp ứng yêu cầu này. Điều duy nhất bạn thực sự có thể thay đổi trong khu vực khởi động đĩa mềm khoảng 400 byte mã. Bạn không thể tùy chỉnh các giá trị BPB từ những gì MS-DOS hoặc Windows sử dụng cho đĩa mềm.

Mặc dù có một giá trị để chỉ ra số lượng khu vực mà mã khởi động chiếm giữ, mọi BIOS và phần mềm khác mà tôi gặp chỉ mong đợi hoặc chấp nhận một khu vực dành riêng để khởi động. Cần có hai bản sao của FAT, và sau đó là khu vực đầu tiên của thư mục gốc. Phương pháp tôi đã sử dụng để lưu trữ bộ tải khởi động thứ cấp là phân bổ cứng một số khu vực theo thư mục gốc, sau đó đánh dấu các khu vực đó là "xấu" trong FAT. Điều này đã hoàn thành các mục tiêu sau:

  1. các khu vực bổ sung được sử dụng bởi trình tải thứ cấp nằm ở một vị trí cố định trên đĩa mềm và được biết đến với giai đoạn khởi động đầu tiên, phải đọc / tải chúng.

  2. ẩn bộ nạp thứ cấp từ người dùng.

  3. làm cho bộ tải thứ cấp không thể phục hồi.

  4. đĩa mềm có thể sử dụng được trong DOS và có thể gắn kết trong Unix.

Đĩa mềm BTW có một khu vực khởi động. Nó không được gọi là MBR, vì không có bảng phân vùng.


Bạn sẽ có một thời gian khó khăn khi chỉ ra nơi Microsoft, hoặc thực sự là một chuyên gia, đã nói rằng một BPB không được sử dụng trên đĩa mềm định dạng FAT. Không ai sẽ nói bất cứ điều gì như vậy. Và bạn đã bỏ lỡ một thập kỷ rưỡi hệ điều hành Microsoft từ DOS + Windows 95 OSR2 trở đi, dự trữ 32 cung cho mã bootstrap (và khối FSInfo). Quan niệm rằng các phần mềm không thích bất cứ thứ gì ngoài 1 khu vực dành riêng là vô nghĩa. Firmware không quan tâm một whit. Đối với "các phần mềm khác": Bạn nghĩ rằng -Rtùy chọn cho người hỏi mkfs.vfatlà gì?
JdeBP

Tôi không mong đợi bất kỳ ai ghi lại các phím tắt mà phần mềm khác đã sử dụng mà bỏ qua các giá trị trong BPB mềm mà tôi gặp phải. Sau khi thiết kế và triển khai trình tải đĩa mềm nhiều giai đoạn (đã được phát hành & sản xuất) sẽ hoạt động trên bất kỳ PC nào, tôi cung cấp trải nghiệm thực tế của mình, không phân tích từ việc đọc thông số kỹ thuật.
mùn cưa

Nhận xét của tôi dựa trên việc thực sự tùy chỉnh BPB, ví dụ như đặt trước 4 khu vực thay vì khu vực 1 tiêu chuẩn và thấy các tiện ích MS-DOS khác nhau hoàn toàn bỏ qua thông số không chuẩn của tôi (ví dụ thư mục gốc vẫn được đọc từ vị trí được mã hóa cứng). IIRC "Kinh thánh MS-DOS" đã đề cập rằng FAT thứ 2 không được sử dụng trên đĩa mềm; Tôi thấy rằng đó là sai. Tôi chưa bao giờ thấy một đĩa mềm với 32 cung cho bootstrap; có bạn không BPB cũng bao gồm "ổ đĩa logic" trong các phân vùng ổ cứng, cũng như đĩa mềm. Việc sử dụng bootstrap lớn chỉ có trên ổ cứng, không phải đĩa mềm.
mùn cưa

Tôi ghét phải chia sẻ điều này với bạn, nhưng "trải nghiệm trong thế giới thực" của bạn vượt trội hơn so với trải nghiệm trong thế giới thực của hàng triệu người đã vui vẻ khởi động DOS + Windows 95 OSR2 và các hệ điều hành sau này từ các khối FAT với 32 khu vực dành riêng. Nó cũng vượt trội so với tôi. Tôi thực sự có một đĩa khởi động mềm được định dạng FAT với 32 khu vực dành riêng trong một trong các máy của tôi ngay bây giờ. Những ý tưởng mà nó dành riêng cho đĩa cứng, hoặc các phần cứng quan tâm đến nó, chỉ đơn giản là sai lầm và cực kỳ sai lầm bởi những người đã sử dụng DOS + Windows 95 OSR2 trở lên.
JdeBP

Và ngừng lấy những gì "Kinh thánh MS-DOS" nói một cách dứt khoát về chủ đề này. Nếu đó là "Kinh thánh MS-DOS" mà tôi có, thì nó đã có từ trước khi Microsoft giới thiệu rộng rãi các khối lượng FAT với 32 lĩnh vực dành riêng trong khoảng 5 năm. Các công cụ duy nhất mà tôi gặp phải không thể xử lý các phân vùng FAT như vậy đã được thực hiện nhiều năm trước DOS + Windows 95 OSR2. Các công cụ hiện đại có thể đối phó, vì các công cụ cũ thực sự có thể được viết bởi những người đã chú ý đến sự tồn tại của lĩnh vực dành riêng của BPB ngay từ khi đi và không bao giờ gặp sự cố khi giá trị trường bắt đầu bằng 1.
JdeBP

1

Tôi muốn viết một câu trả lời khép kín cho điều này. Trước hết, trong Linux bắt đầu với hai hướng dẫn của bạn:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img

Điều này tạo ra một đĩa FAT12 tương thích với DOS4 / OS2 với khối tham số BIOS mở rộng như được mô tả tại Wikipedia "Thiết kế hệ thống tệp FAT"

3 byte đầu tiên "eb 3c 90" là ngôn ngữ máy cho : JMP 3E \ NOP, nghĩa là bỏ qua khối tham số BIOS và bắt đầu chạy mã ở byte bù 62 (thập phân) [3E = 3C + 2 (cơ sở 16) = 62 (cơ sở 10) ].

Từ offset 62, 378 byte tiếp theo là của bạn để viết bootstrap của bạn. Chương trình mặc định in, một tin nhắn, đợi một khóa và sau đó khởi động lại.

Tạo một tệp có tên myBoot.bin với chương trình nhị phân 378 byte x86.

Đó là chỉ 378 byte ... bạn CÓ THỂ làm điều này, nhưng nếu bạn thực sự cần một nơi bắt đầu, sử dụng lệnh:

 dd bs=1 count=378 of=myBoot.bin if=floppy.img skip=62 conv=notrunc

Cuối cùng, ghi đè MBR chứng khoán của đĩa mềm bằng chương trình myBoot.bin tùy chỉnh của bạn:

dd bs=1 count=378 if=myBoot.bin of=floppy.img seek=62 conv=notrunc

Bây giờ bạn đã tạo thành công một hình ảnh đĩa mềm và ghi đè lên chương trình khởi động mặc định.


Một số định dạng đĩa dành 6 byte bắt đầu ở offset 220 (DC hex) cho dấu thời gian tùy chọn hoặc chữ ký bộ tải OEM. Bạn có thể điều tra thêm tại Wikipedia "Bản ghi khởi động chính"
ABridgeTooFar

Tôi phải hét lên với Nick Blundell, tác giả của "Viết một hệ điều hành đơn giản - từ đầu" cho một cuộc thảo luận tuyệt vời có thể đưa người đọc từ chủ đề này đến một O / S "đầy đủ chức năng". Tôi cũng đề nghị độc giả tự làm quen với các thư viện phần mềm UEFI nhằm mục đích hiện đại hóa và bảo mật quá trình khởi động.
ABridgeTooFar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.