常見的兩種錯誤:
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兩次。