2010-08-19 37 views
16

Tôi muốn truy cập toàn bộ đĩa cứng trực tiếp từ chương trình C. Không có FS trên đó và sẽ không bao giờ là một.Linux: Truy cập trực tiếp đĩa cứng (không có FS) từ chương trình C

Tôi chỉ muốn mở/dev/sda (ví dụ) và làm I/O ở cấp khối/ngành của đĩa.

Tôi đang lên kế hoạch viết một số chương trình học lập trình C trong môi trường Linux (Tôi biết ngôn ngữ C, Python, Perl và Java) nhưng thiếu tự tin với môi trường Linux.

Vì mục đích học tập của mình, tôi đang nghĩ về cách chơi với kyoto-cabinet và lưu giá trị tương ứng với băm được tính trực tiếp vào một "khối/sector" của đĩa cứng, ghi cặp: "hash, block/sector tham chiếu "vào tệp cơ sở dữ liệu băm kyoto-cabinet.

Tôi không biết nếu điều này là khả thi sử dụng CI chức năng tiêu chuẩn/O hoặc nếu không tôi sẽ phải viết một "thiết bị điều khiển" hoặc một cái gì đó giống như ...

Trả lời

7

Như tập tin thiết bị cho các ổ đĩa (ví dụ /dev/sda) là các thiết bị khối, điều này có nghĩa là bạn có thể mở, tìm và sử dụng tệp gần giống như một tệp bình thường.

18

Như đã đề cập ở nơi khác, trong hệ thống * NIX, có thể truy cập các thiết bị khối như /dev/sda dưới dạng tệp thuần. Lưu ý rằng nếu hệ thống tệp được gắn kết từ thiết bị, việc mở tệp đó dưới dạng tệp để ghi sẽ không thành công.

Nếu bạn muốn chơi với các thiết bị chặn, tôi khuyên bạn nên sử dụng lần đầu tiên loop device, trình bày tệp đơn giản dưới dạng thiết bị chặn. Ví dụ:

dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K 
losetup /dev/loop0 $PWD/loop_file_10MB 

Sau đó, /dev/loop0 sẽ hành xử như thể nó là một thiết bị khối, nhưng tất cả thông tin bằng văn bản sẽ được lưu trữ trong tập tin.

+0

Cảm ơn tất cả vì câu trả lời nhanh. Tôi sẽ thử lần đầu tiên với thiết bị vòng lặp. –

+3

+1 để sử dụng thiết bị vòng lặp để kiểm tra. – MarkR

5

Có, như những người khác đã lưu ý, bạn chỉ cần mở thiết bị chặn.

Tuy nhiên, đó là một ý tưởng thực sự tốt để làm IO (viết anyway) trên ranh giới khối và toàn bộ khối. Bạn có thể sử dụng một cái gì đó như pread() và pwrite() để làm các IO, hoặc mmap một số hoặc tất cả các thiết bị.

Có một loạt các ioctls có thể được sử dụng, xem "man sd" để biết thêm thông tin. Họ dường như không được ghi chép ở cùng một nơi.

Trong linux/fs.h BLKROSET và một loạt các ioctls khác được xác định, bạn phải nhìn xung quanh để tìm hiểu cách sử dụng chúng. Bạn có thể làm những việc hữu ích như tìm hiểu thiết bị lớn như thế nào và kích thước khối là gì.

Mã nguồn của gói util-linux-ng là bạn của bạn, nó chứa các ví dụ.

+0

Rất cám ơn @MarkR. Tôi sẽ xem xét điều này, nhưng gần như là một newbie trong lập trình Linux, có lẽ quá khó để bắt đầu với ... –

+0

Lập trình Linux gần như chính xác như lập trình Windows, vì vậy nó không phải là vấn đề ... bạn tra cứu API, viết chương trình thử nghiệm để dùng thử, sau đó sử dụng nó trong ứng dụng của bạn. Cũng giống như Windows. – MarkR

Các vấn đề liên quan