導航:首頁 > 編程系統 > linux38軟中斷

linux38軟中斷

發布時間:2023-09-06 07:15:53

linux中軟中斷(softirq)為什麼不能嵌套

硬中斷能嵌套來........................嗯..........這個說法自很奇怪................
根據我的理解是硬中斷能被硬中斷搶斷.................不知道你所謂的嵌套何指.
軟中斷都在下半部處理.處理時間即長.涉及資源又多.在這里需要同步的地方非常多.難度也比較高..........軟中斷如果沒記錯的話.是不能被同種類型搶斷.可以被非同類型搶斷.因為同類型多涉及相同資源.如果被同類搶斷的話.上一個佔有的資源未釋放.這一個又一直得不到資源.就會一直被阻塞.造成系統進退不得.所以才禁止同類搶斷.
不過在不同下半部解決方案設計中.限制也不一樣.具體可以自行了解.

不知道你說的可以嵌套指的是什麼東西..................

㈡ Linux中斷 異常 系統調用 中斷上半部 中斷下半部 這些有什麼區別和聯系

中斷分軟中斷跟硬中斷,硬中斷是由硬體從外部觸發,軟中斷由軟體觸發,就像linux系統調用int 80一樣。至於中斷的上下部其實就是因為中斷的處理時間跟它的優先順序不一定成正比,所以一般先處理中斷最重要的部分(上半部),待到不怎麼忙的時候,再來處理比較悠閑的部分(下半部)。就像輸入的時候,拿到鍵盤輸入的是什麼才是最重要的(上半部),顯示字元才是次要的(下半部)。

㈢ LINUX軟中斷通信

我驗證下阿...一不小心就fork多了..
剛開始我把kill的參數弄反了,信號和pid位置弄錯了,調了半個小時,很郁悶..

你只是忽略了一點...,我也給忽略了。。。後來才想起來

你按下ctrl+C的時候,另外兩個fork出來的進程,他們也會接到SIGINT。。。就退出了。。所以你要先在子進程裡面忽略這個SIGINT信號,用signal(SIGINT,SIG_IGN)就OK了....
程序如下...

有解釋,你可以自己看看...

#include"stdio.h"
#include"unistd.h"
#include"signal.h"
#include"sys/types.h"
#include"stdlib.h"

int k=0;
pid_t child1=0,child2=0;

void func_main(int sig);
void func_child1(int sig);
void func_child2(int sig);

int main()
{
while((child1=fork())==-1);
if(child1==0)
{
printf("child1 OK\n");
signal(SIGINT,SIG_IGN);
signal(SIGUSR1,func_child1);
sleep(60);
}

else if(child1 >0)
{
while((child2=fork())==-1);
if(child2==0)
{
printf("child 2 OK\n");
signal(SIGINT,SIG_IGN);//你按下ctrl+C,子進程也會接受到ctrl的信號...所以,子進程忽略
//所提子進程要忽略掉這個SIGINT信號
signal(SIGUSR2,func_child2);
sleep(60); //這里為了驗證,如果進程沒退出,40妙之後自動會退出的
//不然就得手動在終端裡面kill掉這個進程了...
//有時候成了僵屍進程需要kill -9 才能殺死
}

else if(child2 >0)
{
signal(SIGINT,func_main);
printf("children forked OK...\n");
wait(0);

printf("child return...\n");

sleep(100);
return 0;
}
}

}

void func_main(int sig)
{
k++;
printf("to send signal\n");
//printf("child1=%d,child2=%d\n",child1,child2);
//if(k==1)
kill(child1,SIGUSR1);
//if(k==2) 加上這句,再按一次ctrl C,子進程2才會退出
就是你想要的效果了
kill(child2,SIGUSR2);
signal(SIGINT,SIG_DFL); //這里恢復ctrl+C的效果
//子進程退出之後,我們再按一次ctrl+C,當前的父進程就會像平常一樣,退出。

}

void func_child1(int sig)
{
printf("child1 is killed by parent!\n");
exit(0);
}

void func_child2(int sig)
{
printf("child2 is killed by parent!\n");
exit(0);
}

㈣ linux 什麼時候用軟中斷

在中斷處理程序不是很緊急的時候適合使用軟中斷,tasklist workqueue threadirq等,分為前半部後半部,前半部緊急響應中斷操作,後半部在處理器空閑是再處理

㈤ linux中斷的下半部機制有哪些

一、中斷處理為什麼要下半部?Linux在中斷處理中間中斷處理分了上半部和下半部,目的就是提高系統的響應能力和並發能力。通俗一點來講:當一個中斷產生,調用該中斷對應的處理程序(上半部)然後告訴系統,對應的後半部可以執行了。然後中斷處理程序就返回,下半部會在合適的時機有系統調用。這樣一來就大大的減少了中斷處理所需要的時間。

