安裝 驅動的時候根據網上的資料 正常編譯後,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
恩,改分辨率小點的。