获取当前进程描述符地址 -- current

Linux内核进程管理子系统有什么第六十五回 —— 进程主结构详解(61) 阅读详情
在内核代码中当需要访问当前进程的task_struct结构时使用的指针current实际上是个宏定义,它是根据当前进程的堆栈指针ESP计算出来的。

#define current get_current()

static inline struct task_struct * get_current(void)
{
    
return current_thread_info()->task;
}

static inline struct thread_info *current_thread_info(void)
{
    
struct thread_info *ti;
    __asm__(
"andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1)));
    
return ti;
}

#define THREAD_SIZE     (8192)
注:
(1)THREAD_SIZE(8K)即thread_info结构体的大小
(2)"andl %%esp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))
将内核堆栈栈顶ESP指针和(~(THREAD_SIZE - 1)相与:获得的结果为内核堆栈最底端地址(也就是结构体thread_info的地址)
struct thread_info {
    
struct task_struct      *task;           
    
struct exec_domain      *exec_domain;  
    unsigned 
long           flags;           
    unsigned 
long           status;          
    __u32                   cpu;                 
    __s32                   preempt_count;
    mm_segment_t            addr_limit;    
    
struct restart_block    restart_block;
    unsigned 
long           previous_esp;  
    __u8                    supervisor_stack[
0];
}
;

struct task_struct {
    
volatile long      state; 
    
struct thread_info *thread_info;
    atomic_t           usage;
    unsigned           
long flags;


ESP、thread.info、task_struct、task_struct.thread的关系结构示意图

            |------------|<---0x015fbfff
            |  kernel |  |
            |  stack  |  |
            |         |  |
            |         |  |
            |        /|/ |        current--+--->|--------------|
            |            |                 |    |              |
            |            |<---%%esp        |    |--------------|
            |            |    (ESP)        |    | *thread_info |
            |            |                 |    |--------------|
            |            |                 |    |              |
            |            |                 |    |              |
 -----------|------------|<---0x015fa030   |    |              |
    /|/     |    *task   |-----------------+    |--------------|
     |      |------------|                      |              |
 thread_info|            |                      |    thread    |
     |      |            |                      |              |
    /|/     |            |                      |--------------|
 -----------|------------|<---0x15fa000         |              |
                                                |              |
                                                |--------------|
                                                  task_struct






手把手教你用Docker快速部署开源MES系统(附避坑指南) 本文提供了一份详细的实战指南,手把手教你使用Docker容器化技术快速部署开源MES系统。内容涵盖从环境准备、项目选型、数据库配置到应用服务器优化、前端部署及生产环境监控的全流程,并附有避坑指南,旨在帮助中小制造企业IT人员和开发者低成本、高效率地构建智能制造解决方案。 阅读详情

相关推荐

rsyslog交叉编译(armv7、armv8、aarch64、arm32平台通用)

该文档描述了如何交叉编译rsyslog到arm64嵌入式平台。

sinat_33909696的博客 1560

Linux 进程管理之current

x86_64和ARM64架构下 current 的实现原理

小立仔 5144

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 838

linux内核调试技巧--current的应用

是什么? current 指针指向当前在运行的进程,内核代码可以通过使用 current 来使用进程特定的信息。指向 task_struct 的current指针在内核堆栈内,是一个全局项。 为什么要用? 查看当前谁在使用内核你关心的那段代码的时候。 怎么用? printk(KERN_INFO "The cuurent process commond : \"%s\" the

K_Linux_ManのBlog 2211

ADS 2024实战:手把手教你搞定2.3-3.5GHz宽带Doherty功放仿真与版图(附源文件)

本文详细解析了在ADS 2024环境中实现2.3-3.5GHz宽带Doherty功放的全流程设计,包括仿真与版图实现。从软件环境搭建、器件模型导入到核心电路设计、匹配网络优化,再到系统集成与版图生成,提供了实战技巧和关键参数设置。特别针对5G通信和卫星应用中的高效率需求,展示了如何通过ADS 2024的新功能提升设计效率。

weixin_42639246的博客 461

LangChain + PlayWright实战:5分钟搞定网页自动化测试(附完整代码)

本文详细介绍了如何利用LangChain与PlayWright构建智能网页自动化测试系统。通过环境配置、核心架构设计、实战Agent构建及性能优化等步骤,开发者可以快速实现高效的Web操作自动化,提升测试效率。文章还提供了完整代码示例和典型问题解决方案。

weixin_27791839的博客 239

Linux内核进程管理:进程的“内核栈”、current宏、进程描述符

目录 linux 进程内核栈 概念 thread_info 有什么用? thread_info 、内核栈、task_struct 关联 current 宏 1、arm 2、ARM64 3、x86 SYSCALL过程调用规范 x86_64进程栈切换 参考 Linux调度——神奇的current current的作用 current的通用实现方法 current在x86架构上的实现 实验示例 Linux调度——进程描述符 进程描述符:task_struct 推荐阅读 .

RToax 1718

CSS字体样式全攻略

🧱 让文字有空间感,适合标题或LOGO。🖋️适合插画、创意工作者的个人页面。🔥 适合标题、品牌名,视觉冲击力强。🧘‍♀️适合极简设计、文化类网站。✨适合科技类网站、博客、作品集。🚀适合游戏、AI、科技类项目。🐰 适合儿童类网站或节日氛围。📖适合时尚、生活方式类内容。🌫️ 适合神秘、梦幻主题。🌃 夜店风、科技感十足。具体效果是文字会上下跳动。

dreams_dream的博客 1804

linux kernel 进程管理,Linux内核进程管理:进程的“内核栈”、current宏、进程描述符...

目录linux 进程内核栈概念在每一个进程的生命周期中,经常会通过系统调用(SYSCALL)陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先用户空间中的栈,而是一个内核空间的栈,这个称作进程的“内核栈”。每个task的栈分成用户栈和内核栈两部分,进程内核栈在kernel中的定义是:union thread_union {struct thread_info thread_in...

weixin_39618275的博客 667

【汽车 OTA 】差分升级

汽车 OTA 差分升级,本质是在整包 OTA 的基础上,通过“只传变化”的方式,大幅减少下载数据量、时间和成本,是当前车端软件升级的主流方向之一。

天赐好车的博客 482

【ComfyUI】Wan2.2 Animate 动作迁移重绘视频生成

本文介绍了一个基于ComfyUI的Wan2.2 Animate视频生成工作流,通过动作迁移和视频重绘技术实现高质量视频创作。该系统融合视频帧重建、动作迁移、图像重绘和音频合成等多种AI技术,核心采用Wan2.2 Animate 14B_fp8模型配合专属VAE解码器和LoRA微调模块。工作流程包含输入预处理、模型加载、特征提取、动作采样生成、解码输出和资源清理六个阶段,通过WanVideo系列节点实现从图像/视频输入到最终视频输出的完整处理。系统支持对参考图像进行视觉特征提取和嵌入生成,结合文本/动作嵌入进

Mr数据杨 2447

linux获取当前进程进程号,Linux内核获取当前进程结构的current宏

上篇文章Linux内核的源码结构简介(1)简单介绍了Linux内核源码的目录结构,以及和进程的task_struct的几个关键变量,最后提到了在内核里获取当前进程的pid的代码:current->pid。current,属于内核的一个宏,指向get_current()函数。#define current get_current()所以代码current,实际是获取get_current()函...

weixin_31440053的博客 2672

dify upload存在SSRF漏洞

Dify 是一个用于构建 AI 应用程序的开源平台。

nnn2188185的博客 1479

进程描述符的处理

转自:http://edsionte.com/techblog/archives/2198/comment-page-1 对于每一个进程而言,内核为其单独分配了一个内存区域,这个区域存储的是内核栈和该进程所对应的一个小型进程描述符——thread_info结构。 01 struct thread_info { 02

复兴之路 1437

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

内核中如何得到进程描述符的地址

1.几个重要的结构: <进程描述符>:struct task_struct 描述一个进程的所有信息的结构,包含众多描述进程属性的字段,以及指向其他与进程相关的结构体的指针从上图可以得知,struct task_struct结构中存在如下重要的字段:thread_info:struct thread_info,线程描述符,里面包含了指向进程描述符的指针mm: struct mm_struct,指

liuxiaowu19911121的专栏 1252

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

第二章 从内核出发

内核把进程存放在叫做任务队列的双向循环链表中。链表中的每一项都是类型为task_struct称为进程描述符的结构 通过current宏查找到当前正在运行进程的进程描述符 每个进程必然处于五种状态中的一种: TASK_RUNNING(运行)。正在执行或者在运行队列中等在执行 TASK_INTERRUPTIBLE(可中断)。进程正在睡眠,等待某些条件达成,可变为运行状态 TASK_UNINTERRUPTIBLE(不可中断)。不会因为接收到信号而被唤醒进入运行状态,其他与可中断状态一样。 ...

yyyxx69的博客 270

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

获取当前进程的task_struct指针------current宏

转载自:http://blog.sina.com.cn/s/blog_6b610d1401012hcf.html Linux内核怎样获取进程任务结构   今天Linux是一个一体化内核(monolithic kernel)系统。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。我

qq_33921804的博客 3186

linux内核 current当前进程指针 task_struct结构介绍

尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义, 它产生一个指针指向结构 task_struct, 在 <Linux/sched.h> 定义. current 指针指向当前在运行的进程. 在一个系统调用执行期间, 例如 open 或者...

whatday的专栏 3989

linux 进程 current,Linux——不同体系结构下获取current

current的含义:内核代码可以引用当前进程, 通过存取全局项 current, 它在 中定义, 它产生一个指针指向结构 task_struct, 在 定义. current 指针指向当前在运行的进程. 在一个系统调用执行期间, 例如 open 或者 read, 当前进程是发出调用的进程. 内核代码可以通过使用 current 来使用进程特定的信息, 如果它需要这样. 实际上, curren...

weixin_29614791的博客 1640

Linux内核获取当前进程指针

一、内存数据表示: 我们在教材或阅读中,经常需要直观的用图示来展示数据在内存中的分布,那么数据是如何在内存中组织的呢?不同的机器有不同的表示法,我们以最常见的Intel X86系列计算机为例来说明这个问题。   如上图示内存示意图:内存低址在上。内存高址在下,内存单位为16bit。对于基于intel i386架构的计算机,系统采用小端字节序来存放数据,所谓小端字节序是指低序字节低地址,高序字

shangyaowei的专栏 533

linux内核获取当前进程路径分析

一个简单的问题,·linux下获取当前进程。我们都知道在内核中获取当前进程可以利用current宏 #define get_current() (current_thread_info()->task) #define current get_current() 通过get_current发现其是利用当前线程获取的当前进程线程结构thread_info结构中有指向其所属的进程指针task static inline struct thread_info *current_

weixin_39094034的博客 677

MySQL获取当前时间的各种方式

MySQL获取当前时间的各种方式

吴名氏的博客 14万+

深入理解Linux进程描述符

在Linux内核中,进程描述符(process descriptor)是用于表示和管理一个进程的所有信息的核心数据结构。每个运行中的进程在内核中都有一个对应的进程描述符,它包含了内核管理该进程所需的全部信息

pengdott的专栏 1074

获取当前进程或线程的PID方法

用户态获取进程ID #include <stdio.h> #include <sys/types.h> #include <unistd.h> // 获取当前进程的PID pid_t pid = getpid(); // 获取当前进程的PPID pid_t ppid = getppid(); 获取线程PID: #include <p...

chengf223的博客 7149

sqlserver获取当前日期的前一天_详解PostgreSQL 如何获取当前日期时间

概述开发数据库应用或者调试代码时,经常需要获取系统的当前日期和时间,今天主要看一下 PostgreSQL 中提供的相关函数。一、当前日期CURRENT_DATECURRENT_DATE 函数用于获取数据库服务器的当前日期:postgres=# SELECT CURRENT_DATE;调用该函数时不需要在函数名后加括号。该日期是服务器的日期,不是客户端的日期。二、当前事务开始时间以下函数可以用于获...

weixin_35713233的博客 1万+

c++ 获取64位进程模块地址_linux 进程内核栈

概念在每一个进程的生命周期中,经常会通过系统调用(SYSCALL)陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先用户空间中的栈,而是一个内核空间的栈,这个称作进程的“内核栈”。每个task的栈分成用户栈和内核栈两部分,进程内核栈在kernel中的定义是:union thread_union { struct thread_info thread_info; unsign...

weixin_33391446的博客 1335
上一篇: switch_to
下一篇: 硬件文境
kernel_details
博客等级 码龄20年 19粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值