linux mmap 匯流排錯誤

2021-06-27 11:42:06 字數 3413 閱讀 2261

用mmap對映兩個檔案,然後把乙個檔案的內容複製到另乙個檔案

採用的是memcpy函式

但是使用這個函式出現了匯流排錯誤

我把兩個對映的位址和長度都輸出來了

請高手給分析一下。

輸出結果:

file size = 18

src = 0xb7fa9000

dst = 0xb7fa8000

匯流排錯誤

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char *argv)

if((fdin = open(argv[1],o_rdonly)) == -1)

if((fdout = open(argv[2],o_rdwr | o_creat | o_trunc,0644)) == -1)

if(fstat(fdin,&statbuf) < 0)

printf("file size = %d\n",statbuf.st_size);

if(lseek(fdout,statbuf.st_size - 1,seek_set) == -1)

printf("file size = %d\n",statbuf.st_size);

if(lseek(fdout,statbuf.st_size - 1,seek_set) == -1)

if((src = mmap(0,statbuf.st_size,prot_read,map_shared,fdin,0)) == map_failed)

printf("src = 0x%x\n",src);

if((dst = mmap(0,statbuf.st_size,prot_read | prot_write,map_shared,fdout,0)) == map_failed)

printf("dst = 0x%x\n",dst);

memcpy(dst,src,statbuf.st_size);

close(fdin);

close(fdout);

exit(0);}

------------------------------------

#include

#include

#include

#include

<

string

.h>

#include

#include

#include

#include

int main(

int argc,

char

*argv)

if((fdin=

open

(argv[1]

,o_rdonly)

)<0)

/*開啟原檔案*/

perror

(argv[1]);

if((fdout=

open

(argv[2]

,o_rdwr|o_creat|o_trunc)

)<0)

/*建立並開啟目標檔案*/

perror

(argv[2]);

if(fstat(fdin,

&statbuf)

<0)

/*獲得檔案大小資訊*/

printf

("fstat error");

if(lseek(fdout,statbuf.st_size-1,

seek_set)=

=-1)

/*初始化輸出對映儲存區*/

printf

("lseek error");

if(write

(fdout,

"1",1)

!=1)

printf

("write error");

if((src=mmap(0,statbuf.st_size,prot_read,map_shared,fdin,0))=

=map_failed)

printf

("mmap error");

if((dst=mmap(0,statbuf.st_size,prot_read|prot_write,map_shared,fdout,0))=

=map_failed)

printf

("mmap error");

memcpy

(dst,src,statbuf.st_size)

;/*複製對映儲存區*/

munmap(src,statbuf.st_size)

;/*解除輸入對映*/

munmap(dst,statbuf.st_size)

;/*解除輸出對映*/

close

(fdin)

; close

(fdout)

; return 0;}[

/code]

lz的問題只是沒加紅色的哪條語句...

.如果加,當寫入資料的時候會遇到檔案結束符,產生sigbus訊號

用ftruncate函式可以代替lseek函式更好些

但是從lz輸出的的src和dst位址來看

它是頁對齊的

只是lseek函式使用不是很正確

在lseek之後加上一條i/o操作的話 就正確了

這個bus error 似乎在這裡面得不到很好體吧

不知道為什麼會報bus error錯誤

原帖由 eclipse_2 於 2009-4-6 20:19 發表

雖然是bus error

如果沒有是因為位址沒有對齊的話 memcpy應該會自己處理的

我除錯了下 好象是lseek函式用的有問題

你可以先檢視一下你新建立的那個檔案的大小是多少

stat filename

你也就是lseek了乙個 ...

雖然是bus error

如果沒有是因為位址沒有對齊的話 memcpy應該會自己處理的

我除錯了下 好象是lseek函式用的有問題

你可以先檢視一下你新建立的那個檔案的大小是多少

stat filename

你也就是lseek了乙個空洞 但是並引起i/o操作

也就是說如果lseek之後沒有發生i/o操作時,lseek只是把偏移量給改了一下

並沒有在磁碟上分配儲存區

而你的檔案是新建的 儲存的空間長度為0 lseek之後還是為0

把mmap到系統的線性位址空間,然後進行複製的話就會出錯

所以建議lz在lseek之後進行乙個i/o操作,這樣就會把lseek跳過的長度給你分配磁碟儲存區的

這樣的話應該就沒有問題了

我在我機器上試過了

sigbus

signal (  )

匯流排錯誤 Bus error

在編制一和執行乙個程式的時候,人們可能會遇到下面的資訊 bus error core dumped 當出現這種資訊的時候,則表示在sparc等risc型別的cpu中發生了 違反定位訪問 的情況.例如,讀者可以閱讀下面的程式.include include void main 在這段程式中,能夠確保2...

匯流排錯誤與段錯誤

在計算機領域,匯流排錯誤 bus error 是一種硬體故障,為通知作業系統乙個程序正嘗試訪問cpu無法訪問的實體地址,即乙個無效的位址匯流排位址,它由此得名。在posix相容平台上,匯流排錯誤通常導致傳送sigbus訊號到導致錯誤的程序。sigbus也可能因計算機檢測到的任何常規裝置故障引發。匯流...

linux mmap驅動實現

在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見 定義乙個裝置結構體 這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。在實現 remap mmap函式時,如下 注意函式開頭的vma vm pgoff u32 virt to phys leedriverp me...