位置: IT常识 - 正文

进程的内核栈是什么?浅谈Linux的进程内核栈(进程核心栈)

编辑:rootadmin
在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先用户空间中的栈,而是一个内核空间的栈,这个称作进程的“... 17-03-15

推荐整理分享进程的内核栈是什么?浅谈Linux的进程内核栈(进程核心栈),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:进程的内核栈是指什么,每个进程都有自己的内核栈,进程 内核栈,进程 内核栈,进程的内核栈是指什么,进程的内核栈是什么,进程的内核栈是什么,进程的内核栈是什么意思,内容如对您有帮助,希望把文章链接给更多的朋友!

在重游《LDD3》的时候,又发现了一个当年被我忽略的一句话:

“内核具有非常小的栈,它可能只和一个4096字节大小的页那样小”

针对这句话,我简单地学习了一下进程的“内核栈”

什么是进程的“内核栈”?

在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先用户空间中的栈,而是一个内核空间的栈,这个称作进程的“内核栈”。

比如,有一个简单的字符驱动实现了open方法。在这个驱动挂载后,应用程序对那个驱动所对应的设备节点执行open操作,这个应用程序的open其实就通过glib库调用了Linux的open系统调用,执行系统调用陷入内核后,处理器转换为了特权模式(具体的转换机制因构架而异,对于ARM来说普通模式和用户模式的的栈针(SP)是不同的寄存器),此时使用的栈指针就是内核栈指针,他指向内核为每个进程分配的内核栈空间。

内核栈的作用

我个人的理解是:在陷入内核后,系统调用中也是存在函数调用和自动变量,这些都需要栈支持。用户空间的栈显然不安全,需要内核栈的支持。此外,内核栈同时用于保存一些系统调用前的应用层信息(如用户空间栈指针、系统调用参数)。

内核栈与进程结构体的关联

每个进程在创建的时候都会得到一个内核栈空间,内核栈和进程的对应关系是通过2个结构体中的指针成员来完成的:

(1)struct task_struct

在学习Linux进程管理肯定要学的结构体,在内核中代表了一个进程,其中记录的进程的所有状态信息,定义在Sched.h (include\linux)。

其中有一个成员:void *stack;就是指向下面的内核栈结构体的“栈底”。

在系统运行的时候,宏current获得的就是当前进程的struct task_struct结构体。

(2)内核栈结构体union thread_union

union thread_union {

struct thread_info thread_info;

unsigned long stack[THREAD_SIZE/sizeof(long)];

};

其中struct thread_info是记录部分进程信息的结构体,其中包括了进程上下文信息:

/*

* low level task data that entry.S needs immediate access to.

* __switch_to() assumes cpu_context follows immediately after cpu_domain.

*/

struct thread_info {

unsigned longflags;/* low level flags */

intpreempt_count;/* 0 => preemptable, <0 => bug */

mm_segment_taddr_limit;/* address limit */

struct task_struct*task;/* main task structure */

struct exec_domain*exec_domain;/* execution domain */

__u32cpu;/* cpu */

__u32cpu_domain;/* cpu domain */

struct cpu_context_savecpu_context;/* cpu context */

__u32syscall;/* syscall number */

__u8used_cp[16];/* thread used copro */

unsigned longtp_value;

struct crunch_statecrunchstate;

union fp_statefpstate __attribute__((aligned(8)));

union vfp_statevfpstate;

#ifdef CONFIG_ARM_THUMBEE

unsigned longthumbee_state;/* ThumbEE Handler Base register */

#endif

struct restart_blockrestart_block;

};

进程的内核栈是什么?浅谈Linux的进程内核栈(进程核心栈)

关键是其中的task成员,指向的是所创建的进程的struct task_struct结构体

而其中的stack成员就是内核栈。从这里可以看出内核栈空间和 thread_info是共用一块空间的。如果内核栈溢出, thread_info就会被摧毁,系统崩溃了~~~

内核栈---struct thread_info----struct task_struct三者的关系入下图:

内核栈的产生

在进程被创建的时候,fork族的系统调用中会分别为内核栈和struct task_struct分配空间,调用过程是:

fork族的系统调用--->do_fork--->copy_process--->dup_task_struct

在dup_task_struct函数中:

static struct task_struct *dup_task_struct(struct task_struct *orig)

