這裡記錄的方法是在使用者態訪問io
埠,不涉及驅動程式的編寫。
首先要包含標頭檔案 /usr/include/asm/io.h
在 unistd.h
中宣告。用來開啟對
io埠的訪問許可權,要求程式執行時必須有
root
許可權。只可以開啟
0x00
到0x3ff
這一位址段的
io埠。
ioperm( from, num, turn_on)
比如:#include
#include
ioperm(
0x300, 5
, 1);
表示從0x300
位址起的連續5個
io位址的訪問許可權被開啟。
如果需要訪問比0x3ff
更高的位址段,需要用
iopl()
函式。
iopl(3)
表示開啟對全部
io埠的訪問許可權。
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
埠後會增加乙個
1us左右的延時。如果定義了
really_slow_io
這個巨集,則延時約
4us。
#define really_slow_io 1
#include
inb_p(port);
另外一種訪問io
埠的方法是通過對
/dev/port
裝置檔案來訪問。
這種方法不需要有root
許可權,只有有對
/dev/port
的訪問許可權就行。
訪問起來就像普通的檔案訪問一樣, 先
lseek(),
然後read()
、 write()
函式。
但是不能使用
select()
函式和
poll()
函式,因為
io埠不支援這些功能。
iopl(3)
開啟訪問許可權後可以通過插入彙編語句的方式開關中斷。
asm(「cli」);
//關中斷
asm(「sti」);
//開中斷
Linux 下IO埠程式設計訪問
1 linux下的io埠和io記憶體 2 io操作函式 以前寫的一篇筆記,偶爾翻出來了,放在這裡做個紀念 這裡記錄的方法是在使用者態訪問io 埠,不涉及驅動程式的編寫。首先要包含標頭檔案 usr include asm io.h 在 unistd.h 中宣告。用來開啟對 io埠的訪問許可權,要求程式...
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通過專...