位置: 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未知错误)

  • 长春坐公交怎么用微信支付(长春坐公交怎么刷码)

    长春坐公交怎么用微信支付(长春坐公交怎么刷码)

  • word怎么设置纸型为16开(word怎么设置纸张为a4)

    word怎么设置纸型为16开(word怎么设置纸张为a4)

  • 笔记本电脑能下载万能钥匙吗(笔记本电脑能下载歌曲到优盘吗)

    笔记本电脑能下载万能钥匙吗(笔记本电脑能下载歌曲到优盘吗)

  • i39100f相当于i5几代(i39100f相当于i5什么级别)

    i39100f相当于i5几代(i39100f相当于i5什么级别)

  • 网易云音乐怎么取消收藏歌单(网易云音乐怎么转换成mp3格式)

    网易云音乐怎么取消收藏歌单(网易云音乐怎么转换成mp3格式)

  • 网易考拉和考拉海购有什么区别(网易考拉和考拉海购哪个便宜)

    网易考拉和考拉海购有什么区别(网易考拉和考拉海购哪个便宜)

  • 抖音吞画质怎么办(抖音里画质)

    抖音吞画质怎么办(抖音里画质)

  • 抖音多少人在玩(抖音多少人在玩游戏)

    抖音多少人在玩(抖音多少人在玩游戏)

  • 二级密码是什么意思	(哈利波特二级密码是什么)

    二级密码是什么意思 (哈利波特二级密码是什么)

  • 华为nova7怎么录屏(华为nova7怎么录入门禁卡)

    华为nova7怎么录屏(华为nova7怎么录入门禁卡)

  • 不同网络体系结构的网络互联时需要使用(不同网络体系结构互联)

    不同网络体系结构的网络互联时需要使用(不同网络体系结构互联)

  • 淘宝退货需要先确认收货吗(淘宝退货需要先垫付运费吗)

    淘宝退货需要先确认收货吗(淘宝退货需要先垫付运费吗)

  • 苹果x充电到80就充不进去了(苹果x充电到80就不充了怎么回事)

    苹果x充电到80就充不进去了(苹果x充电到80就不充了怎么回事)

  • iphone11pro快充是什么意思(iphone11pro快充功率)

    iphone11pro快充是什么意思(iphone11pro快充功率)

  • 苹果11与xs的区别(苹果11和xs的区别是什么)

    苹果11与xs的区别(苹果11和xs的区别是什么)

  • 广域网中路由器之间的数据传输采用哪种方式(广域网中路由器是否都需要环回地址)

    广域网中路由器之间的数据传输采用哪种方式(广域网中路由器是否都需要环回地址)

  • idqq登录是什么(qq登id形式)

    idqq登录是什么(qq登id形式)

  • 苹果a1567是什么版本(苹果a1568是什么型号)

    苹果a1567是什么版本(苹果a1568是什么型号)

  • 显卡接主板哪个位置(显卡接主板哪个插口)

    显卡接主板哪个位置(显卡接主板哪个插口)

  • qq大小船消失规则(qq小船不会消失吗)

    qq大小船消失规则(qq小船不会消失吗)

  • 小米手环4nfc怎么用(小米手环4nfc怎么连接手机)

    小米手环4nfc怎么用(小米手环4nfc怎么连接手机)

  • 小米8连接电脑看不到文件(小米8连接电脑不显示usb选项怎么办)

    小米8连接电脑看不到文件(小米8连接电脑不显示usb选项怎么办)

  • 石楠花丛中的一只欧亚红松鼠,英格兰 (© Christopher Drabble/Alamy)(石楠花 开花)

    石楠花丛中的一只欧亚红松鼠,英格兰 (© Christopher Drabble/Alamy)(石楠花 开花)

  • HTTP 协议

    HTTP 协议

  • python每行输出五个数(python每行输出五个且对齐)

    python每行输出五个数(python每行输出五个且对齐)

  • 自然人税收管理系统残疾人申报
  • 契税的纳税人是指在我国境内转移房屋土地权的
  • 发票系统口令锁定
  • 专款专用需要缴纳企业所得税吗?
  • 收据四联分别叫什么
  • 视同销售增值税表怎么填
  • 物业公司银行存款专款专怎么做分录
  • 关联交易措施
  • 出售库存的原材料表格
  • 专利转让费用能否计入研发
  • 其他综合收益包含哪些科目
  • 一般贸易免抵退税计算
  • 物流企业税务稽查要点
  • 印花税是当月交还是次月交
  • 已交税金怎么做账
  • 原材料采购的会计核算风险
  • 增值税简易征收范围
  • 个人购买余额宝安全吗?
  • Google Bard VS ChatGPT:哪个是更好的AI聊天机器人?
  • ev4是什么文件
  • 不合格原材料
  • php批量修改
  • 黄石国家公园的英语怎么读
  • uniapp如何使用
  • laravel多条件查询
  • php之间传递数据
  • 华为2022年资产负债表数据
  • 用银行存款支付前欠货款
  • php无限级分类
  • 资本公积属于谁
  • vue-axios详细介绍
  • 借款存入银行会计分录怎么写
  • 劳动法中迟到半小时扣多少钱
  • 劳务派遣公司账务
  • 公司转让后原账本怎么处理
  • 增值税是如何计算的
  • 汇兑损益的现金流量
  • 收据可以当发票吗?
  • 购进交通运输服务可以抵扣
  • 当月进项发票忘认证又开了销项税额怎么办
  • 合伙企业年底如何做账
  • 不征税收入与免税收入的区别是什么
  • 如果发票和实际不一样
  • 复利现值系数表系数表
  • 一季度存款
  • 发票金额跟实际金额为什么不一样
  • 增值税留抵退税最新政策
  • 销售收入用营业收入还是营业总收入
  • Linux CentOS MySQL数据库安装配置教程
  • prometheus operator
  • dos下如何安装win7
  • Windows7任务计划在什么位置?
  • win8系统怎样安装
  • window service2008r2激活
  • linux安装rpm软件包的命令
  • win10提示测试模式
  • win8应用商店打开很慢怎么办
  • mac怎么多开
  • apache 443
  • linux删除u盘记录
  • pniopcac.exe是什么
  • cocos2dx-js
  • Bootstrap与KnockoutJs相结合实现分页效果实例详解
  • node.js console.log
  • python嵌套列表生成
  • unity c#开发
  • unity3d相机设置视角
  • Android4.4 wpa_supplicant深入分析之wpa_supplicant初始化流程续
  • android studio安装过程中出现的问题
  • android fragmentation
  • 微博评论系统
  • 整理Javascript事件响应学习笔记
  • 国家税务总局在哪
  • 上海附加税税率2023
  • 国地税合并人员瘦身
  • 北京地税残疾人补贴政策
  • 不动产租赁和经营租赁税率是多少
  • 南京市车位产权证办理流程
  • 企业所得税地方留存比例2023
  • 四川社保缴费后多久生效
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设