一个简单的问题,·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内核获取当前进程路径分析的更多相关文章

  1. 【转载】linux内核笔记之进程地址空间

    原文:linux内核笔记之进程地址空间 进程的地址空间由允许进程使用的全部线性地址组成,在32位系统中为0~3GB,每个进程看到的线性地址集合是不同的. 内核通过线性区的资源(数据结构)来表示线性地址 ...

  2. Linux内核初探 之 进程(三) —— 进程调度算法

    一.基本概念 抢占 Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起 非抢占的系统需要进程自己让步(yielding) 进程类型 IO消耗型 经常处于可运行态,等待IO操作过程会阻塞 ...

  3. Linux内核剖析 之 进程简单介绍

    1.概念 1.1  什么是进程?     进程是程序运行的一个实例.能够看作充分描写叙述程序已经运行到何种程度的数据结构的汇集.     从内核观点看.进程的目的就是担当分配系统资源(CPU时间,内存 ...

  4. linux内核学习之六 进程创建过程学习

    一 关于linux进程概念的补充 关于进程的基本概念这里不多说,把自己的学习所得作一些补充: 1. 在linux内核中,系统最多可以有64个进程同时存在. 2.linux进程包含的关键要素:一段可执行 ...

  5. 放开Linux内核对用户进程可打开文件数和TCP连接的限制

    一. 检查linux内核uname -alsb_release -a 二. 用户进程可打开文件数限制1) vim /etc/security/limits.conf*       -      nof ...

  6. Linux:获取当前进程的执行文件的绝对路径

    摘要:本文介绍Linux的应用程序和内核模块获取当前进程执行文件绝对路径的实现方法. 注意:使用此方法时,如果执行一个指向执行文件的链接文件,则获得的不是链接文件的绝对路径,而是执行文件的绝对路径. ...

  7. linux内核线程,进程,线程

    http://blog.csdn.net/dyllove98/article/details/8917197 Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起.( ...

  8. Linux内核的idle进程分析

    1. idle是什么 简单的说idle是一个进程,其pid号为 0.其前身是系统创建的第一个进程.也是唯一一个没有通过fork()产生的进程. 在smp系统中,每一个处理器单元有独立的一个执行队列,而 ...

  9. linux内核——会话、进程组、线程组

    会话.进程组.线程组总体关系示意图 待插入 Session(会话)与进程组 Shell 分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group).一个前台作业可以由多个进程组 ...

随机推荐

  1. cocos2d-x中CCEditbox导出到lua

    自从工作后感觉时间较少(每天工作9-22,晚上就不想动了,早上想多睡点),工作中用的是 cocos2d-x.cocos2d-x是一款手机游戏引擎,虽然支持lua,但和love2d相比非纯lua游戏引 ...

  2. DIV中display和visibility属性差别

    DIV中display和visibility属性差别 DIV中display和visibility属性差别还是挺大的,虽然Visibility和Display属性都可以达到隐藏页面元素的目的,但它们的 ...

  3. 大数据(13) - Spark的安装部署与简单使用

    一 .Spark概述 官网:http://spark.apache.org 1.        什么是spark Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校 ...

  4. Spring.Net框架三:使用Spring.Net框架实现多数据库

    在前面的两篇文章中简单介绍了Spring.Net和如何搭建Spring.Net的环境,在本篇文章中将使用Spring.Net实现多数据库的切换. 一.建立一个空白的解决方案,名称为“SpringDot ...

  5. Could not contact Selenium Server; have you started it on 'localhost:4444'

    今天学习selenium RC例子的时候遇到一个问题:java.lang.RuntimeException: Could not contact Selenium Server; have you s ...

  6. 【BZOJ】1662: [Usaco2006 Nov]Round Numbers 圆环数(数位dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1662 这道题折腾了我两天啊-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 果然 ...

  7. 学习:erlang正则

    一.re:run/3. ①.re:run("321321","2132",[caseless]).     {match,[{1,4}]} %% 返回值是 匹配 ...

  8. 解决同一页面jQuery多个版本或和其他js库冲突方法

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  9. lumen 常用辅助函数

    optional 函数接收任意参数并允许你访问对象上的属性或调用其方法.如果给定的对象为空,属性或方法调用返回 null return optional($user->address)-> ...

  10. ionic listview对象的编辑、排序和删除

    1)ionic的listview对象即<ion-list></ion-list> 2)添加并显示编辑按钮(添加其他自定义按钮也一样) can-swipe属性设置为true(默认 ...