導航:首頁 > 器材知識 > 內核如何訪問設備

內核如何訪問設備

發布時間:2021-02-22 09:37:34

『壹』 如何通過 WinUSB 功能訪問 USB 設備

製造 USB 設備的獨立硬體供應商 (IHV) 必須經常為應用程序提供訪問設備功能的途徑。
在過去,這意味著使用 Windows 驅動程序模型 (WDM) 為設備實現一個功能驅動程序,
並將該驅動程序安裝在設備棧中系統提供的協議驅動程序之上。
Windows 驅動程序基礎 (WDF) 現在是 USB 驅動程序的首選模型。
它為 IHV 提供 3 個選項來提供訪問 USB 設備的途徑:
使用 WDF 用戶模式驅動程序框架 (UMDF) 實現用戶模式驅動程序。
使用 WDF 內核模式驅動程序框架 (KMDF) 實現內核模式驅動程序。
將 WinUsb.sys 作為設備的功能驅動程序安裝,
並提供一個使用 WinUSB API <WinUsb.dll> 訪問設備的應用程序。
WinUSB 在 Windows XP 上不支持 WinUSB 選擇性暫停
Windows 8 USB 驅動程序堆棧體系結構
該圖分別顯示了 USB 2.0 和 USB 3.0 的 USB 驅動程序堆棧。
當設備附加到 xHCI 控制器時,Windows 會載入 USB 3.0 驅動程序堆棧。
USB 3.0 堆棧是 Windows 8 中的新功能。
當設備連接到 eHCI、oHCI 或 uHCI 控制器時,Windows 會載入 USB 2.0 驅動程序堆棧。
USB 2.0 驅動程序堆棧隨 Windows XP Service Pack 1 (SP1) 及更高版本的 Windows 操作系統一起提供。

『貳』 內核怎麼通過主設備號找驅動,次設備號找設備

在Linux內核看來,主設備號標識設備對應的驅動程序,告訴Linux內核使用哪一個驅動程序為該設備(也就是/dev下的設備文件)服務;而次設備號則用來標識具體且唯一的某個設備。

『叄』 假設linux內核中有相應設備驅動程序,內核是怎麼識別它的

驅動程序屬於內核的一個部分。准確的說是內核的一個組件。不包含驅動回的內核也叫做內答核,並且這也是我們常說的內核。內核要乾的事情無非5件。 1,內存管理 2,虛擬文件系統 3,進程調度 4,網路介面 5,進程間通信 驅動更像是內核的擴展組件來幫助內核實現硬體的連接和操控。內核通過提供統一的驅動操作介面供用戶層使用,驅動就是在這層統一的介面下實現硬體的操控的中間層。

『肆』 windows怎麼進入內核模式

內核模式操作的一種高特權模式,其中的程序代碼能直接訪問所有內存(包括所有的用戶模式進程和應用程序的地址空間)和硬體。也稱為「管理員模式」、「保護模式」或「Ring 0」。 如果再細致地對此進行分類:它又可以被分為單內核模式和微內核模式兩種。單內核模式代碼結構緊湊、執行速度快,但是缺乏層次;微內核正好相反。單內核模式的代表如Linux;微內核模式的代表如Windows用戶模式與內核模式是如何交互的呢 當用戶模式程序需要讀取設備數據時,它就調用Win32 API函數,如ReadFile。Win32子系統模塊(如KERNEL32.DLL)通過調用平台相關的系統服務介面實現該API,而平台相關的系統服務將調用內核模式支持常式。在ReadFile調用中,調用首先到達系統DLL(NTDLL.DLL)中的一個入口點,NtReadFile函數。然後這個用戶模式的NtReadFile函數接著調用系統服務介面,最後由系統服務介面調用內核模式中的服務常式,該常式同樣名為NtReadFile。系統中還有許多與NtReadFile相似的服務常式,它們同樣運行在內核模式中,為應用程序請求提供服務,並以某種方式與設備交互。它們首先檢查傳遞給它們的參數以保護系統安全或防止用戶模式程序非法存取數據,然後創建一個稱為「I/O請求包(IRP)」的數據結構,並把這個數據結構送到某個驅動程序的入口點。在剛才的ReadFile調用中,NtReadFile將創建一個主功能代碼為IRP_MJ_READ(DDK頭文件中的一個常量)的IRP。實際的處理細節可能會有不同,但對於NtReadFile常式,可能的結果是,用戶模式調用者得到一個返回值,表明該IRP代表的操作還沒有完成。用戶模式程序也許會繼續其它工作然後等待操作完成,或者立即進入等待狀態。不論哪種方式,設備驅動程序對該IRP的處理都與應用程序無關。驅動程序完成一個I/O操作後,通過調用一個特殊的內核模式服務常式來完成該IRP。完成操作是處理IRP的最後動作,它使等待的應用程序恢復運行。

