二話不說,上來就問下那個man
name
mmap, munmap - map or unmap files or devices into memory
synopsis
#include
void
*mmap
(void
*addr, size_t length,
int prot,
int flags,
int fd, off_t offset)
;int
munmap
(void
*addr, size_t length)
;
mmap是用來對映乙個檔案或者裝置到記憶體,這個記憶體當然指虛擬位址。用途mmap是乙個標準系統呼叫------>sys_mmap2
介紹下引數
addr:傳入的虛擬位址,表示你想用的虛擬位址,可以為null,核心幫你挑乙個虛擬位址,如果傳入的虛擬位址衝突,核心會重新幫你選乙個。
length: 你想對映位址的長度
prot引數描述對映所需的記憶體保護(並且一定不能與檔案的開啟模式衝突),可乙個可組合,prot_exec,prot_read,prot_write,prot_none(page 不能被訪問)。
flag:更新是是否對對映同一塊區域的其他程序是否可見。引數較多,只介紹常用的2個
map_shared:共享這個對映更新時,其他程序可見,《注意》在呼叫msync(2)或munmap()之前,檔案實際上可能不會被更新。
munmap:
1.程序終止時該區域自動取消對映,close fd不會取消當前的對映
常用方法:
fd = open("/dev/mem", o_rdwr | o_sync);
addr = mmap(null, _size, prot_read | prot_write, map_shared, fd, phy_addr);
munmap(addr , phy_addr);
phy_addr就是你想要對映的實體地址。記得頁對齊
以share方式mmap,fsync(fd)以及msync都會立即更新到檔案中ctrl+c退出執行緒也會更新進檔案。這裡需要注意知識點
ummap,後系統不會吧資料同步進檔案 不會,不會
fsync(fd)以及msync或者ctrl+c執行緒退出才會更新到檔案
切記ummap不會寫進檔案可以手寫**然後斷電驗證,雖然man裡說的 「或munmap()之前,檔案實際上可能不會被更新「
msync用法
name
msync - synchronize a file with a memory map
synopsis
#include
intmsync
(void
*addr, size_t length,
int flags)
;
return value
on success, zero is returned. on error,
-
addr:申請的虛擬位址,必須頁對齊。有些時候我們對映外設的實體地址使用msync ms_sync有時候會報錯flags:ms_async /ms_sync(這倆互斥),ms_invalidate
ms_async:與核心快取記憶體同步後立即返回,快取記憶體以磁碟的同步在pdflush執行緒完成非同步同步
ms_sync:等到寫入磁碟完成後返回
ms_invalidate:試對映的快取資料無效,
msync -22 invalid argument,很有可能是sync中mem沒有fops導致的
沒有設定fsync檔案操作處理程式
if (!file->f_op->fsync)
return -einval;
這個時候我們採用另一種方式來解決快取問題
即開啟裝置檔案的時候採用無快取標誌,這樣就不需要同步了
fid= open("/dev/***", o_rdwr | o_sync);
fd = open("/dev/mem", o_rdwr | o_sync);
或者採用ms_async進行同步
Linux串列埠應用程式設計
常見的資料通訊的基本方式可分為並行通訊與序列通訊兩種。1.並行通訊是指利用多條資料傳輸線將乙個字資料的各位元位同時傳送。它的特點是傳輸速度快,適用於傳輸距離短且傳輸速度較高的通訊。2.序列通訊是指利用一條傳輸線將資料以位元位為單位順序傳送。特點是通訊 線路簡單,利用簡單的線纜就可實現通訊,降低成本,...
IAP 應用程式設計
1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...
串列埠應用程式設計
include include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include 檔案控制定義 include ppsix 終端控制定義 include 錯誤號定義 include include include...