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…