當它不是出現在 /dev 中的設備時,Linux 如何查找/配置類似“wlan0”的東西?
(在樹莓派零 w,核心 4.14y 上)似乎無線適配器晶片不是 /dev fs 中的設備,而是“ifconfig”知道的東西的名稱。我知道這是來自 Berkley Sockets 的神器。
它是硬體,我認為必須在設備樹中提到它——以載入某些驅動程序,但它不能在 /dev (devfs) 中創建條目。
套接字在哪裡/如何找到這個不是設備的設備?
在 Linux 中,網路介面根本沒有設備節點
/dev
。如果您需要可用網路介面的列表,例如在腳本中,請查看
/sys/class/net/
目錄;您會看到每個界面有一個符號連結。將列出已載入驅動程序的每個網路介面。以程式方式,您可以使用
if_nameindex()
系統呼叫:請參閱 Stack Overflow 上的此答案。另外,請注意這
/dev
是設備文件系統。設備樹具有特定的不同含義:它是系統硬體組成的機器可讀描述。它用於沒有即插即用硬體匯流排的系統,或者俱有無法自動發現的硬體的系統。例如,像 Raspberry Pi 這樣的 ARM SoC 上的 Linux 使用設備樹。
RasPi 的啟動順序非常有趣:請參閱 RasPi.SE 上的這個問題。
簡而言之,在啟動時,在文件的控制下,GPU在主 ARM CPU 啟動之前
/boot/start.elf
載入相應的和 /boot/overlay/.dtbo 文件。/boot/*.dtb
該*.dtb
文件是二進制格式的編譯設備樹*。它描述了可以在每個特定 RasPi 模型上找到的硬體,並且是從設備樹源文件 (.dts`) 生成的,該文件只是文本,以特定方式格式化。核心的設備樹的實時映像可以在:/sys/firmware/devicetree/base Per Ciro Santilli中看到,它可以通過以下方式以 .dts 格式顯示:
sudo apt-get install device-tree-compiler dtc -I fs -O dts /sys/firmware/devicetree/base
您可以在此處找到設備樹文件格式的規範。該規範旨在獨立於作業系統。您可能還需要設備樹參考作為對某些細節的說明。
所以,你原來的問題的答案是這樣的:
- Berkeley Sockets API 從核心獲取網路介面
- 核心從設備樹文件中獲取必要的硬體資訊
- 設備樹文件由GPU
/boot/start.elf
根據配置載入/boot/config.txt
- 設備樹文件最初是根據每個 RasPi 模型的硬體規格創建的,並編譯為適當的二進制格式。
設備樹掃描程式碼最關心的是為每個硬體找到一個有效的驅動程序。它不會太在意每個設備的用途:這是驅動程序的工作。
驅動程序使用適當的
*_register_driver()
核心函式來記錄自己的存在,獲取設備樹資訊的適當部分以找到實際的硬體,然後使用其他函式將該硬體註冊為受其控制。一旦驅動程序初始化了硬體,它就會使用核心的register_netdev()
函式將自己註冊為一個新的網路介面,除此之外,它將生成 Sockets API(這只是核心的另一個介面,而不是一個獨立的實體)知道網路介面存在。驅動程序也可能為其他事情註冊自己:它會列出
ethtool
它支持的一些操作,用於鏈路狀態監控、流量統計和其他低級功能,無線網卡的驅動程序也將使用register_wiphy()
它來聲明自己為具有特定 Wi-Fi 功能的無線網路介面。Linux TCP/IP 棧有很多介面:Berkeley Sockets API 是應用程序員最熟悉的部分。netdev API 本質上是同一枚硬幣的另一面,面向驅動程序。