{

struct task_struct *tsk;

struct thread_info *ti;

unsigned long *stackend;

int err;

prepare_to_copy(orig);

tsk = alloc_task_struct();

if (!tsk)

return NULL;

ti = alloc_thread_info(tsk);

if (!ti) {

free_task_struct(tsk);

return NULL;

}

err = arch_dup_task_struct(tsk, orig);

if (err)

goto out;

tsk->stack = ti;

err = prop_local_init_single(&tsk->dirties);

if (err)

goto out;

setup_thread_stack(tsk, orig);

......

其中alloc_task_struct使用内核的slab分配器去为所要创建的进程分配struct task_struct的空间

而alloc_thread_info使用内核的伙伴系统去为所要创建的进程分配内核栈(union thread_union )空间

注意:

后面的tsk->stack = ti;语句,这就是关联了struct task_struct和内核栈

而在setup_thread_stack(tsk, orig);中,关联了内核栈和struct task_struct:

static inline void setup_thread_stack(struct task_struct *p, struct task_struct *org)

{

*task_thread_info(p) = *task_thread_info(org);

task_thread_info(p)->task = p;

}

内核栈的大小

由于是每一个进程都分配一个内核栈空间,所以不可能分配很大。这个大小是构架相关的,一般以页为单位。其实也就是上面我们看到的THREAD_SIZE,这个值一般为4K或者8K。对于ARM构架,这个定义在Thread_info.h (arch\arm\include\asm),

#define THREAD_SIZE_ORDER1

#define THREAD_SIZE 8192

#define THREAD_START_SP (THREAD_SIZE-8)

所以ARM的内核栈是8KB

在(内核)驱动编程时需要注意的问题:

由于栈空间的限制,在编写的驱动(特别是被系统调用使用的底层函数)中要注意避免对栈空间消耗较大的代码,比如递归算法、局部自动变量定义的大小等等

本文链接地址:https://www.jiuchutong.com/zhishi/278737.html 转载请保留说明!

上一篇:在Linux系统上开启Initrd文件系统的方法(linux系统怎么打开)

下一篇:mac appstore出现未知错误怎么办 mac市场错误解决办法(macbookappstore未知错误)

  • qq实名认证可以修改几次(qq实名认证可以找回账号密码吗)

    qq实名认证可以修改几次(qq实名认证可以找回账号密码吗)

  • 微信通过手机号转账方法是什么(微信通过手机号转账怎么转)

    微信通过手机号转账方法是什么(微信通过手机号转账怎么转)

  • 苹果手机抹掉后怎么激活(苹果手机抹掉后微信数据怎样恢复)

    苹果手机抹掉后怎么激活(苹果手机抹掉后微信数据怎样恢复)

  • i12耳机怎么双耳(i12如何双耳连接)

    i12耳机怎么双耳(i12如何双耳连接)

  • 华为p跟mate的区别(华为p跟华为mate区别)

    华为p跟mate的区别(华为p跟华为mate区别)

  • r5 3600配什么主板(r5 3600配什么主板 图拉丁)

    r5 3600配什么主板(r5 3600配什么主板 图拉丁)

  • 联想启动热键是哪个(联想起动热键)

    联想启动热键是哪个(联想起动热键)

  • 手机钉钉可以共享屏幕吗(手机钉钉可以共享吗)

    手机钉钉可以共享屏幕吗(手机钉钉可以共享吗)

  • 微信朋友圈仅对你可见是什么意思(微信朋友圈仅对方可见,对方知道吗)

    微信朋友圈仅对你可见是什么意思(微信朋友圈仅对方可见,对方知道吗)

  • q币可以转给别人吗(q币可以转给别人吗2022)

    q币可以转给别人吗(q币可以转给别人吗2022)

  • 抖音绑今日头条有什么用(抖音绑今日头条权重会变高吗)

    抖音绑今日头条有什么用(抖音绑今日头条权重会变高吗)

  • 爱奇艺下载的视频在哪(爱奇艺下载的视频怎么传到u盘)

    爱奇艺下载的视频在哪(爱奇艺下载的视频怎么传到u盘)

  • 抖音蓝v认证的图标是什么(抖音蓝v认证的店铺是真的吗)

    抖音蓝v认证的图标是什么(抖音蓝v认证的店铺是真的吗)

  • 怎么关闭微信开机启动(怎么关闭微信开锁密码)

    怎么关闭微信开机启动(怎么关闭微信开锁密码)

  • 大众点评d币在哪里查看(大众点评的钱是付到哪里了)

    大众点评d币在哪里查看(大众点评的钱是付到哪里了)

  • 淘宝预售商品加购物车能拍到吗(淘宝预售商品加入购物车后又删掉了怎么办)

    淘宝预售商品加购物车能拍到吗(淘宝预售商品加入购物车后又删掉了怎么办)

  • 抖音怎么复制表情(抖音怎么复制表情包文字)

