做網(wǎng)站按什么收費(fèi)企業(yè)網(wǎng)站模板源碼
單片機(jī)、裸機(jī)、linux操控硬件方法
在單片機(jī)和裸機(jī)中操作硬件是通過指針來對(duì)寄存器賦值來進(jìn)行操控?
但對(duì)于linux中不能這樣,不能直接對(duì)物理地址直接修改,因?yàn)閘inux使能了mmu,所以不能直接菜操作物理地址
如果要操作硬件,需要先把物理地址轉(zhuǎn)換成虛擬地址
使能mmu的好處
- 讓虛擬地址成了可能
- 可以讓系統(tǒng)更加安全,上層應(yīng)用看到的都是虛擬內(nèi)存,不能直接訪問硬件
物理地址到虛擬地址映射函數(shù)
內(nèi)核提供了幾個(gè)函數(shù),定義在源碼根目錄中的include/asm-generic/io.h
ioremap:物理地址轉(zhuǎn)為虛擬地址
iounmap:把映射的地址釋放掉
static inline void _iomem *ioremap(phys_addr_t offset,size_t size)
static inline void _iomem *ioremap(void _iomem *addr)
參數(shù)
- phys_addr_t offset:是映射物理地址的起始位置
- size_t size:要映射多大的內(nèi)存空間
- void _iomem *addr:要取消映射的虛擬地址的首地址
返回值
- ioremap:成功返回虛擬地址的首地址,失敗返回null
注意
- 物理地址只能被映射一次,多次映射會(huì)失敗
查看被映射過的物理地址
輸入命令:cat /proc/iomem
如果要取消某個(gè)映射就需要找到對(duì)應(yīng)的驅(qū)動(dòng)取消
?