Tại sao các giao diện mạng không ở / dev như các thiết bị khác?


70

Tôi chủ yếu tò mò, nhưng tại sao không có giao diện mạng trong / dev? Có loại thiết bị nào khác không được đại diện dưới dạng nút dưới / dev không?


2
Tôi đã thấy ít nhất một bài viết / bài ca về cách mọi thứ trong Unix không phải là một tập tin bất chấp câu thần chú và nó trích dẫn vấn đề này. Bây giờ tôi không thể tìm thấy nó, nhưng có lẽ đó là một bài viết về Kế hoạch 9 hoặc GNU Hurd.
Shawn J. Goff

3
Ít nhất là dưới Solaris, có các thiết bị giao diện mạng dưới / dev (/ thiết bị thực sự).
jlliagre

2
Mọi thứ trong Unix là một tệp không nhất thiết có nghĩa là nó hoạt động theo cách đó đối với toàn bộ người dùng, chỉ là các API bên dưới hoạt động hoàn toàn và thống nhất trên các mô tả tệp. Ví dụ, khi bạn mở một ổ cắm, bạn có thể sử dụng read()write()giống như cách bạn làm trên một tệp, nhưng các chức năng tiện ích recv()send()làm nhiều việc hơn cho bạn.
jgoldschrafe

1
Đó là một câu hỏi tôi đã tự hỏi mình trong nhiều năm. Cảm ơn đã hỏi và cho mọi người đã trả lời!
Dolanor 17/03/2016

Câu trả lời:


43

Trên nhiều thiết bị, các hoạt động chính là gửi byte từ máy tính đến thiết bị ngoại vi hoặc nhận byte từ thiết bị ngoại vi trên máy tính. Các thiết bị như vậy tương tự như đường ống và hoạt động tốt như các thiết bị nhân vật . Đối với các hoạt động không đọc và ghi (chẳng hạn như điều khiển luồng trên dòng nối tiếp), thiết bị cung cấp các lệnh đặc biệt gọi là ioctl .

Một số thiết bị rất giống với các tệp thông thường: chúng được tạo từ một số byte hữu hạn và những gì bạn viết ở một vị trí nhất định sau đó có thể được đọc từ cùng một vị trí. Các thiết bị này được gọi là thiết bị khối .

Giao diện mạng phức tạp hơn: những gì họ đọc và ghi không phải là byte mà là các gói. Mặc dù vẫn có thể sử dụng giao diện thông thường với readwrite, nhưng sẽ rất khó xử: có lẽ mỗi cuộc gọi writesẽ gửi một gói và mỗi cuộc gọi readsẽ nhận một gói (và nếu bộ đệm quá nhỏ để gói phù hợp, gói sẽ bị mất).

Giao diện mạng có thể tồn tại như các thiết bị chỉ cung cấp ioctl. Trong thực tế, đây là những gì một số biến thể unix làm, nhưng không phải Linux. Có một số lợi thế cho phương pháp này; ví dụ, trên Linux, giao diện mạng có thể tận dụng udev . Nhưng những lợi thế còn hạn chế, đó là lý do tại sao nó chưa được thực hiện.

Hầu hết các ứng dụng liên quan đến mạng không quan tâm đến các giao diện mạng riêng lẻ, chúng hoạt động ở mức cao hơn. Ví dụ: trình duyệt web muốn tạo kết nối TCP và máy chủ web muốn lắng nghe kết nối TCP. Với mục đích này, những gì sẽ hữu ích là các thiết bị cho các giao thức mạng cấp cao, ví dụ:

