一、内存数据表示:

我们在教材或阅读中,经常需要直观的用图示来展示数据在内存中的分布,那么数据是如何在内存中组织的呢?不同的机器有不同的表示法,我们以最常见的Intel X86系列计算机为例来说明这个问题。

如上图示内存示意图:内存低址在上。内存高址在下,内存单位为16bit。对于基于intel i386架构的计算机,系统采用小端字节序来存放数据,所谓小端字节序是指低序字节低地址,高序字节高地址(内存地址增大方向),大端字节序反之,给定系统所用的字节序称为主机字节序;CPU也以小端字节序形式读取数据,如上图所示,如果变量num是16位的short短整类型,则CPU从内存中读出的num=0x1234;如果num是32位的int类型,则CPU从内存中读出的是num=0x56781234,其中num地址是0x12345678,即&num=0x12345678

二、linux内核获取进程任务结构的指针

明白了系统内存数据表示,我们现在来看看linux内核是如何获取当前进程的任务结构指针的,以下代码均参照linux内核2.4.0的源码。

在include\asm-i386\ current.h中

#ifndef _I386_CURRENT_H#define _I386_CURRENT_Hstruct task_struct;static inline struct task_struct * get_current(void){struct task_struct *current;__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));return current;}#define current get_current()#endif /* !(_I386_CURRENT_H) */

每个进程都有一个task_struct任务结构,和一片用于系统空间堆栈的存储空间,他们在物理内存空间中也是联系在一起的,当给进程申请task_struct任务结构空间时,系统将连同系统的堆栈空间一起分配,如下图为某个进程切换时刻的内存图:

下面针对代码实现来分析一下系统如何通过一系列操作获取进程在内核中的任务结构指针的:

由于linux内核分配进程任务结构空间时,是以8KB(2个页面空间,即21*4KB,linux对物理内存空间和虚拟内存空间管理时,均规定其页面单位的尺寸为4KB)为单位来分配的,所以内存应用地址是8KB(213)的整数倍,即指针地址的低13位全为0,所以根据小端字节序,分配内存返回地址应该是指向struct task_struct结构,如图中的0xc2342000地址所指,至于为何采用代码中的做法而不是直接将此指针保存在全局变量中以供应用,内核是从其自身的效率方面来考虑的,我们在此只针对代码解释:

根据上图,此刻内存esp内容必定在0xc2342000和0xc2344000之间的一个数值,我们假设取0xc2343ffe(即堆栈压栈EIP、返回地址、内部数据等相关数据了,地址值要减小;只要符合0xc2342xxx 、0xc2343xxx的地址指针都是正确的),来通过代码运算看是否current的指针是0xc2342000。

__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));

语句的意思是将ESP的内容与8191UL的反码按位进行与操作,之后再把结果赋值给current,其中8191UL=8192-1=213-1,计算过程如下:

8192UL=2^13 0000 0000 0000 0000 0010 0000 0000 00008191UL 0000 0000 0000 0000 0001 1111 1111 1111~8191UL(反码) 1111 1111 1111 1111 1110 0000 0000 00000xc2343ffe 1100 0010 0011 0100 0011 1111 1111 1110andl结果: 1100 0010 0011 0100 0010 0000 0000 0000|| (对照着看)0x c 2 3 4 2 0 0 0

所以按位与操作之后的结果位0xc2342000,正好是struct task_struct结构的地址指针.通过观察可知,只要符合0xc2342xxx 、0xc2343xxx的地址指针经过相同的计算,都可以得到内核进程任务结构的指针。

另外,在进入中断或系统调用时所引用的宏操作(include\asm-i386\ hw_irq.h):

#define GET_CURRENT \"movl %esp, %ebx\n\t" \"andl $-8192, %ebx\n\t"

其原理与上述描述也是一致的。

Linux获取外部程序指针,Linux内核获取当前进程指针相关推荐

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

    尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义 ...

  2. linux 内核 获取随机数

    linux内核的熵池 Linux内核采用熵来描述数据的随机性.熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大.在信息学中,熵被用来表征一个 ...

  3. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  4. Linux 内核获取、初次编译、源码目录分析

    目录 Linux 内核获取 Linux 内核初次编译 Linux 内核源码目录分析 1.arch 目录 2.block 目录 3.crypto 目录 4.Documentation 目录 5.driv ...

  5. Linux3种进程,linux内核获取进程的全路径3种方法

    本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性. /*----------------------------------------------------- ...

  6. linux函数地址获取函数名,函数名/函数地址/函数指针

    函数指针:1.指针变量 2.指针变量指向函数 这正如用指针变量可指向整型变量.字符型.数组一样. 在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址. 可利用该指针变量调用函数, ...

  7. Linux内核链表访问链表头指针,linux内核——链表结构分析

    http://blog.csdn.net/tigerjibo/article/details/8299584 简单整理(使用linux3.0内核) 这里首先学习的是内核中一种抽象定义的双向链表,为了提 ...

  8. 树莓派与DS18B20获取环境温度(Linux)

    树莓派与DS18B20获取环境温度(Linux) 前言 一.硬件准备 1.1 树莓派4B 1.2 DS18B20温湿度传感器 1.4 项目展示效果 二.软件准备 2.1 Vim(Linux) 2.2 ...

  9. Linux 如何取进程运行时间,linux -- 获取进程执行时间

    获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...

  10. linux 获取启动时间不对,linux获取系统启动时间

    1.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytime等函数.今天需要 ...

最新文章

  1. flex4 s:Datagrid s:typicalItem
  2. js动态创建对象_JS深浅拷贝的深入浅出
  3. 程序设计和c语言ppt,程序设计和C语言.ppt
  4. C++中如何读取一个数的位数_求1000以内的水仙花数
  5. react.js基础
  6. -bash: mysql: command not found解决方法(zabbix监控mysql失败)
  7. 硅谷对“元宇宙”一无所知
  8. 以太坊 solidity return 返回值写法 3种格式
  9. union和union all哪个效率高
  10. android 获取收到短信验证码,Android自动获取短信验证码
  11. 人大金仓 创建表空间_人大金仓kingbaseES安装及操作
  12. 别人教我学计算机的作文,我教舅妈学电脑优秀作文.doc
  13. C++ 知识补给(二)
  14. Blurring the Lines between Blockchains andDatabase Systems: the Case of Hyperledger Fabric(翻译)
  15. Pytorch教程之torch.mm、torch.bmm、torch.matmul、masked_fill
  16. 数值计算之 最小二乘法(1)最小二乘计算与线性方程
  17. cufflinks一行代码搞定plotly
  18. Linux系统调用(syscall)原理(转载)
  19. html 表格排列,html表格如何排序?表格排序详解!
  20. 北京大学计算机学院复试名单2021,北京大学研究生招生简章2021(北京大学研究生复试名单)...

热门文章

  1. 论文笔记_S2D.02-2013-CVPR-结合三维场景重建和类别分割
  2. 机器学习精讲中7.1固定特征核中关于N维向量多项式特征映射的理解(一)
  3. 斯坦福大学深度学习公开课cs231n学习笔记(8)神经网络学习过程中的检查事项和参数调优
  4. 师妹:3D视觉方向的招聘,有哪个比较好的社区呢?
  5. 国内手机厂商AR布局报告
  6. WebLogic 11g重置用户密码
  7. day3-3.4字符编码与转码
  8. javascript跨域、iframe跨域访问
  9. 注释(/**/) 给CSS带来的麻烦
  10. .NET简谈互操作(三:基础知识之DllImport特性)