導航:首頁 > 操作系統 > linux程序崩潰

linux程序崩潰

發布時間:2022-08-18 16:19:40

linux驅動中斷,程序運行幾個小時後系統崩潰

中斷與定時器:
中斷的概念:指CPU在執行過程中,出現某些突發事件急待處理,CPU暫停執行當前程序,轉去處理突發事件
,處理完後CPU又返回原程序被中斷的位置繼續執行
中斷的分類:內部中斷和外部中斷
內部中斷:中斷源來自CPU內部(軟體中斷指令、溢出、觸發錯誤等)
外部中斷:中斷源來自CPU外部,由外設提出請求

屏蔽中斷和不可屏蔽中斷:
可屏蔽中斷:可以通過屏蔽字被屏蔽,屏蔽後,該中斷不再得到響應
不可平布中斷:不能被屏蔽

向量中斷和非向量中斷:
向量中斷:CPU通常為不同的中斷分配不同的中斷號,當檢測到某中斷號的中斷到來後,就自動跳轉到與該中斷號對應的地址執行
非向量中斷:多個中斷共享一個入口地址。進入該入口地址後再通過軟體判斷中斷標志來識別具體哪個是中斷
也就是說向量中斷由軟體提供中斷服務程序入口地址,非向量中斷由軟體提供中斷入口地址

/*典型的非向量中斷首先會判斷中斷源,然後調用不同中斷源的中斷處理程序*/
irq_handler()
{
...
int int_src = read_int_status();/*讀硬體的中斷相關寄存器*/
switch(int_src){//判斷中斷標志
case DEV_A:
dev_a_handler();
break;
case DEV_B:
dev_b_handler();
break;
...
default:
break;
}
...
}

定時器中斷原理:
定時器在硬體上也以來中斷,PIT(可編程間隔定時器)接收一個時鍾輸入,
當時鍾脈沖到來時,將目前計數值增1並與已經設置的計數值比較,若相等,證明計數周期滿,產生定時器中斷,並
復位計數值。

如下圖所示:

Linux中斷處理程序架構:
Linux將中斷分為:頂半部(top half)和底半部(bottom half)
頂板部:完成盡可能少的比較緊急的功能,它往往只是簡單的讀取寄存器中的中斷狀態並清除中斷標志後就進行
「登記中斷」(也就是將底半部處理程序掛在到設備的底半部執行隊列中)的工作
特點:響應速度快

底半部:中斷處理的大部分工作都在底半部,它幾乎做了中斷處理程序的所有事情。
特點:處理相對來說不是非常緊急的事件

小知識:Linux中查看/proc/interrupts文件可以獲得系統中斷的統計信息。

如下圖所示:

第一列是中斷號 第二列是向CPU產生該中斷的次數

介紹完相關基礎概念後,讓我們一起來探討一下Linux中斷編程

Linux中斷編程:
1.申請和釋放中斷
申請中斷:
int request_irq(unsigned int irq,irq_handler_t handler,
unsigned long irqflags,const char *devname,void *dev_id)
參數介紹:irq是要申請的硬體中斷號
handler是向系統登記的中斷處理程序(頂半部),是一個回調函數,中斷發生時,系統調用它,將
dev_id參數傳遞給它
irqflags:是中斷處理的屬性,可以指定中斷的觸發方式和處理方式:
觸發方式:IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQF_TRIGGER_LOW
處理方式:IRQF_DISABLE表明中斷處理程序是快速處理程序,快速處理程序被調用時屏蔽所有中斷
IRQF_SHARED表示多個設備共享中斷,dev_id在中斷共享時會用到,一般設置為NULL

返回值:為0表示成功,返回-EINVAL表示中斷號無效,返回-EBUSY表示中斷已經被佔用,且不能共享
頂半部的handler的類型irq_handler_t定義為
typedef irqreturn_t (*irq_handler_t)(int,void*);
typedef int irqreturn_t;

2.釋放IRQ
有請求當然就有釋放了
void free_irq(unsigned int irq,void *dev_id);
參數定義與request_irq類似

3.使能和屏蔽中斷
void disable_irq(int irq);//等待目前中斷處理完成(最好別在頂板部使用,你懂得)
void disable_irq_nosync(int irq);//立即返回
void enable_irq(int irq);//

