2011-10-26 24 views
6

Để gán cho trường đại học, chúng tôi phải sửa đổi hệ thống tệp ext2 để lưu trữ tệp trong con trỏ khối của inode nếu nó nhỏ hơn 60 byte và chuyển sang lưu trữ khối thông thường sau khi tệp lớn hơn .Viết bộ nhớ hạt nhân cho khối ext2

Tôi đã sao chép mã ext2 từ nguồn hạt nhân Linux 2.6 (theo hướng dẫn) và đi từ đó.

Khi tệp lớn hơn 60 byte, tôi cần phải sao chép mọi dữ liệu hiện đang nằm trong mảng con trỏ khối của inode vào khối thực. Vì vậy, tôi cần phải viết bộ nhớ hạt nhân vào khối ext2. Một cuộc gọi đơn giản tới do_sync_write sẽ không hoạt động ở đây vì nó mất bộ nhớ không gian người dùng.

Tôi đã xem xét triển khai do_sync_write và tôi không thực sự chắc chắn cách sao chép những gì nó làm, nhưng với bộ nhớ hạt nhân thay thế.

Đây là thực hiện hiện tại của tôi về phần cụ thể này (không hoạt động):

ssize_t extmod_write(struct file *filp, const char *buf, 
      size_t len, loff_t *ppos) 
{ 
... 
printk(KERN_INFO "Switching to regular file"); 
temp = kmalloc(inode->i_size, GFP_KERNEL); 
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size); 

/* Need to clear the block pointers before they are allocated by kernel */ 
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data)); 

if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) { 
    printk(KERN_INFO "DAMN! Writing current buffer failed"); 
    return -EINVAL; 
} 
kfree(temp); 
return do_sync_write(filp, buf, len, ppos); 

Edit:

Tôi nhìn symlink. Về cơ bản, ext2 có khái niệm "các liên kết nhanh"; tức là tên liên kết dài dưới 60 byte. Nếu đó là một liên kết tượng trưng nhanh, dữ liệu sẽ được lưu trữ trong các con trỏ khối. Điều này là dễ dàng để làm và tôi đã thực hiện điều này cho các tập tin thường xuyên. Nếu liên kết không phải là liên kết tượng trưng nhanh, dữ liệu sẽ được xử lý giống như các tệp thông thường. Tôi nghĩ tôi trở lại hình vuông.

+2

Gợi ý: hãy xem các liên kết tượng trưng. IIRC chúng được lưu trữ trong inode quá, cho kích thước đủ nhỏ. – wildplasser

+0

Vâng, tôi có thể nhìn thấy nơi họ chỉ 'memcpy' tên liên kết đến' EXT2_I (inode) -> i_data'. Vấn đề của tôi là nếu bạn muốn sao chép dữ liệu đó vào một khối. Cách thức chung mà mô-đun ext2 thực hiện mong đợi dữ liệu người dùng. – Anthony

+0

Tôi không làm bài tập về nhà hoặc đọc sách của bạn, chỉ cho bạn gợi ý. Hãy xem mã symlink thực hiện khi tải trọng phát triển quá lớn để vừa với inode. Rõ ràng là một khối đĩa phải được phân bổ và các con trỏ khối inode cần phải được khởi tạo để trỏ đến nó. Không đề cập đến các bitmap (không biết nếu ext2 có chúng) – wildplasser

Trả lời

0

Tôi đã cố gắng tìm ra. Nó yêu cầu nhận được struct buffer_head trường hợp và đọc/ghi dữ liệu trong đó. Bằng cách lặp qua các số lô lôgic và sử dụng để ext2_get_block để truy xuất các khối (phân bổ chúng nếu cần) và sau đó sử dụng sb_getblk để lấy bộ đệm thực ra và ghi vào nó. Tôi đã đăng triển khai trên my blog.

1

Bài tập về nhà câm.

Mã không hoạt động. Hãy thử mmap() và chết.

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