『伍』 linux內核怎麼訪問設備節點

設備節復點代表是每個機算機硬體,制那個軟體要用那個硬體,它就會打開那設備節點嘛。。。 /dev/ttyS0這個是串口0 也就是windows 裡面的com1 ,只有要用到串口0的程序才會打開這個設備節點。 個人愚見,僅供參考,望及時採納

『陸』 linux下,內核沒有編譯NOR Flash驅動,可以直接訪問設備嗎

不能訪問NOR FLASH設備啊,其他的有驅動當然可以,我每次都沒有編譯這個驅動的,搞嵌入式才需要

『柒』 在linux 內核中,系統怎樣知道設備功能的!!!

這是驅動需要做的事情,一個設備驅動模塊首先初始化的時候會將自己的一些硬版件功能權注冊給內核,比如probe(探測函數,就行一些基本檢查和寄存器配置),susbend(硬體被掛起時需要做什麼操作),resume(硬體恢復工作時要做什麼操作)。所謂注冊就是通過一個注冊函數,將這些函數指針放入一個內核可以觸及的結構體中,這樣內核就可以操作這些函數了。上面的屬於platform(平台)結構的函數。剩下的就是功能函數,由於設備不同,所以具體函數的功能肯定也是不同的。具體分字元設備,塊設備,網路設備。這些功能函數有一些成為API留給用戶調用,而有一些是只有驅動內部才能使用,用戶是觸及不到的。比如dma驅動,其中會有請求功能,增加任務,開始傳輸,傳輸中止等函數,如果其他的設備需要用到dma就調用這些函數介面就可以了,所以所謂的內核可以知道具體設備的具體功能,大多是指這些功能函數的介面可以直接被內核所調用,無論是靜態函數注冊還是直接寫成外部函數。

『捌』 無法打開內核設備

1.嘗試使用此命令:net start vmx86
2.查看下%systemroot%\system32\drivers\vmx86.sys 此文件是否存在?
3.如果以上兩個步驟出錯 嘗試從新安裝vmx86驅動內:步驟如下:首先容開一個CMD進入vmware安裝目錄使用 "vnetlib -- install vmx86"命令安裝vmx86驅動,然後重啟機器,在試一下。如果直接install有錯,可以先用"vnetlib -- uninstall vmx86"卸載vmx86然後在從新安裝注冊此驅動。

『玖』 在Linux系統中以什麼方式訪問設備

內核載入是以模塊形式,介面程序是以文件形式訪問

一樓的你用的定VPC虛擬機,VPC裝不了rf6,裝的時候沒有滑鼠,走不下去。還VBOX或VMWARE

『拾』 如何從內核模式設備驅動程序中打開文件以及如何讀取或寫入文件

