先介紹下這個案例的背景:在一台機器上,執行了產品a,而後需要增加一些功能,但直接根據a來修改比較麻煩,單獨再做乙個產品b會更加快捷,也就是說,需要讓a和b執行於同一平台。產品a和產品b都包含各自的核心驅動模組,這裡分別以m(a)和m(b)指代。
在開發產品b的過程中,發現有時載入m(b)之後,通過"lsmod"命令看到的m(b)的引用計數為0,同時各種奇怪的現象開始出現,比如ssh登入不了啊,檢視"/proc/devices"會卡住啊。經過多次試驗,確定是在解除安裝m(a)之後,就會必然出現這個問題,但是單獨多次載入、解除安裝m(a)並不會有問題。
比較有用的資訊是syslog裡列印的一段back trace:
從call trace可以看到,這是一次open()的系統呼叫,現在m(b)對應的cdev已經註冊成功,在"/dev"目錄下也生成了裝置節點,可以推斷這個操作可能就是在open這個裝置,然後在呼叫try_module_get()進行引用計數加1的時候,由於pte的內容為0,即訪問的虛擬位址沒有對應的實體地址,就會觸發page fault(異常位址儲存在cr2中)。
由於page fault發生在核心態,且屬於不可修復的錯誤,因此將形成oops。核心oops之後可能還是可以繼續執行,但是會出現一些不可預知的結果(比如之前提到的那些現象)。
static int chrdev_open(struct inode *inode, struct file *filp)
struct kobject *kobj_lookup(struct kobj_map *domain, dev_t dev, int *index)
syslog可能引起得問題 引起脹氣的原因有哪些?
肚子裡有脹氣,在日常生活中,並不不少見。總是感覺肚子脹脹的,坐也不是,站也不是,就覺得很難受,偶爾發生,對生活和身體都沒什麼太大影響。若是經常發生脹氣,可不能大意,問題也許並不簡單,需要早點了解原因,也能趁早改善問題。到底引起脹氣的原因有哪些?下面就來好好帶你了解一下。引起脹氣的原因究竟是什麼?脹氣...
syslog可能引起得問題 教你如何看SYSLOG
td inetd c system log book 系統改變記錄記錄和經驗總結記錄等 如何做?top down 從日誌察看開始分析 bottom up 從底層硬體開始分析 divide and conquer 如果對具體應用熟悉,可以直接從相關的部分進行問題隔離和分割處理 4 做備份 make t...
乙個沒有索引引起的問題
這個案例說來也很簡單。話說我們公司舊版本的 mediation 系統每天都需要從各個 network element ne 的伺服器上採集 cdr,採集程式一般都是用 expect 寫的,其實就是 ftp到對方的機器上拷貝檔案過來。ne裡的 cdr一般不會輕易做 house keep ftp登入之後...