Linux x86 stability和coredump

1 POSIX pthread_create原理
1)fork()、pthread_create()、vfork()對應的系統調用分別是sys_fork()、sys_clone()、sys_vfork(),它們在內核中都是通過do_fork()實現的。
2)系統中所有的進程都組織在init_task.tasks鏈表下面,每個進程的線程組織在每個進程task_sturct->signal的鏈表下。參考函數for_each_process()和for_each_process_thread()。
3)根據上述分析,Linux用戶態和內核線程都由task_struct結構體描述,是一個輕量級的進程,因此內核中current變量可以表示進程、用戶態線程和內核線程。

2 kernel的log機制
2.1 kernel代碼中調整loglevel
int old_lvl = console_loglevel;
console_loglevel = CONSOLE_LOGLEVEL_MOTORMOUTH;
// TODO
console_loglevel = old_lvl;

2.2 Linux Kernel動態log
- 需在內核中配置CONFIG_DYNAMIC_DEBUG,并且將debugfs掛載到某個文件夾mount -t debugfs none /sys/kernel/debug/
- 通過echo -n "file xxxxxx.c +p" > /sys/kernel/debug/dynamic_debug/control(或者/d/dynamic_debug/control)來打開調試信息

2.3 Kernel hexdump
print_hex_dump(KERN_INFO, "",
DUMP_PREFIX_OFFSET, 16, 1,
buf,
len,
true);

3 Interrupt
3.1 中斷上半部
arch/x86/kernel/irq.c
do_IRQ()
分析do_IRQ()函數可知,Linux內核在x86平臺上不支持中斷嵌套。

3.2 中斷下半部
tasklet基于softirq。

3.3 irqbalance
https://github.com/ix5/android-irqbalance

4 x86 NMI watchdog
4.1 工作原理
soft lockup:禁止搶占,使用了spin_lock()
hard lockup:禁止搶占和禁止CPU local irq,使用了spin_lock_irqsave()
用戶態watchdog:/dev/watchdog

kernel/watchdog.c
hrtimer的處理函數:watchdog_timer_fn
調用wake_up_process函數喚醒此cpu上的watchdog線程,如果watchdog線程被喚醒就會去刷新時間戳。如果系統關了搶占,此watchdog線程不會被喚醒,這樣時間戳就不會更新。

4.2 soft lockup
Soft Lockup refers to the occurrence of the CPU that has occurred in 20 seconds (default) does not have scheduling switching.
Refer to Analysis of soft lockup mechanism of Linux series AND Using RCU’s CPU Stall Detector.

echo 30 > /proc/sys/kernel/watchdog_thresh

4.3 watchdog線程調度方式
- kernel/watchdog.c
- SCHED_FIFO,最高優先級MAX_RT_PRIO - 1 = 99
- 實時進程的優先級(rt_priority)數字越大則優先級越高,99最高,0最低;而普通進程正好相反,優先級(prio)數字越大則優先級越低,100最高,139最低(對應nice值-20 ~ 19)
- 內核調度是按照task_struct中的prio來調度的,所以內核會將實時線程的rt_priority轉換成prio:prio = MAX_RT_PRIO - 1 - p->rt_priority;prio的值越小,優先級就越高

4.4 進程的調度方式和優先級
ps -Al
chrt -p $PID

4.5 per-CPU變量
current,每個CPU一個變量:
arch/x86/include/asm/current.h
DECLARE_PER_CPU(struct task_struct *, current_task);

搶占計數,每個CPU一個變量:
arch/x86/include/asm/preempt.h
DECLARE_PER_CPU(int, __preempt_count);
CPUx的搶占禁止了后,實際上就是一個單片機,只能執行關閉搶占的線程以及響應硬件的中斷。

4.6 kmod demo
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/kthread.h>

static struct task_struct *task0;
static spinlock_t spinlock;
static int val;

int task(void *arg)
{
printk(KERN_INFO "%s:%d\n",
__func__, __LINE__);
/* To generate panic uncomment following */
/* panic("softlockup: hung tasks"); */

while (!kthread_should_stop()) {
printk(KERN_INFO "%s:%d\n",
__func__, __LINE__);
spin_lock(&spinlock);
/* busy loop in critical section */
while(1) {
// printk(KERN_INFO "%s:%d\n",
__func__, __LINE__);
}
spin_unlock(&spinlock);
}
return val;
}

static int softlockup_init(void)
{
printk(KERN_INFO "%s:%d\n",
__func__, __LINE__);

val = 1;
spin_lock_init(&spinlock);
task0 = kthread_run(&task, (void *)val,
"softlockup_thread");
set_cpus_allowed_ptr(task0, cpumask_of(0));
return 0;
}

static void softlockup_exit(void)
{
printk(KERN_INFO "%s:%d\n",
__func__, __LINE__);
kthread_stop(task0);
}

