Linux裝置驅動開發詳解globalmem

來源:互聯網
上載者:User

常見的兩種錯誤:
1.在插入模組的時候出現如下問題:

# insmod globalmem.ko insmod: error inserting 'globalmem.ko': -1 Device or resource busy 

ANSWER:主裝置號被佔用了,換另一個。
你把globalmem.c檔案裡面的宏定義那裡改為226或其他,然後再編譯就可以插入了!

特別注意:      如果換了主裝置號以後,下面接著建立節點的時候也要該,否則出現下面錯誤:

# mknod /dev/globalmem c 254 0    /*這裡的254跟已修改的主裝置號228不一致*/
# echo 'hello world' > /dev/globalmem
/bin/sh: can't create /dev/globalmem: No such device or address

解決辦法:

# rm /dev/globalmem 
# mknod /dev/globalmem c 226 0
# echo 'hello world' > /dev/globalmem 
written 12 bytes(s) from 0

      

2.載入和建立裝置節點都是成功的.但就是用cat命令查看時,雖然讀出了正確的字元,卻總是在最後還要加上一句提示"找不到裝置或地址".不知為何會多出這句來. 

# echo 'hello world!' > /dev/globalmem 
written 13 bytes(s) from 0
# cat /dev/
/dev/console    /dev/globalmem  /dev/null
# cat /dev/globalmem 
read 4096 bytes(s) from 0
hello world!
cat: read error: No such device or address

ANSWER:其實沒問題,
<1>你把globalmem_read函數中的if (p >= GLOBALMEM_SIZE)改為if (p > GLOBALMEM_SIZE)就好了。具體原因是一次調用cat會讀兩次,每次讀取4096個位元組,此時檔案讀指標ppos就是4096了,在第二次讀的時候,到if (p >= GLOBALMEM_SIZE)這裡條件為真,globalmem_read就返回ENXIO錯誤了,所以才會出現No such device or address"錯誤。不知道在宋老師的機子上為什麼就是正確的?
<2> 宋寶華
:返回錯誤值才是正確的,因為讀的位置已經越界,所以要返回錯誤。該返回錯誤的時候返回正確,那就是錯誤。改成if (p > GLOBALMEM_SIZE)是錯誤的。

<3> 根據上面兩點可以小結書上是沒有錯誤的。輸出的錯誤資訊是正常的debug資訊,千不該萬不該就是cat調用了read兩次。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.