`
cjc
  • 浏览: 680998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内核栈的使用

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

d

作者:刘洪涛,华清远见嵌入式培训中心讲师。

今天和一个朋友聊天,朋友说在编写驱动时遇到一个怪异的问题。他在内核中使用了一个深度函数调用(多层嵌套的函数),但没有实现预定的效果,但如果把嵌套去掉,函数就没问题了。当时我也没有多想,就回答可能是编译器的问题。回来后头脑中又浮现出这个问题,突然想到内核栈,觉得这个问题的原因应该出在内核栈上。下面简要介绍下内核的知识。

用户空间运行的程序可以从用户空间的栈上分配大量的空间来存放变量或数组、大的结构体。之所以可以这么做,是因为用户空间栈本身比较大,而且还能动态增长。进程的内核栈即不大也不能动态增长;它在32位机上的内核栈为8KB,而64位机是16KB。

每个进程都有自己的内核栈。进程在内核执行期间的每个调用链必须放在自己的内核栈上。中断处理程序也使用配它们打断的进程堆栈。这就意味着,在最恶劣的情况下,8KB的内核栈可能会被多个函数的嵌套调用链和几个中断程序来共享。呵呵,显然深度的嵌套会导致溢出了。

节省内核栈的方法有:减少局部变量、大型数组和结构体、嵌套调用链。

分享到:
评论

相关推荐

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    内核栈是进程或线程在内核模式下运行时使用的栈,它用于处理系统调用、中断和异常等内核级别的操作。中断栈则用于处理中断发生时的上下文切换,保证中断处理能够顺利进行而不会影响到当前执行的上下文。 当一个进程...

    Linux内核的栈使用,问题的定位

    Linux 内核栈使用与问题定位 Linux 内核栈使用是 Linux 内核或驱动开发人员常见的功能之一。栈回溯功能可以快速定位到在内核哪个函数崩溃,大概在函数什么位置,大大简化了问题排查过程。基于 MIPS、ARM 架构 Linux...

    试验四-基于内核栈切换的进程切换.zip

    试验四-基于内核栈切换的进程切换,回答问题: (1)为什么要加 4096; (2)为什么没有设置 tss 中的 ss0。 答: (1)由于Linux 0.11进程的内核栈和该进程的PCB在同一页内存上(一块4KB大小的内存),其中PCB位于...

    thread_info 与内核栈 stack 关系.pdf

    在进程的内存布局中,`thread_info`结构位于内核栈的低端,而内核栈则自该区域的高端开始向下扩展。当进程从用户态切换到内核态时,`esp`寄存器会指向`thread_info`区域的顶部,即内核栈的底部。 `thread_union`是...

    Linux内核协议栈的详解完整版

    详解Linux协议栈的数据流向,SOCKET的操作流程,unicast multicast等等的区别。

    对Linux的进程内核栈的认识-kthreadd-init1

    进程内核栈是每个进程在进入内核空间时使用的栈,它在进程创建时由内核分配,并且与进程的`struct task_struct`结构体相关联。`struct task_struct`包含一个指针`stack`,指向内核栈的底部。`struct thread_info`...

    Linux内核网络栈源代码情景分析_12390610.pdf

    Linux内核网络栈源代码情景分析

    基于汇编语言实现内核栈切换的进程切换【100013093】

    修改 fork(),由于是基于内核栈的切换,所以进程需要创建出能完成内核栈切换的样子 修改 PCB,即 task_struct 结构,增加相应的内容域,同时处理由于修改了 task_struct 所造成的影响 用修改后的 Linux 0.11 仍然...

    linux内核协议栈源码解析(2.6.18内核)

    7. **多线程与并发**:为了提高处理效率,Linux内核协议栈使用了多线程和并发技术。例如,net_rx_action软中断会被调度到不同的CPU核心上执行,从而实现并行处理。 8. **网络设备驱动**:设备驱动是内核与硬件交互...

    操作系统实验 4 基于内核栈切换的进程切换.docx

    通过本实验,学生可以深入理解进程和进程切换的概念,熟悉进程管理和CPU 管理的机制,了解PCB、LDT、内核栈、内核态等知识点,并学会使用这些知识点解决实际问题。 二、实验内容 实验内容主要包括四个部分: 1. ...

    Linux 系统内核级软件的调试技术(四)

    此外,内核栈使用情况的监控、驱动核心的详细调试信息输出,以及SCSI设备的详细错误报告等选项都可以帮助开发者更准确地定位和解决问题。 以上提到的调试选项都能够帮助开发者在软件开发过程中提前发现和解决潜在的...

    《linux内核网络栈源代码情景分析》.(曹桂平).[PDF].&ckook;.pdf.zip

    《Linux内核网络栈源代码情景分析》是曹桂平撰写的一本深入解析Linux内核网络处理机制的著作。这本书详细介绍了Linux操作系统如何处理网络数据包,从硬件接口到高层协议栈的每一个环节,帮助读者理解Linux网络内核的...

    LINUX-1.2.13内核网络栈实现源代码分析.pdf

    ### Linux 1.2.13 内核网络栈实现源代码分析 #### 概述 《LINUX-1.2.13内核网络栈实现源代码分析.pdf》是一份详细介绍了Linux 1.2.13内核中网络栈实现原理和技术细节的文档。该文档由中国科学技术大学近代物理系快...

    LINUX-1.2.13内核网络栈实现源代码分析

    ### Linux 1.2.13 内核网络栈实现源代码分析 #### 知识点一:Linux 1.2.13 内核网络栈背景介绍 **Linux 1.2.13** 是一个较为古老的内核版本,但它的网络栈实现对于初学者来说是一个非常好的学习资源。该版本的网络...

    内核协议栈数据包转发完全解析

    内核协议栈数据包转发完全解析 内核协议栈数据包转发是指操作系统在处理网络数据包时的处理过程。该过程涉及到网络接口、驱动程序、数据包接收、队列层、网络层等多个方面。 一、内核协议栈数据包转发目录 在内核...

    linux内核协议栈分析

    Linux内核协议栈是Linux操作系统中负责处理网络数据包传输的核心组件。它按照TCP/IP协议模型的分层设计,将网络通信划分为链路层、网络层、运输层和应用层四个层次,并为每层提供了相应的协议实现与数据结构。 在...

    linux内核协议栈SCTP协议处理简析

    Linux 内核协议栈 SCTP 协议处理简析 Linux 内核协议栈中 SCTP 协议处理是指 Linux 操作系统中对 Stream Control Transmission Protocol(流控制传输协议)的实现和处理过程。SCTP 是一种可靠的传输层协议,旨在...

    白话设备栈 windows内核

    windows内核 设备栈 deviceObjectStack sfilter windbg截取最简单的附加设备栈历程,实时分析地址 让你对设备栈一目了然

    添加内核网络栈协议 介于二层与三层间

    考虑到内核版本为2.6.34,这是一个相对早期的Linux内核,因此理解这个过程对于深入学习Linux内核和网络协议栈的定制至关重要。 首先,我们需要了解二层和三层协议的基本概念。二层协议,如以太网协议(Ethernet)和...

Global site tag (gtag.js) - Google Analytics