碰巧解決


安裝 驅動的時候根據網上的資料 正常編譯後,insmdo 驅動,但是爆出如下的錯誤。

rt3070sta: Unknown symbol mcount
rt3070sta: Unknown symbol kmem_cache_alloc_notrace
rt3070sta: Unknown symbol __tracepoint_kmalloc
rt3070sta: Unknown symbol slab_buffer_size
insmod: can't insert 'rt3070sta.ko': unknown symbol in module or invalid paramet
er

改換驅動 rt5370sta;

rt3070sta: Unknown symbol mcount


這裏面不知的是什麼問題,是原先的驅動不對?

幾番折騰和百度google沒有理想的答案,最後就 重新嘗試最無奈的做法。 重新編譯驅動(時日已經很久了,我不知道是不是統一個驅動)。

不過,也就是因爲這個做法,竟然沒有上述加載的問題了。


另外還有一個,應用打開ov9650攝像頭是 顯示 ERROR opening V4L interface, 並且mjpeg-stream 停止,整個系統呈死機狀態。 約60s後彈出oops 信息。

原先自己使用的雖然和開發板提供的電源同電壓,但是電流稍落。  後更換至 開發板原配電壓,似乎問題出現的頻率就變小了。但是問題的根本原因在哪裏,也還是不曉得。

在qq上聊天時的記錄,可能排版會醜陋些



 11:13:08
mjpg_streamer: page allocation failure. order:10, mode:0xd1                     
[<c00457c0>] (unwind_backtrace+0x0/0xd4) from [<c008e270>] (__alloc_pages_intern
al+0x36c/0x384)                                                                 
[<c008e270>] (__alloc_pages_internal+0x36c/0x384) from [<c008e2a4>] (__get_free_
pages+0x1c/0x54)                                                                
[<c008e2a4>] (__get_free_pages+0x1c/0x54) from [<bf001540>] (camif_open+0x11c/0x
28c [camera])                                                                   
[<bf001540>] (camif_open+0x11c/0x28c [camera]) from [<c01fdf8c>] (misc_open+0x17
0/0x208)                                                                        
[<c01fdf8c>] (misc_open+0x170/0x208) from [<c00af92c>] (chrdev_open+0x120/0x178)
[<c00af92c>] (chrdev_open+0x120/0x178) from [<c00ab388>] (__dentry_open+0x14c/0x
260)                                                                            
[<c00ab388>] (__dentry_open+0x14c/0x260) from [<c00ac38c>] (nameidata_to_filp+0x
44/0x5c)                                                                        
[<c00ac38c>] (nameidata_to_filp+0x44/0x5c) from [<c00b77c0>] (do_filp_open+0x3a8
/0x730)                                                                         
[<c00b77c0>] (do_filp_open+0x3a8/0x730) from [<c00ab184>] (do_sys_open+0x5c/0xe8
)                                                                               
[<c00ab184>] (do_sys_open+0x5c/0xe8) from [<c003fd60>] (ret_fast_syscall+0x0/0x2
c)                                                                              
Mem-info:                                                                       
Normal per-cpu:                                                                 
CPU    0: hi:   18, btch:   3 usd:   0                                          
Active_anon:64 active_file:5 inactive_anon:99                                   
 inactive_file:2513 unevictable:1 dirty:0 writeback:0 unstable:0                
 free:6711 slab:1464 mapped:105 pagetables:17 bounce:0                          
Normal free:26844kB min:1016kB low:1268kB high:1524kB active_anon:256kB inactive
_anon:396kB active_file:20kB inactive_file:10052kB unevictable:4kB present:65024
kB pages_scanned:0 all_unreclaimable? no                                        
lowmem_reserve[]: 0 0                                                           
Normal: 77*4kB 35*8kB 41*16kB 102*32kB 95*64kB 19*128kB 8*256kB 5*512kB 3*1024kB
 3*2048kB 0*4096kB = 26844kB                                                    
2519 total pagecache pages                                                      
0 pages in swap cache                                                           
Swap cache stats: add 0, delete 0, find 0/0                                     
Free swap  = 0kB                                                                
Total swap = 0kB                                                                
16384 pages of RAM                                                              
9830 free pages                                                                 
1817 reserved pages                                                             
1464 slab pages                                                                 
108 pages shared                                                                
0 pages swap cached                                                             
ERROR opening V4L interface
誰能幫忙分析一下?
誰能幫忙分析一下?
  11:14:11
不知道什麼原因導致內存頁分配失敗。   mjpeg-stream 也有成功打開的時候,這個問題 好像是不定期出現的。
  11:14:30

  11:14:55
order:10 ?這麼大?
2^10個頁?
  11:16:16
估計夥伴系統提供不了這個階的內存
  11:16:38
一個頁 有多大?
總共64M的內存
  11:16:42
1024個連續的頁內存
  11:16:56
2048 byte 嗎?
一個頁
  11:17:15