    抖音怎么复制表情(抖音怎么复制表情包文字)

  • 手机上shelper可否卸载(手机上使用ghelper)

    手机上shelper可否卸载(手机上使用ghelper)

  • 电视棒能在电视上用吗(电视棒在电视上怎么用)

    电视棒能在电视上用吗(电视棒在电视上怎么用)

  • pr视频导不出来怎么办(pr视频导不出来是什么原因)

    pr视频导不出来怎么办(pr视频导不出来是什么原因)

  • 快手领的快币在哪里(快手领取的快币在哪)

    快手领的快币在哪里(快手领取的快币在哪)

  • 5.5和6.0屏幕对比(5.8和6.0屏幕对比)

    5.5和6.0屏幕对比(5.8和6.0屏幕对比)

  • 华为畅享9与畅享9plus的区别(华为畅享9与畅享9e的区别)

    华为畅享9与畅享9plus的区别(华为畅享9与畅享9e的区别)

  • 如何消除华为弹出广告(如何消除华为弹窗提示)

    如何消除华为弹出广告(如何消除华为弹窗提示)

  • 手机连接电脑上网设置方法(手机连接电脑上传照片没反应)

    手机连接电脑上网设置方法(手机连接电脑上传照片没反应)

  • 羊了个羊网页版(羊了不眄翻译)

    羊了个羊网页版(羊了不眄翻译)

  • phpcms v9安装失败(安装php5.6)

    phpcms v9安装失败(安装php5.6)

  • 北京增值税发票网上申领流程
  • 境外企业在中国境内承包建筑工程应在
  • 管理费用与税金及附加哪个会影响利润
  • 税收分类编码怎么导出来
  • 车辆购置税计入成本吗
  • 发票的抵扣期限怎么填
  • 营业外支出罚款所得税怎么处理
  • 资产负债表专项储备放哪个科目?
  • 废弃土地的使用年限
  • 收到总公司投资款怎么做账务处理
  • 公司出差开自己的车怎么计算损耗
  • 技术研发阶段的费用如何做分录
  • 销售旧货时的售后是什么
  • 赠送给客户
  • 销售无形资产增值税纳税义务发生时间
  • 公司发的现金
  • 海运增值税率
  • 车间办公费计入什么会计科目
  • 其他应付款如何做账
  • 工商注销债务承担
  • win8系统怎么连接无线
  • 发放股票股利会增加流通在外股票的数量
  • 财务软件税率
  • 公租房租金收入免企业所得税吗
  • 政府奖励怎么做账
  • 税款滞纳金和罚款
  • 房地产预售收入如何缴纳所得税
  • ecshop app搭建
  • vue-router
  • 冰岛羊 (© John Porter LRPS/Alamy)
  • 递延所得税负债是什么科目
  • vue 自适应网站ui框架
  • 深入理解php
  • php css教程下载
  • 哪些费用计入管理费用中
  • 小规模纳税人进项发票怎么做账
  • 万元发票和千元发票
  • 购入固定资产入账成本
  • 购进已经折旧提完的二手车
  • 收入小于成本是什么意思
  • 差额增收企业怎么做账
  • 库存现金怎么算
  • 流动资产损失计入营业外支出吗
  • 税后工资怎么申报个税
  • 跨月的普通发票能作废吗
  • 母猪生小猪会计分录
  • pe市盈率法
  • 公司筹建期间预算怎么写
  • 办公费项目内容
  • 安全生产责任险是强制险吗
  • 哪些个体户要报残保金
  • 成本价和原价一样吗
  • 房地产开发企业增值税怎么算
  • windows版微信能运行小程序吗
  • win8怎么连接
  • 修改ssh端口号
  • linux如何替换
  • win10声音突然变得很沉闷
  • Win7旗舰版系统文件名称
  • windows1021h1新功能
  • 微软 hololive
  • win8.1卸载系统自带应用工具
  • win7系统盘扩大
  • 局域网win7 64位旗舰版共享打印机状态错误0x0000000a的详细图文解决方法
  • ie11 for win8
  • 两个js文件互相取变量
  • jquery关闭当前页面
  • Node.js connect ECONNREFUSED错误解决办法
  • web标准化
  • glviewport超出屏幕范围
  • nodejs爬虫框架crawler
  • jquery可以实现哪些效果
  • 获取input输入值
  • Unity3D游戏开发(第2版)
  • shell脚本spool
  • OnBecameVisible和OnBecameInvisible ,OnWillRenderObject
  • js中遍历数组的方法
  • javascriptcom
  • 借助FileReader实现将文件编码为Base64后通过AJAX上传
  • 宣传费是否要交消费税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设