module_init(softlockup_init);
module_exit(softlockup_exit);
MODULE_LICENSE("GPL");

4.7 lockdep
lockdep:lock dependency
CONFIG_PROVE_LOCKING=y
打開lockdep時內核啟動后會自動配置console loglevel到CONSOLE_LOGLEVEL_MOTORMOUTH(=15),可以修改代碼將這個配置屏蔽,不然打印的內核log太多。

5 addr2line和objdump使用
5.1 帶有完整調試信息的符號路徑
./out/target/product/[PROJECT]/symbols/vendor/lib64/

5.2 addr2line
addr2line -C -f -e libxxx.so <地址>
其中地址為#00 Frame前面顯示的pc指向的地址

aarch64-linux-android-addr2line -C -f -e vmlinux <目標地址>

5.3 objdump
objdump -l -C -S libxxx.so > deasm.log
vi deasm.log
輸入#00 Frame前面顯示的pc指向的地址(需要去掉前面的多個0)

5.4 gdb vmlinux
Use 7-Zip to extract vmlinux from IPK file. The following l means list.
gdb vmlinux
l *func_name+offset_addr

6 coredump
Aarch64 Linux SDK中可以運行xxx-gdb來調試core dump。

Default core dump, must use sudo bash -c 'shell command' to run coredump configuration.
sudo bash -c 'echo "/data/core.%e.%p" > \
/proc/sys/kernel/core_pattern'
ulimit -c <size>: unit is block (= 512bytes)
ulimit -c unlimited
gdb main core.main.19188

7 Abbreviations
HECI:Host Embedded Controller Interface,Host OS和x86 ME的通信接口,只有4pin,分別是REQ#、GNT#、TX和RX,目的是為了代替SMBus

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96771.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PyTorch】多對象分割

對象分割任務的目標是找到圖像中目標對象的邊界。實際應用例如自動駕駛汽車和醫學成像分析。這里將使用PyTorch開發一個深度學習模型來完成多對象分割任務。多對象分割的主要目標是自動勾勒出圖像中多個目標對象的邊界。 對象的邊界通常由與圖像大小相同的分割掩碼定義&#xf…

RabbitMQ---面試題

總結我們所學內容&#xff0c;這里推薦博客進行復習 RabbitMQ---面試題_rabbitmq常問面試題-CSDN博客

MasterGo自動布局(Auto Layout)

自動布局是用來表示 子元素與子元素之間互相影響的一種排版方式,是一種響應式布局技術。一般是將所有元素設計完成后再使用自動布局進行設置。 自動布局就是響應式布局,就是在不同尺寸的手機上寬度不同都應該怎么展示。 一般頁面的一級元素使用約束進行相對定位,二級元素及里…

還在重啟應用改 Topic?Spring Boot 動態 Kafka 消費的“終極形態”

場景描述&#xff1a; 你的一個微服務正在穩定地消費 Kafka 的 order_topic。現在&#xff0c;上游系統為了做業務隔離&#xff0c;新增加了一個 order_topic_vip&#xff0c;并開始向其中投遞 VIP 用戶的訂單。你需要在不重啟、不發布新版本的情況下&#xff0c;讓你現有的消費…

使用vllm部署neo4j的text2cypher-gemma-2-9b-it-finetuned-2024v1模型

使用vllm部署neo4j的text2cypher-gemma-2-9b-it-finetuned-2024v1模型 系統環境準備 由于使用的基于 nvcr.io/nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04 的 workbench,需要進行以下準備(其他系統環境可忽略) ldconfig -p | grep libcudnn 找到 libcudnn 的so庫,然…

Coze源碼分析-資源庫-創建知識庫-前端源碼-核心組件

概述 本文深入分析Coze Studio中用戶創建知識庫功能的前端實現。該功能允許用戶在資源庫中創建、編輯和管理知識庫資源&#xff0c;為開發者提供了強大的知識管理和數據處理能力。通過對源碼的詳細解析&#xff0c;我們將了解從資源庫入口到知識庫配置彈窗的完整架構設計、組件…

基于時空數據的網約車訂單需求預測與調度優化

一、引言隨著共享出行行業的蓬勃發展&#xff0c;網約車已成為城市交通的重要組成部分。如何精準預測訂單需求并優化車輛調度&#xff0c;是提升平臺運營效率、改善用戶體驗的關鍵。本文提出一種基于時空數據的網約車訂單需求預測與調度優化方案&#xff0c;通過網格化城市空間…

數據結構 Java對象的比較

在Java中&#xff0c;凡是涉及到比較的&#xff0c;可以分為兩類情況&#xff1a;一類是基本數據類型的比較&#xff0c;另一類是引用數據類型的比較。對于基本數據類型的比較&#xff0c;我們通過關系運算符&#xff08;、>、<、!、>、<&#xff09;進行它們之間的…