對象名稱來引用文件
內核模式設備驅動程序引用到一個文件及其對象的名稱。此名稱是與該文件的完整路徑一起 /DosDevices。例如對於 C:/Windows/Example.txt 文件的對象名稱是 /DosDevices/C:/Windows/Example.txt。然後通過調用 InitializeObjectAttributes 函數的為 OBJECT_ATTRIBUTES 結構封裝為對象的名稱。
注意如果早期載入的設備驅動程序,不可能還存在 /DosDevices 命名空間。因此,/DosDevices 命名空間是設備驅動程序將無法訪問,因為沒有驅動器號公開的。僅可保證在文件系統的部分是 /SystemRoot 的命名空間。/SystemRoot 命名空間映射到操作系統安裝位置文件夾。例如對於此文件夾可能是 C:/Windows 或 D:/Winnt。
下面的代碼示例闡釋了如何通過其對象名稱來引用到一個文件
UNICODE_STRING uniName;
OBJECT_ATTRIBUTES objAttr;
RtlInitUnicodeString(&uniName, L"//DosDevices//C://WINDOWS//example.txt"); // or L"//SystemRoot//example.txt"
InitializeObjectAttributes(&objAttr, &uniName,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
NULL, NULL);
回到頂端
獲取文件句柄
若要獲取文件句柄,您可以將一個 OBJECT_ATTRIBUTES 結構傳遞給 ZwCreateFile 函數。可以 GENERIC_READ、 GENERIC_WRITE,或 GENERIC_ALL,設置 DesiredAccess 參數,具體取決於要執行的內容。如果將 CreateOptions 參數設置為 FILE_SYNCHRONOUS_IO_NONALERT 或 FILE_SYNCHRONOUS_IO_ALERT,文件系統跟蹤的當前文件位置偏移量。因此,您可以按順序讀取或寫入的文件更高版本。此外,您可以訪問隨機位置上的文件。
下面的代碼示例闡釋了如何獲取文件句柄
HANDLE handle;
NTSTATUS ntstatus;
IO_STATUS_BLOCK ioStatusBlock;
// Do not try to perform any file operations at higher IRQL levels.
// Instead, you may use a work item or a system worker thread to perform file operations.
if(KeGetCurrentIrql() != PASSIVE_LEVEL)
return STATUS_INVALID_DEVICE_STATE;
ntstatus = ZwCreateFile(&handle,
GENERIC_WRITE,
&objAttr, &ioStatusBlock, NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
回到頂端
讀取或寫入到文件
您現在可以調用 ZwReadFile 函數或 ZwWriteFile 函數。完成修改文件後,請使用 ZwClose 函數來關閉該句柄。
下面的代碼示例闡釋了如何向文件寫入
#define BUFFER_SIZE 30
CHAR buffer[BUFFER_SIZE];
size_t cb;
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test/r/n", 0x0);
if(NT_SUCCESS(ntstatus)) {
ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
if(NT_SUCCESS(ntstatus)) {
ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
buffer, cb, NULL, NULL);
}
}
ZwClose(handle);
}
下面的代碼示例闡釋了如何從文件中讀取
LARGE_INTEGER byteOffset;
ntstatus = ZwCreateFile(&handle,
GENERIC_READ,
&objAttr, &ioStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL, 0);
if(NT_SUCCESS(ntstatus)) {
byteOffset.LowPart = byteOffset.HighPart = 0;
ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock,
buffer, BUFFER_SIZE, &byteOffset, NULL);
if(NT_SUCCESS(ntstatus)) {
buffer[BUFFER_SIZE-1] = '/0';
DbgPrint("%s/n", buffer);
}
ZwClose(handle);
}

閱讀全文

與內核如何訪問設備相關的資料

熱點內容
steam令牌換設備了怎麼辦 瀏覽:246
新生測聽力儀器怎麼看結果 瀏覽:224
化學試驗排水集氣法的實驗裝置 瀏覽:156
家用水泵軸承位置漏水怎麼回事 瀏覽:131
羊水鏡設備多少錢一台 瀏覽:125
機械制圖里型鋼如何表示 瀏覽:19
測定空氣中氧氣含量實驗裝置如圖所示 瀏覽:718
超聲波換能器等級怎麼分 瀏覽:800
3萬軸承是什麼意思 瀏覽:110
鑫旺五金製品廠 瀏覽:861
蘇州四通閥製冷配件一般加多少 瀏覽:153
江北全套健身器材哪裡有 瀏覽:106
水表閥門不開怎麼辦 瀏覽:109
花冠儀表盤怎麼顯示時速 瀏覽:106
洗砂機多少錢一台18沃力機械 瀏覽:489
超聲波碎石用什麼材料 瀏覽:607
組裝實驗室製取二氧化碳的簡易裝置的方法 瀏覽:165
怎麼知道天然氣充不了閥門關閉 瀏覽:902
公司賣舊設備掛什麼科目 瀏覽:544
尚葉五金機電 瀏覽:59