Linux 下IO埠程式設計訪問

2021-07-11 12:21:19 字數 1723 閱讀 7384

1、linux下的io埠和io記憶體----

2、io操作函式----

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

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

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

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

在 unistd.h 

中宣告。用來開啟對

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

root 

許可權。只可以開啟

0x00

到0x3ff 

這一位址段的

io埠。

ioperm( from, num, turn_on)

比如:[python]view plain

copy

#include

#include

ioperm( 0x300, 5

, 1);  

表示從0x300 

位址起的連續5個

io位址的訪問許可權被開啟。

如果需要訪問比0x3ff

更高的位址段,需要用

iopl() 

函式。

iopl(3) 表示開啟對全部

io埠的訪問許可權。

[cpp]view plain

copy

inb(port);  

inw(port);  

outb(value, port);  

outw(value, port);  

對io埠的讀寫大約用時

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

[cpp]view plain

copy

inb_p(port);  

inw_p(port);  

outb_p(value, port);  

outw_p(value, port);  

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

埠後會增加乙個

1us左右的延時。如果定義了

really_slow_io

這個巨集,則延時約

4us。

[cpp]view plain

copy

#define really_slow_io 1

#include

inb_p(port);  

另外一種訪問io

埠的方法是通過對

/dev/port 

裝置檔案來訪問。

這種方法不需要有root 

許可權,只有有對

/dev/port

的訪問許可權就行。

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

然後read()

、 write() 

函式。

但是不能使用 select() 

函式和 

poll() 

函式,因為

io埠不支援這些功能。

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

[cpp]view plain

copy

asm(「cli」); 

//關中斷

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

Linux 下IO埠程式設計訪問

這裡記錄的方法是在使用者態訪問io 埠,不涉及驅動程式的編寫。首先要包含標頭檔案 usr include asm io.h 在 unistd.h 中宣告。用來開啟對 io埠的訪問許可權,要求程式執行時必須有 root 許可權。只可以開啟 0x00 到0x3ff 這一位址段的 io埠。ioperm f...

windows下訪問Linux的埠

經過實驗 只需要關閉防火牆或者開放埠號即可 在centos 7或rhel 7中防火牆由firewalld來管理,centos7以前的版本由iptables管理,我的是centos7,因此主要說這個。centos7以前的版本的關閉防火牆命令 chkconfig iptables off 永久 serv...

裝置I O 埠和I O 記憶體的訪問

幾乎每一種外設都是通過讀寫裝置上的暫存器來進行的,通常包括控制暫存器 狀態暫存器和資料暫存器三大類,外設的暫存器通常被連續地編址。根據cpu體系結構的不同,cpu對io埠的編址方式有兩種 典型地,如x86處理器為外設專門實現了乙個單獨的位址空間,稱為 i o位址空間 或者 i o埠空間 cpu通過專...