Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
1,31 MB
Nội dung
Block Device Driver The Linux Kernel NỘI DUNG TRÌNH BÀY: 1.Tổng quan 2.Đăng ký block I/O device 3.Đăng ký ổ đĩa – Register a disk 4.Cấu trúc ‘‘Struct gendisk’’ 5.Cấu trúc ‘‘Struct block_device_operations’’ 6.Yêu cầu hàng đợi 7.Yêu cầu block device 8.Cấu trúc ‘‘Struct bio” 9.Demo Mục tiêu học: 01 Thu thập kiến 02 Thực hành sử 03 Có kỹ thức hoạt dụng cấu trúc để sử động hệ hàm dụng API cho Basic Knowledge 01 1.1 OVER VIEW Block device 2.2 Tổng quan Kiến thức Đặc điểm Block device, hệ thống Block I/O,… TỔNG QUAN: Kiến thức Device driver chương trình phần mềm nằm tầng kernel, nhiệm vụ nhận thị từ user space TỔNG QUAN: Kiến thức Có loại device hệ thống Linux + Character Devices (Byteoriented: RS232, PS/2, VGA, I2C, SPI, Keyboard, ) + Block Devices (Blockoriented: IDE, SCSI, MTD, …) TỔNG QUAN: Block device - Các Block Device đặc trưng khả truy cập ngẫu nhiên vào liệu tổ chức block có kích thước cố định Ví dụ thiết bị ổ cứng, ổ CD-ROM, đĩa RAM, v.v - BlockDevice phải di chuyển đến vị trí thiết bị để cung cấp quyền truy cập ngẫu nhiên vào liệu Để đơn giản hóa cơng việc với Block Device, Linux kernel cung Register a 02 block I/O device Đăng ký Block I/O device Đăng ký block I/O device: #include • Để đăng ký block I / O device, hàm register_blkdev() sử dụng #define MY_BLOCK_MAJOR 240 #define MY_BLKDEV_NAME "mybdev" static int my_block_init(void) • Để hủy đăng ký block I / O { device, hàm unregister_blkdev() int status; sử dụng status = register_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME); if (status < 0) { printk(KERN_ERR "unable to register mybdev block device\n"); return -EBUSY; } // } static void my_block_exit(void) { // unregister_blkdev(MY_BLOCK_MAJOR, MY_BLKDEV_NAME); } 03 Register a disk Đăng ký ổ đĩa “ Drivers cho block device sử dụng hàng đợi để lưu trữ yêu cầu block I / O xử lý Một hàng đợi yêu cầu đại diện cấu trúc struct request_queue Hàng đợi yêu cầu tạo thành từ danh sách yêu cầu liên kết kép kiểm sốt thơng tin liên quan chúng Các yêu cầu thêm vào hàng đợi mã kernel cấp cao (ví dụ: tệp hệ thống) Miễn hàng đợi yêu cầu không trống, driver liên kết hàng đợi phải truy xuất yêu cầu từ hàng đợi chuyển đến block device liên kết Mỗi mục hàng đợi yêu cầu yêu cầu đại diện cấu trúc struct request ” Request queues: Tạo xóa yêu cầu hàng đợi Hàng đợi yêu cầu tạo hàm blk_init_queue() bị xóa hàm blk_cleanup_queue() (Xem v í dụ việc sử dụng hàm này) Các chức hữu ích để xử lý yêu cầu hàng đợi Các chức sử dụng để xử lý yêu cầu từ hàng đợi u cầu mơ tả đây: • • blk_peek_request()- truy xuất tham chiếu đến yêu cầu từ hàng đợi; yêu cầu tương ứng phải bắt đầu sử dụng blk_start_request(); blk_start_request()- trích xuất yêu cầu từ hàng đợi bắt đầu để xử lý; nói chung, hàm nhận dạng tham chiếu trỏ đến yêu cầu trả blk_peek_request(); • • blk_fetch_request()- lấy yêu cầu từ hàng đợi (sử dụng blk_peek_request()) bắt đầu (sử dụng blk_start_request()); blk_requeue_request() - để nhập lại hàng đợi Trước gọi hàm trên, phải có spinlock liên quan đến hàng đợi Nếu hàm gọi từ hàm kiểu request_fn_proc, spinlock giữ Create a request 1.1 07 Tạo yêu cầu 2.2 Finish a request 2.3 Process a request Requests for block devices Hoàn thành yêu cầu Yêu cầu block device Xử lý yêu cầu “ Yêu cầu thiết bị khối mô tả theo cấu trúc struct request Các lĩnh vực struct request cấu trúc bao gồm: cmd_flags: loạt cờ bao gồm hướng (đọc ghi); để tìm hướng, định nghĩa macro rq_data_dir sử dụng, trả cho yêu cầu đọc cho yêu cầu ghi thiết bị; sector: khu vực yêu cầu chuyển giao; khu vực thiết bị có kích thước khác, cần thực chuyển đổi thích hợp Để truy cập trường này, sử dụng blk_rq_pos macro; data_len: tổng số byte chuyển; để truy cập trường này, blk_rq_bytes macro sử dụng; nói chung, liệu từ struct bio chuyển giao; kích thước liệu lấy macro blk_rq_cur_bytes; bio, danh sách động cấu trúc struct bio tập hợp đệm liên kết với yêu cầu; trường truy cập cách định nghĩa macro rq_for_each_segment có nhiều vùng đệm bio_data trường hợp có vùng đệm liên kết; ” Requests for block devices: Tạo yêu cầu - Yêu cầu đọc / ghi tạo lớp mã cao hệ thống I / O kernel - Hệ thống I / O hoạt động giao diện hệ thống Hoàn thành yêu cầu quản lý điều tệp block device driver hoạt động thuộc trách Khi trình khiển hoàn tất việc chuyển tất sector uCác cầu to/from thiết bị, phải thơngchính báo cho hệ thống I / O cách gọi hàm blk_end_request() Nếu khóa liên kết với hàng đợi yêu cầu mua, hàm blk_end_request() sử dụng Nếu trình điều khiển đóng u cầu tất các sector liên quan, có vào thể gọi hàm blk_end_request_all() nhiệm hệmuốn thống I / Okhơng chuyển thêm u cầu hàng đợi blk_end_request_all() Các hàm blk_end_request_all() gọi khóa liên quan đến hàng đợi yêu cầu mua lại block device cụ thể xếp hợp yêu cầu theo cân nhắc hiệu suất Requests for block devices: Xử lý yêu cầu - Phần trung tâm trình điều khiển thiết bị khối loại hàm request_fn_proc Hàm liên kết với driver hàm blk_init_queue() - Hàm gọi kernel cho driver nên xử lý yêu cầu I / O Hàm phải bắt đầu xử lý yêu cầu từ hàng đợi, khơng bắt buộc phải hồn thành chúng, u cầu hồn thành phần khác driver Tạo cấu trúc struct bio 08 struct bio structure Cấu trúc Gửi cấu trúc struct bio Chờ hoàn thành cấu trúc struct bio Khởi tạo cấu trúc struct bio Cách sử dụng nội dung cấu trúc struct bio struct bio Giải phóng cấu trúc struct bio Thiết lập yêu cầu hàng đợi Một cấu trúc struct request thực dạng danh sách liên kết struct bio với thông tin cho phép driver giữ ngun vị trí “ xử lý yêu cầu Các cấu trúc struct bio mô tả mức độ thấp I / O block yêu cầu: struct bio { // struct gendisk *bi_disk; unsigned int bi_opf; /* bottom bits req flags, top bits REQ_OP Use accessors */ // struct bio_vec *bi_io_vec; /* the actual vec list */ // struct bvec_iter bi_iter; / void *bi_private; // }; Cấu trúc struct bio chứa bi_io_vec vector cấu trúc struct bio_vec Nó bao gồm trang riêng lẻ nhớ vật lý chuyển, độ lệch trang kích thước đệm Để lặp qua cấu trúc struct bio, cần lặp qua vectơ struct bio_vec chuyển liệu từ trang vật lý Để đơn giản hóa việc lặp vectơ, cấu trúc struct bvec_iter sử dụng Cấu trúc trì thơng tin số lượng đệm cung sử dụng trình lặp lại ” Struct bio structure: Tạo cấu trúc struct bio Hai hàm sử dụng để tạo cấu trúc struct bio: • bio_alloc(): phân bổ không gian cho cấu trúc mới; cấu trúc phải khởi tạo; • bio_clone(): tạo cấu trúc struct bio có ; cấu Gửi cấu trúc struct bio trúc khởi tạo với trịnhậncủa trường cấu Để gửi cấu trúc structthu bio tới I / O device driver liên kết, hàm submit_bio() sửgiá dụng Hàm dạng đối số cấu trúc struct bio khởi tạo thêm vào yêu cầu từ hàng đợi yêu cầu I / O device Từ hàng đợi đó, xử lý I / O device driver trúc nhân bản; đệm chia sẻ với cấu trúc struct bio chức chuyên biệt nhân việc truy cập vào đệm phải thực cẩn thận để tránh truy cập vào vùng nhớ từ hai sao; ... hóa cơng việc với Block Device, Linux kernel cung Register a 02 block I/O device Đăng ký Block I/O device Đăng ký block I/O device: #include • Để đăng ký block I / O device, hàm register_blkdev()... loại device hệ thống Linux + Character Devices (Byteoriented: RS232, PS/2, VGA, I2C, SPI, Keyboard, ) + Block Devices (Blockoriented: IDE, SCSI, MTD, …) TỔNG QUAN: Block device - Các Block Device. .. Struct block_ device_ operations structure: Cũng character device, hoạt động struct file_operations phải hoàn thành, block device, hoạt động struct block_ device_ operations phải struct block_ device_ operations