內核工具KGDB調試環(huán)境需要為Linux 內核加上 kgdb補丁,補丁實現(xiàn)GDB遠程調試所需要的功能,包括命令處理、陷阱處理及串口通信3個主要的部分。KGDB補丁的主要作用是在Linux 內核中添加了一個調試Stub。調試Stub是Linux 內核中的一小段代碼,是運行GDB的開發(fā)機和所調試內核之間的一個媒介。GDB和調試stub之間通過GDB串行協(xié)議進行通信。GDB串行協(xié)議是-種基于消息的ASCII 碼協(xié)議,包含了各種調試命令。當設置斷點時,KGDB將斷點的指令替換為一條 trap指令,當執(zhí)行到斷點時控制權就轉移到調試 stub中去。此時,調試stub 的任務就是使用遠程串行通信協(xié)議將當前環(huán)境傳送給GDB,然后從GDB處接收命令。GDB命令告訴stub 下一步該做什么,當stub收到繼續(xù)執(zhí)行的命令時,將恢復程序的運行環(huán)境,把對 CPU的控制權重新交還給內核。KGDB補丁給內核添加以下3個部件:

為愛輝等地區(qū)用戶提供了全套網頁設計制作服務,及愛輝網站建設行業(yè)解決方案。主營業(yè)務為網站設計制作、做網站、愛輝網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
(1 ) GDB stub
GDB stub被稱為調試插樁(簡稱為stub),是KGDB調試器的核心。它是Linux內核中的一小段代碼,用來處理主機上: GDB發(fā)來的各種請求;并且在內核處于被調試狀態(tài)時,控制目標機板上的處理器。
(2)修改異常處理函數(shù)
當這個異常發(fā)生時,內核將控制權交給KGDB調試器,程序進入KGDB提供的異常處理函數(shù)中。在里面,可以分析程序的各種情況。
(3)串口通信
GDB和 stub之間通過GDB串行協(xié)議進行通信。它是一種基于消息的ASCII 碼協(xié)議,包含了各種調試命令。除串口外,也可以使用網卡進行通信。以設置內核斷點為例說明KGDB與GDB之間的工作過程。設置斷點時,KGDB修改內核代碼,將斷點位置的指令替換成一條異常指令(在ARM中這是一條未定義的指令)。當執(zhí)行到斷點時發(fā)生異常,控制權轉移到stub 的異常處理函數(shù)中。此時,stub的任務就是使用GDB串行通信協(xié)議將當前環(huán)境傳送給GDB,然后從GDB處接收命令,GDB命令告訴stub下一步該做什么。當stub收到繼續(xù)執(zhí)行的命令時,將恢復原來替換的指令、恢復程序的運行環(huán)境,把對CPU的控制權重新交還給內核。
中斷與定時器:
中斷的概念:指CPU在執(zhí)行過程中,出現(xiàn)某些突發(fā)事件急待處理,CPU暫停執(zhí)行當前程序,轉去處理突發(fā)事件
,處理完后CPU又返回原程序被中斷的位置繼續(xù)執(zhí)行
中斷的分類:內部中斷和外部中斷
內部中斷:中斷源來自CPU內部(軟件中斷指令、溢出、觸發(fā)錯誤等)
外部中斷:中斷源來自CPU外部,由外設提出請求
屏蔽中斷和不可屏蔽中斷:
可屏蔽中斷:可以通過屏蔽字被屏蔽,屏蔽后,該中斷不再得到響應
不可平布中斷:不能被屏蔽
向量中斷和非向量中斷:
向量中斷:CPU通常為不同的中斷分配不同的中斷號,當檢測到某中斷號的中斷到來后,就自動跳轉到與該中斷號對應的地址執(zhí)行
非向量中斷:多個中斷共享一個入口地址。進入該入口地址后再通過軟件判斷中斷標志來識別具體哪個是中斷
也就是說向量中斷由軟件提供中斷服務程序入口地址,非向量中斷由軟件提供中斷入口地址
/*典型的非向量中斷首先會判斷中斷源,然后調用不同中斷源的中斷處理程序*/
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(可編程間隔定時器)接收一個時鐘輸入,
當時鐘脈沖到來時,將目前計數(shù)值增1并與已經設置的計數(shù)值比較,若相等,證明計數(shù)周期滿,產生定時器中斷,并
復位計數(shù)值。
如下圖所示:
Linux中斷處理程序架構:
Linux將中斷分為:頂半部(top half)和底半部(bottom half)
頂板部:完成盡可能少的比較緊急的功能,它往往只是簡單的讀取寄存器中的中斷狀態(tài)并清除中斷標志后就進行
“登記中斷”(也就是將底半部處理程序掛在到設備的底半部執(zhí)行隊列中)的工作
特點:響應速度快
底半部:中斷處理的大部分工作都在底半部,它幾乎做了中斷處理程序的所有事情。
特點:處理相對來說不是非常緊急的事件
小知識:Linux中查看/proc/interrupts文件可以獲得系統(tǒng)中斷的統(tǒng)計信息。
如下圖所示:
第一列是中斷號 第二列是向CPU產生該中斷的次數(shù)
介紹完相關基礎概念后,讓我們一起來探討一下Linux中斷編程
Linux中斷編程:
1.申請和釋放中斷
申請中斷:
int request_irq(unsigned int irq,irq_handler_t handler,
unsigned long irqflags,const char *devname,void *dev_id)
參數(shù)介紹:irq是要申請的硬件中斷號
handler是向系統(tǒng)登記的中斷處理程序(頂半部),是一個回調函數(shù),中斷發(fā)生時,系統(tǒng)調用它,將
dev_id參數(shù)傳遞給它
irqflags:是中斷處理的屬性,可以指定中斷的觸發(fā)方式和處理方式:
觸發(fā)方式: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);
參數(shù)定義與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)...//禁止中斷并保存狀態(tài)
void local_irq_disable(void);//禁止中斷,不保存狀態(tài)
下面來分別介紹一下頂半部和底半部的實現(xiàn)機制
底半部機制:
簡介:底半部機制主要有tasklet、工作隊列和軟中斷
1.底半部是想方法之一tasklet
(1)我們需要定義tasklet機器處理器并將兩者關聯(lián)
例如:
void my_tasklet_func(unsigned long);/*定義一個處理函數(shù)*/
DECLARE_TASKLET(my_tasklet,my_tasklet_func,data);
/*上述代碼定義了名為my_tasklet的tasklet并將其余
my_tasklet_func()函數(shù)綁定,傳入的參數(shù)為data*/
(2)調度
tasklet_schedule(my_tasklet);
//使用此函數(shù)就能在是當?shù)臅r候進行調度運行
tasklet使用模板:
/*定義tasklet和底半部函數(shù)并關聯(lián)*/
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_schedule(xxx_tasklet);//調度地板部
...
}
/*設備驅動模塊加載函數(shù)*/
int __init xxx_init(void)
{
...
/*申請中斷*/
result = request_irq(xxx_irq,xxx_interrupt,
IRQF_DISABLED,"xxx",NULL);
...
return IRQ_HANDLED;
}
/*設備驅動模塊卸載函數(shù)*/
void __exit xxx_exit(void)
{
...
/*釋放中斷*/
free_irq(xxx_irq,xxx_interrupt);
...
}
2.底半部實現(xiàn)方法之二---工作隊列
使用方法和tasklet類似
相關操作:
struct work_struct my_wq;/*定義一個工作隊列*/
void my_wq_func(unsigned long);/*定義一個處理函數(shù)*/
通過INIT_WORK()可以初始化這個工作隊列并將工作隊列與處理函數(shù)綁定
INIT_WORK(my_wq,(void (*)(void *))my_wq_func,NULL);
/*初始化工作隊列并將其與處理函數(shù)綁定*/
schedule_work(my_wq);/*調度工作隊列執(zhí)行*/
/*工作隊列使用模板*/
/*定義工作隊列和關聯(lián)函數(shù)*/
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)
{
...
schedule_work(my_wq);//調度底半部
...
return IRQ_HANDLED;
}
/*設備驅動模塊加載函數(shù)*/
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);
}
/*設備驅動模塊卸載函數(shù)*/
void xxx_exit(void)
{
...
/*釋放中斷*/
free_irq(xxx_irq,xxx_interrupt);
...
}
SNMP一般指簡單網絡管理協(xié)議,簡單網絡管理協(xié)議(SNMP)是專門設計用于在IP網絡管理網絡節(jié)點(服務器、工作站、路由器、交換機及HUBS等)的一種標準協(xié)議,它是一種應用層協(xié)議。
trap為Linux命令,bash內置命令,可以查看shell環(huán)境信號和設置信號的處理方式。
使用格式(commands為命令,signals為信號的指代):
1):$trap"commands"signals#接收到signals指定的信號時,執(zhí)行commands命令。
2):$trapsignals#如果沒有指定命令就是恢復signals的動作。比如trapINT就是恢復Ctrl+C。
3):$trap""signals#忽略信號signals
4):$trap-l#列出所有的信號
擴展資料:
SNMP協(xié)議種類:
目前,SNMP有3種:SNMPV1、SNMPV2、SNMPV3。第1版和第2版沒有太大差距,但SNMPV2是增強版本,包含了其它協(xié)議操作。與前兩種相比,SNMPV3則包含更多安全和遠程配置。為了解決不同SNMP版本間的不兼容問題,RFC3584中定義了三者共存策略。
SNMP還包括一組由RMON、RMON2、MTB、MTB2、OCDS及OCDS定義的擴展協(xié)議。
參考資料來源:百度百科-SNMP
參考資料來源:百度百科-trap
安裝snmp服務
CentOS/RedHat下可以只用yum命令進行安裝。
$ yum –y install net-snmp net-snmp-devel
若要使用snmpwalk進行安裝檢測,則還需要安裝net-snmp-utils包
$ yum –y install net-snmp-utils
Ubuntu可以通過apt-get install snmp snmpd 進行安裝
設置安全的驗證方式
將SNMP代理程序暴露給網絡上的所有主機是很危險的,為了防止其它主機訪問您的SNMP代理程序,我們需要在SNMP代理程序上加入身份驗證機制。SNMP支持不同的驗證機制,這取決于不同的SNMP協(xié)議版本,云監(jiān)控目前支持v2c和v3兩個版本,其中v2c版本的驗證機制比較簡單,它基于明文密碼和授權IP來進行身份驗證,而v3版本則通過用戶名和密碼的加密傳輸來實現(xiàn)身份驗證,我們建議使用v3,當然,只要按照以下的介紹進行配置,不論是v2c版本還是v3版本,都可以保證一定的安全性,您可以根據(jù)情況來選擇。
注意一點,SNMP協(xié)議版本和SNMP代理程序版本是兩回事,剛才說的v2c和v3是指SNMP協(xié)議的版本,而Net-SNMP是用來實現(xiàn)SNMP協(xié)議的程序套件,目前它的最新版本是剛才提到的5.4.2.1。
v2c
先來看如何配置v2c版本的SNMP代理,我們來創(chuàng)建snmpd的配置文件,默認情況下它是不存在的,我們來創(chuàng)建它,如下:
sdo:~ # vi /usr/local/snmp/share/snmp/snmpd.conf
然后我們需要創(chuàng)建一個只讀帳號,也就是read-only community,在snmpd.conf中添加以下內容:
rocommunity sdomonitor 114.80.132.9 rocommunity sdomonitor 58.215.169.26 rocommunity sdomonitor 58.215.169.27
如果想要檢測服務是否成功開啟,則還需要在snmpd.conf中添加:
rocommunity sdomonitor 127.0.0.1
注意,這里的"rocommunity"表示這是一個只讀的訪問權限,云監(jiān)控只可以從您的服務器上獲取信息,而不能對服務器進行任何設置。
緊接著的"sdomonitor"相當于密碼,很多平臺喜歡使用"public"這個默認字符串。這里的"sdomonitor"只是一個例子,您可以設置其它字符串作為密碼。
最右邊的"60.195.249.83"代表指定的監(jiān)控點IP,這個IP地址是云監(jiān)控專用的監(jiān)控點,這意味著只有云監(jiān)控有權限來訪問您的SNMP代理程序。
所以,以上這段配置中,只有"sdomonitor"是需要您進行修改的,同時在云監(jiān)控上添加服務器的時候,需要提供這個字符串。
v3
當然,我們建議您使用v3版本來進行身份驗證。對于一些早期版本的Linux分發(fā)版,其內置的SNMP代理程序可能并不支持v3,所以我們建議您按照前邊介紹的方法,編譯和安裝最新的Net-Snmp。
v3支持另一種驗證方式,需要創(chuàng)建一個v3的帳號,我們同樣修改以下配置文件:
sdo:~ # vi /usr/local/snmp/share/snmp/snmpd.conf
然后添加一個只讀帳號,如下:
rouser sdomonitor auth
可以看到,在v3中,"rouser"用于表示只讀帳號類型,隨后的"sdomonitor"是指定的用戶名,后邊的"auth"指明需要驗證。
接下來,我們還要添加"sdomonitor"這個用戶,這就是v3中的特殊機制,我們打開以下配置文件:
sdo:~ # vi /var/net-snmp/snmpd.conf
這個文件會在snmpd啟動的時候被自動調用,我們需要在它里邊添加創(chuàng)建用戶的指令,如下:
createUser sdomonitor MD5 mypassword
這行配置的意思是創(chuàng)建一個名為"sdomonitor"的用戶,密碼為"mypassword",并且用MD5進行加密傳輸。這里要提醒的是:
密碼至少要有8個字節(jié)
這是SNMP協(xié)議的規(guī)定,如果小于8個字節(jié),通信將無法進行。
值得注意的是,一旦snmpd啟動后,出于安全考慮,以上這行配置會被snmpd自動刪除,當然,snmpd會將這些配置以密文的形式記錄在其它文件中,重新啟動snmpd是不需要再次添加這些配置的,除非您希望創(chuàng)建新的用戶。
以上配置中的用戶名、密碼和加密方式,在云監(jiān)控添加服務器的時候需要添加。
啟動snmp服務
$ service snmpd start
用以下命令檢查服務是否啟動成功
$ snmpwalk -v 2c -c sdomonitor 127.0.0.1 system
如果要關閉,則可以直接kill這個進程,如下:
$ killall -9 snmpd 或者$ service snmpd stop
當前文章:linuxtrap命令的簡單介紹
文章地址:http://chinadenli.net/article26/hijjjg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供Google、標簽優(yōu)化、網頁設計公司、外貿建站、網站維護、App設計
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)