原创 Linux kernel panic代碼解釋

當Linux內核發生嚴重錯誤的時候,系統無法繼續運行下去,此時內核會主動觸發一個panic操作,它的執行流程分析過程如下所示: kernel/panic.c: void panic(const char *fmt, ...) {

原创 開源項目-minios

簡介 minios 是使用QEMU實現的一個迷你 Linux 系統。它由 Linux 內核和 Rootfs 組成,Rootfs中包含了一系列的第三方基礎庫,比如 Libc , BusyBox 。這些都是操作系統運行的基礎組件。利用

原创 Linux kernel oops

本文以ARM64爲例,介紹內核的Oops機制,我們使用grep搜索一下內核中可能會報Oops的地方: ./arch/arm64/kernel/sys_compat.c:142: arm64_notify_die("Oops - b

原创 Linux塊設備驅動開發簡介

本文基於Linux-4.14 文件系統框架 Linux內核的文件系統框架圖如下所示: gendisk對象 Linux中用一個gendisk對象結構體表示一個磁盤分區,這個結構體對象中會包含該分區對應的設備文件的主設備號,次設備號

原创 開源項目mini-ipc簡介

簡介 mini-ipc是一個進程間通信使用的開源庫,由本猿獨自開發的,可用於支持POSIX標準的類unix系統上。它的目標是爲了更快速的實現用戶空間的系統設計和應用設計。本庫採用MIT-License開源協議,開發者可以使用這個開

原创 模擬一次soft lockup事件

前面我已經介紹過 Linux內核故障分類和排查 這篇文章。 通過前文,可以知道內核故障中有一類,叫做lockup,實際上就是死鎖,分爲soft lockup和hard lockup,對於hard lockup可能還需要平臺的支持,

原创 page cache回寫的幾種觸發方式

1.通過寫入proc文件系統節點操作 echo 3 > /proc/sys/vm/drop_caches drop_caches通過傳入不同的數值表示不同的含義,其中寫入3表示回收內核中的clean cache和slab obj

原创 crash常用的調試命令

我的crash常用命令如下所示: log/dmesg: 打印出故障現場的kmsg緩衝區log_buf中的內容。 struct:展示結構體的定義,或者從指定的地址開始解析一個結構體。 union:與struct類似,但是用於unio

原创 進程凍結和解凍的本質

在我前面的文章中已經介紹了內核中的進程凍結技術,進程凍結存在的意義以及它的實現架構,沒有看過的童鞋可以點擊如下鏈接過去瀏覽: https://blog.csdn.net/rikeyone/article/details/10318

原创 內核中的插樁調試

插樁法是內核常用的一種調試手段,利用代碼中插樁,執行到此時執行對應的鉤子函數(hook)來達到調試的目的,從實現來說,它不可避免的會帶來一些性能上的開銷,不過隨着實現的不斷優化,這部分的開銷已經越來越小了。比如使能了 dynami

原创 內核中的VMAP_STACK特性

在Linux-4.14之前,Linux內核棧都是位於線性映射區,該區域對應的虛擬地址和物理地址具有一個固定的偏移,並且是在系統剛啓動是進行過pre-mapped,因此內核在使用時不需要另外做頁表映射。 在2016年的時候內核引入了

原创 對於MIGRATE_MOVABLE的理解

內存管理對於不同的zone管理區,都會劃分爲不同的memory block進行管理,這些memory block是按照2的冪次個頁面進行管理的,對應的結構體如下: struct zone { ... /* free

原创 oops堆棧分析實例

本文基於Linux-4.0,根據一個crash現場的實例,根據堆棧中的數據,反推整個函數調用流程,由於本例子存在oops,也會直接打印出backtrace,最終可以與我們的分析結果做一下比較,看看分析是否正確。 / # echo

原创 Linux內核故障分類和排查

設備故障分爲多種表現形式,可以把它分爲3類: 1.系統崩潰重啓(panic) 2.系統出現長時間無響應異常(hung) 3.系統出現短暫卡頓(性能問題) 針對第1類,一般引起的原因包括:軟件bug、死鎖(soft lockup、h

原创 使用crash工具分析高通ramdump

1.下載並編譯arm64平臺上的crash工具 從github上下載crash工具源代碼: git clone https://github.com/crash-utility/crash.git 編譯針對arm64平臺的cr