flip close Oops問題排查

2021-06-21 23:05:39 字數 2989 閱讀 3567

1、問題描述

oops[#1]:

cpu 0

$ 0   : 00000000 00000001 64206e6f 838ceae0

$ 4   : 838ceae0 83816140 00000001 00000007

$ 8   : 0000080f 00000004 00000020 83934668

$12   : 82fdb128 ffffffff 00000001 823c39b0

$16   : 00000000 838ceae0 83816140 00000010

$20   : 83816148 00000001 011a0000 00000017

$24   : 00000000 80011558                  

$28   : 83b3a000 83b3bd90 06c00000 8006c314

hi    : 00000000

lo    : 00000001

epc   : 64206e6f 0x64206e6f

tainted: p          

ra    : 8006c314filp_close+0x5c/0x90

status: 1100ff03    kernel exl ie 

cause : 00800008

badva : 64206e6e

prid  : 0001974c (mips 74kc)

modules linked in: ar9344_watchdog ath_pktlog(p) umac ath_dev(p) ath_dfs(p) ath_rate_atheros(p) ath_hal(p) asf(p) adf ar9344_button ar9344_led athrs_gmac [last unloaded: ar9344_watchdog]

process agent (pid: 209, threadinfo=83b3a000, task=838b8dc0, tls=00000000)

stack : 83446a10 834540d4 ffffff9c 00000000 83816140 00000007 00000000 8002596c

0000000f 838b8dc0 83b3bea0 82abfe40 0000000f 838b8dc0 83b3bea0 82abfe40

83b04da4 800270d8 00000008 00000007 00000008 838b9164 838b9164 83b3bea0

0000000f 83b04e64 83b3bea0 82abfe40 83b04da4 83b3bf30 011a0000 00000017

06c00000 80027544 83b3bf30 838b9164 83b3bea0 82abfe40 00000009 800305e0

...call trace:

[<8002596c>] put_files_struct+0xa4/0x128

[<800270d8>] do_exit+0x178/0x568

[<80027544>] do_group_exit+0x7c/0xa8

[<800305e0>] get_signal_to_deliver+0x328/0x3c8

[<8006c90c>] nameidata_to_filp+0x3c/0x60

[<800088f0>] do_notify_resume+0x60/0x2bc

[<8006c528>] do_sys_open+0xc8/0xec

[<800642f0>] sys_brk+0x11c/0x140

[<80006188>] work_notifysig+0xc/0x14

[<800f27b0>] __bzero+0xd4/0x164

[<8006c554>] sys_open+0x0/0x1c

code: (bad address in epc)

c/rc.d/rc.bridgefatal exception: panic in 5 seconds

2、環境描述

程序2: 程序1的子程序,由程序1 呼叫system函式生成。(注: system函式呼叫了fork函式和execl函式)

程序1: 程序2的父程序 

驅動1:該驅動為字元裝置驅動,程序1通過open函式開啟其提供的字元裝置檔案(/dev/test)

3、問題分析

執行過程: 父程序退出(killall 命令強制退出)後,解除安裝驅動1(通常開啟的檔案沒有釋放的話, 無法解除安裝驅動; 但由於當前驅動1在struct file_operations 中並沒有初始化ower=this_module,故可成功解除安裝驅動),並重新啟動,此時出現上述的oops現象。

問題分析: 由於子程序共享檔案描述符,在父程序退出時並沒有真正的關閉open函式開啟的struct file檔案(killall 父程序,僅僅將struct file對應的引用計數(f_count)減1,只有當其為0時,才會呼叫驅動release函式並釋放開啟的檔案),

系統重新啟動時,系統將關閉該檔案,但此時驅動已經被解除安裝。

4、解決方案

在程序1中新增如下**,其實質就是設定fd的屬性,當呼叫exec族函式時,關閉子程序中的對應的檔案描述符。

int fd=open("foo.txt",o_rdonly);

int flags = fcntl(fd, f_getfd);

flags |= fd_cloexec;

fcntl(fd, f_setfd, flags);

具體分析見部落格"

使用fd_cloexec實現close-on-exec,關閉子程序無用檔案描述符"

這樣設定之後,killall 父程序,將直接呼叫驅動中的release函式並釋放父程序開啟的strcut file檔案。

P問題,NP問題,NPC問題,NP hard問題

1.p問題 乙個問題能找到乙個在多項式時間裡解決他的演算法 2.np問題 在多項式時間找不到問題的解,但可在多項式時間驗證問題的解 所有p問題都是np問題 3.npc問題 存在乙個np問題,所有其他np問題都可以約化為它 是乙個np問題 所有np問題都可約化為它 一元二次方程可以約化一元一次方程 一...

問題 I n皇后問題

在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。設計乙個解n 後問題的佇列式分支限界法,計算在n n個方格上放置彼此不受攻擊的n個皇...

問題的問題

有些問題是人出的,或者人造成的 而有些問題是 上帝 出的。我們可以說成是人題和天題。人題一般都是可以解決的,而天題,人根本就找不到答案。人題的解決不會給我們帶來快樂,而天題帶給我們的只是苦惱和困惑。人從出生到死亡,一直都處於迷失和困惑中,因為大部分的東西他都不知道是怎麼回事。是的,他可以不知道,同樣...