{ echo $'GET http://www.google.com/ HTTP/1.0\r';
  echo $'Host: www.google.com\r';
  echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80

Trong thực tế, ksh và bash cung cấp giao diện như vậy cho các máy khách TCP và UDP. Tuy nhiên, nói chung, các ứng dụng mạng phức tạp hơn các ứng dụng truy cập tệp. Trong khi hầu hết các trao đổi dữ liệu được thực hiện với các cuộc gọi tương tự readwrite, việc thiết lập kết nối đòi hỏi nhiều thông tin hơn chỉ là một tên tệp. Ví dụ, việc lắng nghe các kết nối TCP cần hai bước: một bước được thực hiện khi máy chủ bắt đầu nghe và một bước sẽ được thực hiện mỗi khi máy khách kết nối. Các bước bổ sung như vậy không phù hợp với API tệp, đó là lý do chính tại sao mạng có API riêng.

Một loại thiết bị khác thường không có mục /devtrên Linux (nhưng trên một số biến thể unix khác) là bộ điều hợp video. Về nguyên tắc, các bộ điều hợp video đơn giản có thể được hiển thị dưới dạng các thiết bị bộ đệm khung , có thể là các thiết bị khối được tạo thành từ các khối đại diện cho màu của từng pixel. Bộ điều hợp video được tăng tốc có thể được biểu diễn dưới dạng thiết bị ký tự mà ứng dụng gửi lệnh. Ở đây, nhược điểm của giao diện thiết bị là chậm: ứng dụng hiển thị (trong thực tế, máy chủ X) sẽ cần thực hiện các cuộc gọi kernel bất cứ khi nào hiển thị bất cứ điều gì. Điều xảy ra thay vào đó là máy chủ X chủ yếu ghi trực tiếp vào bộ nhớ của bộ điều hợp video, vì nó nhanh hơn.


2
Trên thực tế, các bộ điều hợp video được tăng tốc được xuất dưới dạng chardevs thông qua DRI trong Linux. Các thao tác I / O của tệp không cần thiết read/ writehoặc; bạn có thể sử dụng mmapcho các tệp được ánh xạ và truy cập trực tiếp vào bộ nhớ thiết bị.
minmaxavg

11

Bạn có thể tìm thấy nó trong /sys/class/netthư mục. Nó liên kết tượng trưng đến tập tin khác /sys/device/../../, sau đây là đầu ra máy ảo của tôi (linux kernel 3.10). Và bạn có thể sử dụng lệnh udevadm info <filename>để xem qua thuộc tính của nó

lrwxrwxrwx. 1 root root 0 Apr  3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33

Chào mừng bạn đến với U & L. Luôn sử dụng backquote xung quanh mã nội tuyến, đặc biệt nếu bạn sử dụng <>nếu không được hiểu là đánh dấu. (bạn cũng có thể muốn thay đổi tên của mình để bắt đầu với phiên âm ASCII, vì những người có bàn phím đơn giản sẽ gặp khó khăn khi nhập ký tự đầu tiên của tên bạn để phản hồi bất kỳ nhận xét nào bạn đưa ra)
Anthon

9

Cách thức thực hiện "Giao diện cấp độ vận chuyển" (TLI) của AT & T / Solaris có các tệp đặc biệt như "/ dev / tcp" hoặc "/ dev / udp". Lập trình viên mở tập tin đặc biệt đó để có được một ổ cắm của một họ giao thức thích hợp. Tôi nghĩ đó là lý do tại sao bạn phải có "-lnsl" khi biên dịch chương trình sử dụng ổ cắm trên Solaris: bên dưới tất cả là TLI.


4
Linux cũng có /dev/tcp/dev/udp, mặc dù hầu hết các hạt nhân đều bị vô hiệu hóa.
bahamat

3

Mặc dù theo truyền thống, Linux vẫn chưa hoàn toàn có thể kết hợp được, thậm chí hãy tuân theo bất kỳ loại tiêu chuẩn nào của Nhóm Mở (bên ngoài có thể là LSB). Đã có những nỗ lực chuyển nhiều chức năng UNIX hơn vào Linux.

Glendix là một trong những dự án như vậy cung cấp một cổng của hệ thống tập tin ảo / net từ Plan9, cho phép bạn thực hiện đúng như mô tả của mình.

Plan9 Cổng / hệ thống tập tin mạng sang linux

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.