2009-08-30 41 views
7

Có ai biết sự khác biệt giữa mmap(2)mmap(3) là gì không? Phần Man 3 được mô tả là "Chương này mô tả tất cả các chức năng thư viện, ngoại trừ các hàm thư viện được mô tả trong chương 2, thực hiện các cuộc gọi hệ thống." Không mmap(3) thực hiện cuộc gọi hệ thống?mmap (2) vs mmap (3)

Đọc hai trang của người đàn ông, tôi thấy rằng mmap(2) dường như chấp nhận nhiều cờ hơn nhiều so với mmap(3) và tuyên bố có thể ánh xạ không gian I/O của thiết bị. mmap(3) tuyên bố để có thể ánh xạ "đối tượng bộ nhớ chia sẻ" và "đối tượng bộ nhớ đã nhập" trong phần bổ sung cho tệp nhưng không đề cập đến thiết bị I/O.

Vì hai chức năng có cùng tên, tôi thậm chí không chắc chắn làm thế nào tôi có thể chọn một thay vì khác.

Trả lời

18

mmap(3) được coi là POSIX function. Nó nên ở tất cả các tôn trọng cung cấp các ngữ nghĩa rất mà POSIX bắt buộc, ngay cả khi điều đó lệch từ những gì Linux không "nguyên bản". mmap(2) là cuộc gọi hệ thống và cung cấp tất cả chuông và còi mà Linus coi là quan trọng. Chức năng thư viện C, tất nhiên, được thực hiện bằng cách sử dụng cuộc gọi hệ thống.

Để gọi cuộc gọi hệ thống theo nghĩa đen (bỏ qua thư viện C), bạn có thể sử dụng <sys/syscall.h>.

Việc triển khai thực tế mmap (3) có thể được tìm thấy trong C library. Như bạn có thể thấy, nó thường chuyển điều khiển trực tiếp đến mmap (2), trừ khi, tại thời gian biên dịch (của glibc), mmap2 (2) được chọn là "back-end".

+0

Cảm ơn bạn, điều đó rất rõ ràng. Cảm ơn cũng cho con trỏ vào cây thư viện C. Mặc dù tôi làm một số lượng công bằng ở cấp độ nhân và trình điều khiển, tôi hiếm khi đột nhập vào không gian người dùng cho bất kỳ thứ gì ngoài tiện ích kiểm tra và tôi chưa xem xét nguồn glibc chút nào. Tôi có thể thấy tôi đã bỏ lỡ một cách tiếp cận rất hữu ích đối với một số vấn đề. – EQvan

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