Linux 下IOport程式設計訪問

2021-09-06 21:43:56 字數 1471 閱讀 9204

曾經寫的一篇筆記,偶爾翻出來了,放在這裡做個紀念

這裡記錄的方法是在使用者態訪問io

port,不涉及驅動程式的編寫。

首先要包括標頭檔案 /usr/include/asm/io.h

在 unistd.h 

中宣告。用來開啟對

ioport的訪問許可權,要求程式執行時必須有

root 

許可權。僅僅能夠開啟

0x00

到0x3ff 

這一位址段的

ioport。

ioperm( from, num, turn_on)

比方:

#include#includeioperm( 0x300, 5, 1);

表示從0x300 

位址起的連續5個

io位址的訪問許可權被開啟。假設須要訪問比0x3ff

更高的位址段,須要用

iopl() 

函式。

iopl(3) 表示開啟對所有

ioport的訪問許可權。

inb(port);

inw(port);

outb(value, port);

outw(value, port);

對io埠的讀寫大約用時

1us。須要注意的是outb 函式與 turbo c 中的 outportb 函式的引數的順序是反的,不要搞錯。

inb_p(port);

inw_p(port);

outb_p(value, port);

outw_p(value, port);

這四個函式和上面四個函式的功能基本類似,可是在訪問完io

port後會新增乙個

1us左右的延時。假設定義了

really_slow_io

這個巨集,則延時約

4us。

#define really_slow_io 1

#includeinb_p(port);

第二種訪問io

埠的方法是通過對

/dev/port 

裝置檔案來訪問。

這樣的方法不須要有root 

許可權,僅僅有有對

/dev/port

的訪問許可權即可。

訪問起來就像普通的檔案訪問一樣, 先 lseek(), 

然後read()

、 write() 

函式。

可是不能使用 select() 

函式和 

poll() 

函式,由於

ioport不支援這些功能。

iopl(3) 開啟訪問許可權後能夠通過插入彙編語句的方式開關中斷。

asm(「cli」); //關中斷

asm(「sti」); //開中斷

linux裝置驅動 IO Port

1.i o port 和硬體打交道離不開i o port 老的isa 裝置經常是占用實際的 i o埠,在 linux 下,作業系統沒有對 i o口遮蔽,也就是說,任何驅動程式都可對任意的 i o口操作,這樣就很容易引起混亂。每個驅動程式應該自己避免誤用埠。有兩個重要的kernel 函式可以保證驅動程...

Linux下程式設計

windows下我的環境為 windows10 vs2015 opencv3.4.0 opencv3.4.0 contrib python linux下我的環境為 ubuntu16004 也有ubuntu1804 opencv3.4.0 opencv3.4.0 contrib python gnu ...

Linux下程式設計

linux用不慣的很大乙個原因是終端下編譯。主要是平時win下也不怎麼用終端。最近剛剛發現gedit可以新增外部工具,執行shell命令。這不就行了,我tm之前怎麼沒想到呢。從終端中狂按up down解脫了。然後win下notepad linux下gedit 基本一樣嘛。gedit工具 一鍵編譯執行...