前面一篇文章介紹了kexec和kdump的思想,本文著重講它們的另乙個方面,就是kdump到底是如何轉儲垮掉核心的記憶體映像的。首先定義乙個鍊錶,它很重要。
static list_head(vmcore_list);
unsigned long long elfcorehdr_addr = elfcore_addr_max; //乙個重要變數記錄核心裝載的位置,用以判斷是正常啟動還是kdump啟動。
struct vmcore while (count);
return read;
以下這個函式的本質很簡單,就是查詢:
static u64 map_offset_to_paddr(loff_t offset, struct list_head *vc_list, struct vmcore **m_ptr)
struct vmcore *m;
u64 paddr;
list_for_each_entry(m, vc_list, list) {
u64 start, end;
start = m->offset;
end = m->offset + m->size - 1;
if (offset >= start && offset <= end) {
paddr = m->paddr + offset - start;
*m_ptr = m;
return paddr;
*m_ptr = null;
return 0;
最後,elfcorehdr_addr很重要,它記錄了垮掉核心的映像位址,那麼這個位址是怎麼知道的呢?往往在kdump服務啟動的時候會將這個引數傳入給核心,當此核心垮掉的時候就會以此引數加上別的引數作為新的啟動引數啟動新的捕捉核心,正如下面的**所示:
static void __init parse_cmdline_early (char ** cmdline_p)
else if (!memcmp(from, "elfcorehdr=", 11)) //這個elfcorehdr一般由kdump服務傳輸過來
elfcorehdr_addr = memparse(from+11, &from);
等到新的捕捉核心啟動後,/proc/vmcore已經有了組織好的在捕捉核心啟動過程中植入的鍊錶,此時捕捉核心已經進入了使用者空間,那麼使用者空間的kdump服務程序就會將/proc/vmcore讀出,在讀取的當時形成記憶體映像資料(讀取前僅僅是乙個vmcore_list鍊錶),然後kdump服務程序將之寫入乙個磁碟檔案,寫完後系統不再繼續把控制權交給使用者而是直接重新啟動,這是因為kdump用的是kexec機制,它啟動乙個捕捉核心就是用來捕獲垮掉核心的記憶體映像的不是幹別的的,因此沒有必要繼續啟動下去,把/proc/vmcore拷貝到磁碟便於以後除錯就完成了這次更換核心並重啟的使命。捕捉核心啟動到使用者空間後,使用者空間的程式是怎麼知道該做什麼了呢?這還是linux的老本行,機制和策略分離的益處,在/etc下有kdump的配置檔案,你可以配置轉儲的記憶體映像存在什麼位置以及用何格式儲存,而且kdump是乙個服務,在紅帽子系列下可以用service start命令啟動,服務就是守護程序,完全從配置檔案中得到策略,這又是乙個分層的問題,kexec是機制,kdump是kexec的乙個策略性應用;kdump的核心記憶體轉儲是機制,而kdump的使用者空間守護程序是其乙個策略性應用;kdump守護程序是機制,而如何配置它的行為是乙個策略性的行為。
最後注意一下轉儲除錯時vmalloc分配的核心模組的問題。
核心檔案 核心轉儲
核心檔案 核心檔案 core file 也稱核心轉儲 core dump 是作業系統 在程序收到某些訊號 而終止執行時,將此時程序位址空間的內容以及有關程序狀態的其他資訊寫出的乙個磁碟檔案。這種資訊往往用於除錯。核心檔案一詞 於磁芯記憶體 core memory 核心轉儲 通常這個詞的含義是乙個動作...
Ubuntu的核心轉儲工具
ubuntu 官方連線 kdump是乙個linux核心崩潰轉儲機制,這個機制的原理是在記憶體中保留一塊區域,這塊區域用來存放capture kernel,當前的核心發生crash後,通過kexec把保留區域的capture kernel執行起來,由capture kernel負責把crash ker...
獲取程序的核心轉儲
使用命令ulimit可以檢視核心轉儲功能是否開啟 ulimit c 0 c選項表示核心轉儲檔案的大小限制。0表示核心轉儲無效。可以使用下面的命令開啟 ulimit c unlimited 再次檢視 ulimit c unlimited 執行測試程式 test ulimit 段錯誤 核心已轉儲 fil...