企智匯建筑施工項目管理系統:全周期數字化管控,賦能工程企業降本增效!?建筑工程項目管理軟件!建筑工程項目管理系統!建筑項目管理軟件企智匯軟件

在建筑施工行業&#xff0c;項目進度滯后、成本超支、質量安全隱患頻發、多方協同不暢等問題&#xff0c;一直是制約企業發展的痛點。傳統依賴人工記錄、Excel 統計的管理模式&#xff0c;不僅效率低下&#xff0c;更易因信息斷層導致決策失誤。企智匯建筑施工項目管理系統憑借…

k8s-臨時容器學習

臨時容器學習1. 什么是臨時容器2. 實驗1. 什么是臨時容器 在官網&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/ephemeral-containers/ 中有介紹 臨時容器是用于調試Pod中崩潰的容器或者不具備調試工具&#xff0c;比如在一個運行著業務的容器中&am…

Python 2025:低代碼開發與自動化運維的新紀元

從智能運維到無代碼應用&#xff0c;Python正在重新定義企業級應用開發范式在2025年的企業技術棧中&#xff0c;Python已經從一個"開發工具"演變為業務自動化的核心平臺。根據Gartner 2025年度報告&#xff0c;68%的企業在自動化項目中使用Python作為主要開發語言&am…

Netty 在 API 網關中的應用篇(請求轉發、限流、路由、負載均衡)

Netty 在 API 網關中的應用篇&#xff08;請求轉發、限流、路由、負載均衡&#xff09;隨著微服務架構的普及&#xff0c;API 網關成為服務之間通信和安全控制的核心組件。在構建高性能網關時&#xff0c;Netty 因其高吞吐、低延遲和異步非阻塞 IO 的特性&#xff0c;成為不少開…

基于STM32設計的青少年學習監控系統(華為云IOT)_282

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

手寫Spring底層機制的實現【初始化IOC容器+依賴注入+BeanPostProcesson機制+AOP】

摘要&#xff1a;建議先看“JAVA----Spring的AOP和動態代理”這個文章&#xff0c;解釋都在代碼中&#xff01;一&#xff1a;提出問題依賴注入1.單例beans.xml<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframe…

5G NR-NTN協議學習系列:NR-NTN介紹(2)

NTN網絡作為依賴衛星的通信方式&#xff0c;需要面對的通信距離&#xff0c;通信雙方的移動速度都和之前TN網絡存在巨大差異。在距離方面相比蜂窩地面網絡Terrestrial Network通信距離從最小幾百米到最大幾十km的情況&#xff0c;NTN非地面網絡的通信距離即使是近地軌道的LEO衛…

線掃相機采集圖像起始位置不正確原因總結

1、幀觸發開始時間問題 問題描述: 由于幀觸發決定了線掃相機的開始采集圖像位置,比如正確的位置是A點開始采集,結果你從B點開始觸發幀信號,這樣出來的圖像起始位置就不對 解決手段: 軟件需要記錄幀觸發時軸的位置 1)控制卡控制軸 一般使用位置比較觸發,我們可以通過監…

校園管理系統練習項目源碼-前后端分離-【node版】

今天給大家分享一個校園管理系統&#xff0c;前后端分離項目。這是最近在練習前端編程&#xff0c;結合 node 寫的一個完整的項目。 使用的技術&#xff1a; Node.js&#xff1a;版本要求16.20以上。 后端框架&#xff1a;Express框架。 數據庫&#xff1a; MySQL 8.0。 Vue2&a…

【項目】 :C++ - 仿mudou庫one thread one loop式并發服務器實現(模塊劃分)

【項目】 &#xff1a;C - 仿mudou庫one thread one loop式并發服務器實現一、HTTP 服務器與 Reactor 模型1.1、HTTP 服務器概念實現步驟難點1.2、Reactor 模型概念分類1. 單 Reactor 單線程2. 單 Reactor 多線程3. 多 Reactor 多線程目標定位總結二、功能模塊劃分2.1、SERVER …

浴室柜市占率第一,九牧重構數智衛浴新生態

作者 | 曾響鈴文 | 響鈴說2025年上半年&#xff0c;家居市場在政策的推動下展現出獨特的發展態勢。國家出臺的一系列鼓勵家居消費的政策&#xff0c;如“以舊換新”國補政策帶動超6000萬件廚衛產品煥新&#xff0c;以及我國超2.7億套房齡超20年的住宅進入改造周期&#xff0c;都…

源碼分析之Leaflet中TileLayer

概述 TileLayer 是 Layer 的子類&#xff0c;繼承自GridLayer基類&#xff0c;用于加載和顯示瓦片地圖。它提供了加載和顯示瓦片地圖的功能&#xff0c;支持自定義瓦片的 URL 格式和參數。 源碼分析 源碼實現 TileLayer的源碼實現如下&#xff1a; export var TileLayer GridL…