二、那些工作應該放在上半部,那些應該放在下半部?
沒有嚴格的規則,只有一些提示:
1、對時間非常敏感,放在上半部。
2、與硬體相關的,放在上半部。
3、不能被其他中斷打斷的工作,放在上半部。
以上三點之外的,考慮放在下半部。

三、下半部機制在Linux中是怎麼實現的?
下半部在Linux中有以下實現機制:
1、BH(在2.5中刪除)
2、任務隊列(task queue,在2.5刪除)
3、軟中斷(softirq,2.3開始。本文重點)
4、tasklet(2.3開始)
5、工作隊列(work queue,2.5開始)

四、軟中斷是怎麼實現的(以下代碼出自2.6.32)?
軟中斷不會搶占另外一個軟中斷,唯一可以搶占軟中斷的是中斷處理程序。
軟中斷可以在不同CPU上並發執行(哪怕是同一個軟中斷)

1、軟中斷是編譯期間靜態分配的,定義如下:
struct softirq_action { void (*action)(struct softirq_action *); };

/*
* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
* frequency threaded job scheling. For almost all the purposes
* tasklets are more than enough. F.e. all serial device BHs et
* al. should be converted to tasklets, not to softirqs.
*/
enum {
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS

㈥ Linux網路 - 數據包在內核中接收和發送的過程(轉)

本文將介紹在Linux系統中, 數據包是如何一步一步從網卡傳到進程手中的 以及 數據包是如何一步一步從應用程序到網卡並最終發送出去的

如果英文沒有問題,強烈建議閱讀後面參考里的文章,裡面介紹的更詳細。

本文只討論乙太網的物理網卡,不涉及虛擬設備,並且以一個UDP包的接收過程作為示例.

網卡需要有驅動才能工作,驅動是載入到內核中的模塊,負責銜接網卡和內核的網路模塊,驅動在載入的時候將自己注冊進網路模塊,當相應的網卡收到數據包時,網路模塊會調用相應的驅動程序處理數據。

下圖展示了數據包(packet)如何進入內存,並被內核的網路模塊開始處理:

軟中斷會觸發內核網路模塊中的軟中斷處理函數,後續流程如下

由於是UDP包,所以第一步會進入IP層,然後一級一級的函數往下調:

應用層一般有兩種方式接收數據,一種是recvfrom函數阻塞在那裡等著數據來,這種情況下當socket收到通知後,recvfrom就會被喚醒,然後讀取接收隊列的數據;另一種是通過epoll或者select監聽相應的socket,當收到通知後,再調用recvfrom函數去讀取接收隊列的數據。兩種情況都能正常的接收到相應的數據包。

了解數據包的接收流程有助於幫助我們搞清楚我們可以在哪些地方監控和修改數據包,哪些情況下數據包可能被丟棄,為我們處理網路問題提供了一些參考,同時了解netfilter中相應鉤子的位置,對於了解iptables的用法有一定的幫助,同時也會幫助我們後續更好的理解Linux下的網路虛擬設備。

ndo_start_xmit會綁定到具體網卡驅動的相應函數,到這步之後,就歸網卡驅動管了,不同的網卡驅動有不同的處理方式,這里不做詳細介紹,其大概流程如下:

在網卡驅動發送數據包過程中,會有一些地方需要和netdevice子系統打交道,比如網卡的隊列滿了,需要告訴上層不要再發了,等隊列有空閑的時候,再通知上層接著發數據。

閱讀全文

與linux38軟中斷相關的資料

熱點內容
定向流量30G都包括哪些APP 瀏覽:352
apple和瑤瑤綜藝 瀏覽:351
打開word所在文件夾自動彈出 瀏覽:390
c怎麼編程改名字 瀏覽:146
哪些電視劇app不帶logo的 瀏覽:406
開機後桌面變黑色桌面文件丟失 瀏覽:136
網路電視怎麼用遙控器 瀏覽:953
我的世界json打開失敗 瀏覽:867
易語言56教程視頻 瀏覽:610
linux開機啟動文件 瀏覽:773
給寶寶唱兒歌用什麼app 瀏覽:354
投標文件為什麼要使用cad軟體 瀏覽:522
一季度保險業務數據如何看 瀏覽:398
為什麼行車記錄儀文件大小為0 瀏覽:795
win10筆記本傳輸文件 瀏覽:735
棉花糖小說下載的小說在哪個文件 瀏覽:750
淘寶網頁特效代碼 瀏覽:921
找不到指定的文件是什麼意思 瀏覽:659
cad打不出stl文件 瀏覽:439
紅米4進入最近應用程序 瀏覽:943

友情鏈接