2012-01-02 23 views
9

Tôi đang cố gắng để phát triển trình điều khiển thiết bị Linux và là nỗ lực đầu tiên của tôi, tôi đang cố gắng phát triển một trình điều khiển thiết bị char có các tùy chọn tập tin sau đây,Làm thế nào để tự động tạo một thiết bị trong/dev khi nạp mô-đun hạt nhân cho trình điều khiển thiết bị?

struct file_operations fops{ 
.open=open_fun, 
.release=release_fun, 
.write=write_fun, 
.read=read_fun, 
}; 

Khi tôi nạp trình điều khiển sử dụng insmod, tôi thấy rằng /proc/devices liệt kê các trình điều khiển theo thiết bị char nhưng tôi không thể tìm thấy nó trong /dev. Một tìm kiếm của Google đề xuất sử dụng mknod để tạo ra một deivce trong /dev và liên kết nó với trình điều khiển chính và nhỏ. Tuy nhiên, một nỗ lực để làm như vậy dẫn đến lỗi "Quyền bị từ chối" ngay cả khi được thực hiện với tư cách là người dùng siêu.

Tôi nên làm gì để làm cho thiết bị xuất hiện trong /dev khi mô-đun hạt nhân được tải? Tôi đã thử cả hai (register_chrdev) cũ hơn và phiên bản mới hơn (cdev_init & cdev_add) của việc đăng ký thiết bị nhưng không có thiết bị nào hoạt động.

Cảm ơn,
Mir

+1

Xem cũng: http://stackoverflow.com/questions/5970595/create-a-device-node-in-code/ – Eugene

+0

Sao chép có thể có của [Cách tạo nút thiết bị từ mã init \ _module của mô-đun hạt nhân Linux?] (https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module-code-of-a-linux-kernel-module) –

Trả lời

3

Tôi có thể xem các mục nhập trong vòng /dev sau khi tạo nút bằng cách chạy lệnh sau tại bảng điều khiển.

sudo mknod -m 0666/dev/msio c 22 0

Người dùng không phải là root, vì vậy tôi đã phải sử dụng sudo. Tên mục nhập của tôi là msio, một thiết bị ký tự có số lớn và nhỏ 22, 0 tương ứng.

Tôi sẽ cho bạn biết nếu điều này có thể đạt được theo chương trình.

+3

Có, có thể tạo một nút thiết bị lập trình. Bạn có thể sử dụng 'class_create()' và 'device_create' cho điều đó. Hệ thống Udev được đề cập bởi @duskwuff sẽ đảm nhiệm phần còn lại. – Eugene

+0

@Eugene Cảm ơn. Điều đó giúp ích rất nhiều. Cảm ơn tất cả mọi người khác. – Mir

1

CONFIG_DEVTMPFS khá tốt nếu bạn có thể sử dụng điều đó với bản phân phối của mình. Bạn có thể tự động khởi động hạt nhân cho bạn khi khởi động (CONFIG_DEVTMPFS_MOUNT) hoặc gắn nó theo cách thủ công (mount -t devtmpfs none/dev).

0

Trước tiên, bạn phải sử dụng: sudo mknod/dev/devicename c 81 0

Nó tạo ra tập tin thiết bị trong/dev nhưng bạn phải cung cấp cho nó đọc/ghi cho phép. để làm như vậy,

sudo chmod 777/dev/devicename

Xong !!!

2
  • Bao gồm các tập tin tiêu đề linux/device.hlinux/kdev_t.h

  • lớp cấu trúc tĩnh c_dev;

  • cấu trúc tĩnh dev_t dev;

Thêm dưới API của bên __init fuction của trình điều khiển

  • cl = class_create (THIS_MODULE, "x");

trong đó x - Tên được hiển thị bên trong/sys/class/khi trình điều khiển được tải.

  • Sử dụng device_create() api hạt nhân với device_create (cl, NULL, dev, NULL, "d");

nơi d - tập tin thiết bị được tạo trong/dev.

nơi dev có thể thay đổi đối với số thiết bị đầu tiên được khởi tạo trong việc sử dụng alloc_chrdev_region API để phân bổ động của số lượng lớn cho người lái xe

Để tham khảo thêm xin vui lòng đi qua các liên kết http://opensourceforu.com/2011/04/character-device-files-creation-operations/

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