原创 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,在程序檢測到異常的時候打印出