原创 Linux中斷機制之二:初始化

相關概念和關鍵數據結構 1、 irq號:在當前系統中全局唯一,對應內核數據結構struct irq_desc,每個外設的中斷有一個irq號(體系結構預留的中斷,是沒有對應的irq_desc結構和irq號的),該irq在該中斷的生命週期內

原创 TCP的URG標誌和內核實現之一:協議

定義urgent數據的目的: urgent機制,是用於通知應用層需要接收urgent data,在urgent data接收完成後,通知應用層urgent data數據接收完畢。相關協議文本RFC793 RFC1122 RFC6093

原创 網絡協議攻擊之一:基於IP分片的off path 攻擊

 注:本文是閱讀相關文獻的筆記 這裏描述的攻擊模式都是offpath模式,攻擊者只能僞造報文,沒有直接截獲或則修改報文的權限,可以發現,即使只能僞造,也能夠達到截獲的目的。 IP分片的特徵 每個IP分片的目的IP、源IP、

原创 關於memory barrier/memory ordering 的筆記和總結(2)

              Memory ordering Memory ordering用來描述系統中的processor對內存的操作如何對其它processor可見(可見的定義見前面的描述)。同時需要說明的是,大多數文獻都採用

原创 關於memory barrier/memory ordering的筆記和總結(3)

 Linux中的memory barrier                        基本的memory ordering特徵 原則:內核按照最relax的memory ordering(DEC Alpha)來設計,其

原创 關於memory barrier/memory ordering的筆記和總結(1)

 本文是ARM和INTEL官方手冊、LINUX內核文檔的筆記。              誰需要關心memory ordering 以下情況下,不需要關心memoryordering: 如果不涉及內存的併發訪問; 代

原创 skbuff_head_cache去哪裏了

 在定位linux網絡系統內存使用相關問題的時候,/proc/slabinfo下的"skbuff_head_cache"和"skbuff_fclone_cache"是常用的工具,但是有時候你會發現在/proc/slabinfo沒有這

原创 Linux中斷機制之一:硬件處理

最近解決一個關於Linux中斷的問題,把相關機制整理了一遍,記錄在此。 不同的外部設備、不同的體系結構、不同的OS其中斷實現機制都有差別,本文對應的OS爲linux3.4版本,外部設備爲PCI設備、系統爲X86。 概覽 中斷讓外設能夠通知

原创 內核的static-key機制

內核中有很多判斷條件在正常情況下的結果都是固定的,除非極其罕見的場景纔會改變,通常單個的這種判斷的代價很低可以忽略,但是如果這種判斷數量巨大且被頻繁執行,那就會帶來性能損失了。內核的static-key機制就是爲了優化這種場景,其優化的結

原创 Linux中斷機制之三:中斷的執行

在內核代碼中,對X86平臺中斷執行的基本過程是: 1、 通過IDT中的中斷描述符,調用common_interrupt; 2、 通過common_interrupt,調用do_IRQ,完成vector到irq_desc的轉換,進入

原创 TCP的URG標誌和內核實現之三:接收的實現

大致的處理過程 TCP的接收流程:在tcp_v4_do_rcv中的相關處理(網卡收到報文觸發)中,會首先通過tcp_check_urg設置tcp_sock的urg_data爲TCP_URG_NOTYET(urgent point指向的可

原创 TCP的URG標誌和內核實現之二:發送的實現

Linxu內核在默認情況下,把urgent data實現爲OOB數據 發送URG數據的接口 在內核態,使用kernel_sendmsg/kernel_sendpage完成發送,只不過需要加上MSG_OOB標誌,表示要發送的URG數據。

原创 linux內核地址有效性判斷方法

如果只是需要大致地判斷範圍,可以參考內核\linux-3.4.104\Documentation\x86\x86_64\mm.txt中的對各個段的分配的描述。 但是如果需要更加精確地判斷,就需要根據內核頁表,一級一級地查找,查看是否存在對

原创 內核模塊踩內存問題定位利器- hardware breakpoint

內核由於共享內存地址空間,如果沒有合適的工具,很多踩內存的問題即使復現,也無法快速定位;在新的內核版本中引入了一個新工具hardware breakpoint,其能夠監視對指定的地址的特定類型(讀/寫)的數據訪問,有利於該類問題的定位;以

原创 如何獲取內核指定線程的調用棧

方法一:可以通過/proc/線程ID/stack來獲取指定線程當前的調用棧,但是該方案存在限制:可能不能準確獲取出問題的時候該線程的調用棧 方法二:通過內核接口save_stack_trace_tsk和%pS,在程序檢測到異常的時候打印出