一個頁是4K
關鍵在於1024個頁在物理上要連續
連續就不好辦了
  11:18:11
也就是申請了4M的內存空間,是把?
有什麼方法可以折衷一下?
  11:19:27
大小不重要,重要的是它要連續的內存
 11:20:34
你寫的是內核模塊嗎?必須要求物理上連續嗎?如果不是用vmalloc試試
 11:21:04
可是內存頁分配失敗了,然後就導致了 oops信息,導致整個 系統不行了。
主要這個應用不是我寫的。
mjpeg-stream  網絡視頻傳輸
是一個開源的項目
  11:21:54
開源就是讓你改的啊?源代碼都給你了,有問題,爲什麼不改?
  11:22:55
恩恩,那我就試着去改。
  11:23:59
估計這個錯是用kmalloc導致的
  11:28:59
恩,我先看下源碼
  11:29:45
oops已經告訴你在哪出錯了,別有恐懼心理,代碼都是人寫的。
改錯了再恢復回去就行了
  11:30:52
不想改源碼的主要原因還真是有恐懼心理,呵呵
不過這個應用,第一次不成功的時候,我又重新運行,也有成功的時候
  13:36:15
看你貼的信息實在分配連續4M內存的時候失敗了, 而且內存0*4096kB,說明系統確實已經沒有內存了,
但爲什麼沒有高端內存的信息?你用的是ARM嗎?內核版本那是多少?
  13:39:07
是arm  內核版本2.6.30.4
arm9
  13:40:55
一共才64M物理內存?
  13:41:18
都記得 內核編譯的時候 有kernel hack 的一些 debug選項,但是選項多。
對的,一個64M內存
一共
  13:41:37
錯誤就是內存不夠用
  13:42:08
大多數 廠家提供的 開發板 好像都是64M 的sdram
  13:42:28
剛纔得錯誤信息說明你係統的內存壓力已經達到了極限了,簡單說就是內存不夠,增加物理內存就行了
這個錯誤沒別的解決辦法,物理內存太少
  13:43:30
還一個辦法就是增加交換分區,但是你的物理內存實在太少,我不知道交換分區行不行啊,你可以試試看
  13:45:51
用 top 查看的時候, 內存的使用 %MEM那一欄  加起來 接近20% 左右。
  13:46:08
貼出來看看
  13:47:29
==

  13:48:42
wpa_supplicant 是無線 wifi 使用的
crond 是 定時ping 網關看連接是否成功
irq_test  是按鍵恢復一些默認配置
  13:49:40
怎麼沒有RES那一列?RES顯示的是物理內存
%MEM是物理內存嗎?
  13:50:15
我直接用 top 命令。  top 要帶其他什麼參數嗎?
我只看了字面意思,就以爲是物理內存了。
  13:50:41
默認應該有RES
  13:52:23
看文檔%MEM好像也是物理內存
  13:52:28
我看下有沒有其他辦法顯示出來
  13:53:35
你用的是busybox?
  13:53:42
對的
  13:53:52
怎麼用啊。。。
唉~一直沒搞懂。
  13:54:07
arm 上用的 不都是busybox 麼?
製作文件系統的時候 添加的。
  13:55:42
top -m試試
  13:56:30

  13:57:19
我覺得根源還是你的物理內存太小啊, 如果物理內存暫時不能增加, 只能加一個交換分區了。
wpa_supplicant是860K, bash是1.2M
  13:58:36
你自己算算總共多少內存了?你貼的不全啊
 13:58:39
30048 free, 只是不連續
  13:59:01
有沒有 整理內存的命令呢?
讓他們 不連續變成連續的
  13:59:16
free多沒用啊,全是小快內存, 他現在是在分配連續4M的時候失敗了
4M內存已經沒有了
不可能
  13:59:40
我是這個意思的
  13:59:40
沒有這樣的命令

  14:00:15
加內存,或者換成vmalloc
  14:00:42
好吧,我去看下 交換分區 相關的信息.  物理上加內存的可能性 不大.
  14:01:09
改一下夥伴算法,把4M的那個區的數量增加一些,
  14:01:17
swap爲0, 沒弄交換分區?
  14:02:18
恩,從來沒配置過。 都是廠家出廠的最原始配置。
  14:02:24
看着是
 14:02:31
何況 整個flash 大小 也只是256M
  14:03:21
cat /proc /   buddyinfo  輸出什麼?
  14:03:59

  14:04:05
弄上交換分區,可以換出一部分內存,不過,存在有4M連續內存的概率不大,因爲整個內存太小了
  14:04:29
不全啊,我要看最後的1列
  14:04:56

顯示的就這麼多
是不是 busybox 功能 就被 裁剪過 ?
  14:05:45
一共才3個4M的快, 你最多隻能成功3次啊,3次之後還是失敗啊
換行了吧
你的屏幕窄,換行了,
  14:06:51

恩,換行了。
  14:07:04
所以把,你就不能跑mjpeg_streamer這個程序, 這個程序太佔內存
  14:08:12