4.屏蔽本CPU內所有中斷:
#define local_irq_save(flags)...//禁止中斷並保存狀態
void local_irq_disable(void);//禁止中斷,不保存狀態

下面來分別介紹一下頂半部和底半部的實現機制

底半部機制:
簡介:底半部機制主要有tasklet、工作隊列和軟中斷
1.底半部是想方法之一tasklet
(1)我們需要定義tasklet機器處理器並將兩者關聯
例如:
void my_tasklet_func(unsigned long);/*定義一個處理函數*/
DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);
/*上述代碼定義了名為my_tasklet的tasklet並將其餘
my_tasklet_func()函數綁定,傳入的參數為data*/
(2)調度
tasklet_schele(&my_tasklet);
//使用此函數就能在是當的時候進行調度運行

tasklet使用模板:
/*定義tasklet和底半部函數並關聯*/
void xxx_do_tasklet(unsigned long);
DECLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0);

/*中斷處理底半部*/
void xxx_do_tasklet(unsigned long)
{
...
}

/*中斷處理頂半部*/
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
...
tasklet_schele(&xxx_tasklet);//調度地板部
...
}

/*設備驅動模塊載入函數*/
int __init xxx_init(void)
{
...
/*申請中斷*/
result = request_irq(xxx_irq,xxx_interrupt,
IRQF_DISABLED,"xxx",NULL);
...

return IRQ_HANDLED;
}

/*設備驅動模塊卸載函數*/
void __exit xxx_exit(void)
{
...
/*釋放中斷*/
free_irq(xxx_irq,xxx_interrupt);
...
}

2.底半部實現方法之二---工作隊列
使用方法和tasklet類似
相關操作:
struct work_struct my_wq;/*定義一個工作隊列*/
void my_wq_func(unsigned long);/*定義一個處理函數*/
通過INIT_WORK()可以初始化這個工作隊列並將工作隊列與處理函數綁定
INIT_WORK(&my_wq,(void (*)(void *))my_wq_func,NULL);
/*初始化工作隊列並將其與處理函數綁定*/
schele_work(&my_wq);/*調度工作隊列執行*/

/*工作隊列使用模板*/

/*定義工作隊列和關聯函數*/
struct work_struct(unsigned long);
void xxx_do_work(unsigned long);

/*中斷處理底半部*/
void xxx_do_work(unsigned long)
{
...
}

/*中斷處理頂半部*/
/*中斷處理頂半部*/
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
...
schele_work(&my_wq);//調度底半部
...
return IRQ_HANDLED;
}

/*設備驅動模塊載入函數*/
int xxx_init(void)
{
...
/*申請中斷*/
result = request_irq(xxx_irq,xxx_interrupt,
IRQF_DISABLED,"xxx",NULL);
...
/*初始化工作隊列*/
INIT_WORK(&my_wq,(void (*)(void *))xxx_do_work,NULL);
}

/*設備驅動模塊卸載函數*/
void xxx_exit(void)
{
...
/*釋放中斷*/
free_irq(xxx_irq,xxx_interrupt);
...
}

⑵ linux下程序崩潰,其中topo[]是指針數組,代表文件的每一行,line_num是文件總行數+1;

如果是相對路徑無論windows還是linux都是一樣的。 如果是絕對路徑,只需要看好配置文件所在linux的目錄,其他的操作和windows一樣(例如:linux【/usr/local/src/1.config】,windows【c:/1.config】) 使用File就可以直接讀取了。

⑶ Linux如何查看死機原因

查看linux系統日誌,步驟如下:

1、首先,連接相應linux主機,進入到linux命令行狀態下,等待輸入shell指令。

(3)linux程序崩潰擴展閱讀:

Linux死機的問題

1.先檢查硬體,查看伺服器狀態燈是否有報警。確保硬體沒有問題。

2.使用伺服器自帶的監測工具進行測試。

3.根據你的情況,我覺得可以重新安裝一下登錄管理器,或者整個GUI。

4.檢查一下伺服器性能負載情況,有時候機器不用時發現不了情況,很多時候都是高負載時才出現問題。

5.檢查系統日誌是否有異常。

6.檢查是否有可疑的進程。

