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_thread_info(void)
{
struct thread_info *ti;
__asm__(
"move.l %%sp, %0 \n\t"
"and.l %1, %0"
: "=&d"(ti)
: "di" (~(THREAD_SIZE-))
);
return ti;
}
代码比较简单,获取sp寄存器的值,然后和~(THREAD_SIZE-1)相与就得到指向thread_info的指针。原理为何呢?我们都知道每个进程有用一个内核栈,当进程通过某种方式比如系统调用进入内核,需要把栈空间切换到内核栈。默认情况下,内核栈的大小是2个页面,也就是8KB。在栈的顶部保存着thread_info结构,基于栈是从高地址往低地址生长的,所以thread_info就是位于8KB地址区间的起始位置。例如内核栈空间为0xc9563000~0xc9565000(仅仅做示例,不代表任何实际意义),那么架构图如下所示:

如图所示,内核栈中,ESP指向任何时候必定位于0xc9563000~0xc9565000之间,所以此时我们可以看做是内核栈是8KB对齐的,既然如此回想下虚拟页面中如何获取虚拟页框基地址呢?正是把内部偏移位全都置0,然后和地址想与。so~这里也是如此,THREAD_SIZE-1就是栈内偏移位,取反就把除了偏移部分,其余部分全都置1,想与后无论如何结果始终指向内核栈区间的起始位置,图中为例就是0xc9563000.that's all,thank you!!
感谢主!
参考:
Linux内核3.10.1源码
linux内核获取当前进程路径分析的更多相关文章
- 【转载】linux内核笔记之进程地址空间
原文:linux内核笔记之进程地址空间 进程的地址空间由允许进程使用的全部线性地址组成,在32位系统中为0~3GB,每个进程看到的线性地址集合是不同的. 内核通过线性区的资源(数据结构)来表示线性地址 ...
- Linux内核初探 之 进程(三) —— 进程调度算法
一.基本概念 抢占 Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起 非抢占的系统需要进程自己让步(yielding) 进程类型 IO消耗型 经常处于可运行态,等待IO操作过程会阻塞 ...
- Linux内核剖析 之 进程简单介绍
1.概念 1.1 什么是进程? 进程是程序运行的一个实例.能够看作充分描写叙述程序已经运行到何种程度的数据结构的汇集. 从内核观点看.进程的目的就是担当分配系统资源(CPU时间,内存 ...
- linux内核学习之六 进程创建过程学习
一 关于linux进程概念的补充 关于进程的基本概念这里不多说,把自己的学习所得作一些补充: 1. 在linux内核中,系统最多可以有64个进程同时存在. 2.linux进程包含的关键要素:一段可执行 ...
- 放开Linux内核对用户进程可打开文件数和TCP连接的限制
一. 检查linux内核uname -alsb_release -a 二. 用户进程可打开文件数限制1) vim /etc/security/limits.conf* - nof ...
- Linux:获取当前进程的执行文件的绝对路径
摘要:本文介绍Linux的应用程序和内核模块获取当前进程执行文件绝对路径的实现方法. 注意:使用此方法时,如果执行一个指向执行文件的链接文件,则获得的不是链接文件的绝对路径,而是执行文件的绝对路径. ...
- linux内核线程,进程,线程
http://blog.csdn.net/dyllove98/article/details/8917197 Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起.( ...
- Linux内核的idle进程分析
1. idle是什么 简单的说idle是一个进程,其pid号为 0.其前身是系统创建的第一个进程.也是唯一一个没有通过fork()产生的进程. 在smp系统中,每一个处理器单元有独立的一个执行队列,而 ...
- linux内核——会话、进程组、线程组
会话.进程组.线程组总体关系示意图 待插入 Session(会话)与进程组 Shell 分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group).一个前台作业可以由多个进程组 ...
随机推荐
- ParagraphFormat 对象【精品】
ParagraphFormat 对象 贡献者:motolola 日期:2009-05-27 阅读:5261 回复: 相关标签:wps > API > paragraphfo ...
- DevExpress v15.2新功能介绍视频(25集全)
DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...
- Unix系统编程()进程和程序
进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包括的内容如下所示. 二进制格式标识:每个程序文件都包含用于描 ...
- list中存放map实例
list中存放map实例 2016年08月08日 18:46:14 阅读数:22279 List中存放Map遍历输出的实例 import java.util.ArrayList; import ...
- 得到application
ServletContext application = request.getSession().getServletContext(); String basePath = (Str ...
- C#_GDI+编程教程
第7章 C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1 GDI+绘图基础 编写图形程序时需要使用GDI( ...
- [android] AndroidManifest.xml -【manifest】
<manifest> 原文链接:http://www.android-doc.com/guide/topics/manifest/manifest-element.html 最早引入的AP ...
- thinkphp 原生sql使用分页类
public function index(){ import("@.ORG.Page"); //导入分页类 $Dao = M(); $count = count($Dao-> ...
- tensorflow 保存训练模型ckpt 查看ckpt文件中的变量名和对应值
TensorFlow 模型保存与恢复 一个快速完整的教程,以保存和恢复Tensorflow模型. 在本教程中,我将会解释: TensorFlow模型是什么样的? 如何保存TensorFlow模型? 如 ...
- 数据库面试题之PL/SQL面试题
create table employee( id ) not null, -- 员工工号 salary ,) not null, -- 薪水 name ) not null -- 姓名 ); 第一题 ...