這個...不是我能決定的。
好吧,申請換128M的內存
  14:08:53
恩,這纔是正道啊,其他都是歪門邪道
  14:09:06
但是擔心 是不是 4M連續的還是 一樣 不多....
 14:09:49
這個得看內核夥伴系統那塊代碼怎麼寫的,應該不會這麼傻吧,
我看過但是現在不記得了哈
  14:10:22
先分小的,再分大的
小的分的多了,大的也不可能保留得住了
  14:11:13
等會啊,
  14:11:13
釋放時,也是儘量向大的匯合
  14:12:49
那現在有4個途徑,1個是修改mjpeg-stream(減小申請的空間),或者修改夥伴算法(內核),或者是增加交換空間,或者就是申請購買物理內存。
  14:13:01
有新發現, 我看崩潰時候的調用堆棧, 好像跑到攝像頭驅動哪裏去了吧?  你驅動寫的有問題啊,分配的內存太大了,把這塊內存變小點,也許可以解決你的問題。
稍微改改驅動,馬上就可以試啊
改mjpeg-stream沒用,他是用戶空間程序,
  14:14:03
恩,是有個open v4l interface error失敗的 提示
  14:14:50
這個驅動寫的太暴力了啊, 1次就分配4M內存,
把4M變小點,
 14:15:16
哦,那這麼說4M 內存空間 都是 攝像頭驅動 導致的了?
這個驅動也是 廠家給的,攝像頭本身爲130萬像素
 14:15:48
代碼在camif_open, 它調用了__get_free_pages
130像素需要多少內存?
怎麼算?
 14:16:48
你可以把這個問題反映給廠家,看他們怎麼說
我幫你改改哈:那現在有4個途徑,1個是修改攝像頭驅動(減小申請的空間),或者修改夥伴算法(內核),或者是增加交換空間,或者就是申請購買物理內存。
  14:18:12
哈哈,好的,謝謝了。
 14:18:35
等等
  14:18:56
至於130萬像素佔用空間怎麼算,這個 確實不是很明白。
還有?
  14:19:09
增加交換分區沒用了, 你的失敗在內核那裏,交換分區只能解決用戶空間的問題
那現在有4個途徑,1個是修改攝像頭驅動(減小申請的空間),或者修改夥伴算法(內核),或者就是申請購買物理內存。
只有這三條能起作用
  14:19:45
還有一個不是很清楚的地方是,內核空間和用戶空間 所使用的內存 能有多少?
  14:19:45
那現在有3個途徑,1個是修改攝像頭驅動(減小申請的空間),或者修改夥伴算法(內核),或者就是申請購買物理內存。
  14:19:49
規定了比例嗎?
開發板上是2片32M 內存拼起來的64M 內存。
  14:21:04
看內存區怎麼分的,arm的我不記得的了, 你看arm的代碼裏面zone_normal, zone_highmen怎麼分的?這兩個對應內核空間和用戶空間能用的內存

  14:22:17
zone_normal, zone_highmen裏面的內存就是通過所謂的夥伴系統管理的。
剛纔的失敗就是zone_normal裏面4M的內存塊沒有了
  14:22:57
夥伴系統?  我只隱約記得 有mm 還是 mmu
沒深入 看過。
  14:23:30
或者修改夥伴算法(內核) 這個選項可以否掉了
  14:23:33
mmu是硬件級的概念,對於軟件出了頁表基本可以忽略這個概念
 14:25:11
爲啥修改夥伴算法 選項可以否定掉?  沒理解
  14:25:10
修改夥伴系統 還是可以的,剛纔失敗的時候還剩下26M內存, 改改夥伴系統裏的4M塊讓它多一點還是可以的,
 14:25:41
那你說下,你想怎麼改?
 14:25:55
讓4M的快多一點啊
內核初始化的時候肯定就算好了4M塊的初始數量,改改讓他多一點肯定可以的,
  14:26:39
每分一塊內存就保留4M?很快內存就沒了
  14:28:28
而且多一點也不影響現有內核的夥伴算法, 因爲夥伴算法一開始就是兼容這種該法的,具體說就是4M的塊多了,其他的塊就少了,但這沒關係,其他的小塊可以從這4M的大塊裏分出小塊來
  14:30:36
哦,好吧,你試試吧
  14:32:35
哦,我會先修改攝像頭驅動的。  先捏軟柿子..
  14:32:49
不用試啊,算法一開始就是這樣寫的。
 14:33:49
也許4M是通過像素算出來的,不一定能改,不過你看一試試看。
 14:36:15
1024*1280*3
1024*1280 約等於130萬
  14:36:33
那估計不好改了
一個像素3個字節?
  14:36:49
3 就是 rbg 3個字節
  14:36:59
不好改啊,
  14:37:13
用不了130萬像素
他們給的驅動最後 給出的圖像時 320*240 de
  14:37:49
恩,改分辨率小點的。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章