7.檢查系統相關的配置文件。

⑷ 分析linux內核崩潰信息

分析kernel比較關鍵的就是看三點:
1) 內核會給出一個崩潰原因的猜測,這里是,CPU 0 Unable to handle kernel paging request at virtual address 00000000
2) 看pc指針的值,這里是epc == 00000000
3) 看調用棧Call Trace:[ //可惜後面沒給出來
通常是根據指針加上偏移值跟反匯編代碼對照,找到出問題的指令。
這個panic的原因比較明顯,應該是引用了空指針,試圖執行0x00000000出的代碼。

⑸ 求助:linux程序崩潰了,但不知道問題在哪裡

Linux程序崩潰,請查看對應的錯誤日誌信息進行問題排查,如linux系統的請查看/var/log/message日誌,如果是其它第三方程序的如tomcat,請到tomcat/logs路徑中查看錯誤信息。

⑹ Linux中如何使崩潰的程序在兩分鍾內自動連接

在Linux的shell終端中執行一個命令時是不能關掉終端的,否則程序也會終止。
但是有些耗時比較長的命令是無法保證一直開著終端的,費電就不說了,畢竟網路還有不穩定的時候,一掉線程序也關掉了。
解決方法是nohup命令,在程序的前面加上nohup,程序的後面加上&,這樣程序就會一直執行直到結束。
比如:nohup php spider.php &
回車,然後提示一堆東西,再次回車,回到shell界面。
這就可以了。
還有一個問題:程序在執行中會輸出一些信息,如果後台執行的話,這些信息是不是沒法看了?(比如:程序執行出錯終端,想看看報錯信息之類的)。使用了nohup命令後,會在當前目錄下生成一個nohup.out的日誌文件,記錄的就是命令的輸出。

⑺ linux程序崩潰自動重啟

1、如果發生重啟前下載應用程序軟體或運行程序軟體,則可能是程序軟體引起的重啟,將程序軟體卸載再重新安裝即可,如果故障依舊則說明系統有錯誤。

2、開機按F8進入安全模式後再退出,再進入正常模式。也可用系統自帶的系統還原功能進行還原,如果重啟故障排除,則是系統文件受損造成的重啟。

3、檢查主板,主板老化、電容失效或爆漿、主板與機箱背板發生短路等均可引發重啟,可將主板從機箱取出檢查或測試,接著檢查CPU風扇散熱片的底部硅膠是否變干,如果變干則將CPU風扇上的硅膠清理干凈,然後重新塗上好的硅膠即可。接著檢查CPU的風扇轉動,及CPU的溫度是否正常。

⑻ 如果在linux中遇到down機你怎麼處理(比如資料庫崩潰,後台程序崩潰)

這樣看怎麼個崩潰了,如只是應用崩潰,那需要盡快查清楚原因,恢復數據和應用程序這些東西。
如果是系統崩潰估計只有先重啟,然後在啟動資料庫和應用啥的,看看是否受損,如有受損盡快查找原因,進行恢復操作。
如果是硬體級別的崩潰就比較慘了,只要存儲還健全,那還能通過手段恢復數據啥的,如果是存儲異常,就杯具了,基本上所有的東西都差不多該重裝了。

閱讀全文

與linux程序崩潰相關的資料

熱點內容
香港老公出軌電影 瀏覽:462
黑社會後生可畏國語 瀏覽:137
韓國肉肉電影在線觀看 瀏覽:345
中文版韓國倫理電影 瀏覽:397
皇上叫秦風女主是宮女的小說 瀏覽:912
可以看得網址 瀏覽:162
公主的奴 瀏覽:115
邵氏電影700部資源 瀏覽:778
秋瓷炫恐怖電影 瀏覽:873
美國的網站可在線觀看 瀏覽:5
13部金三角販毒電影 瀏覽:932
男子為追女交警故意違規電影台灣 瀏覽:679
四個字帶玩家的電影 瀏覽:42
十三排電影院坐第幾排 瀏覽:122
尼故福利院 瀏覽:602
哪有好看的電影網站 瀏覽:774
紅顏薄命女斗小說 瀏覽:940
法國電影戀愛love2012電影完整版 瀏覽:459
在線影視 不卡 瀏覽:168