首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

41.Linux应用调试-修改内核来打印用户态的oops

接下来,我们便来配置内核,从而打印应用程序的oops 2.首先来搜索oops里的:Unable to handle kernel打印语句,看在哪个函数打印的 如下图所示,找到位于__do_kernel_fault...启动内核,试验 如下图所示,执行错误的应用程序,只打印了各个寄存器值,以及函数调用关系,而没有信息: ?...5.接下来,继续修改内核,使应用程序的oops也打印信息出来 在驱动的oops里有"Stack: "这个字段,搜索"Stack: "看看,位于哪个函数 5.1如下图所示, 找到位于__die()函数中...接下来,便来分析PC值,Stack,到底如何调用的 7.首先来分析PC值,确定错误的代码 1)生成反汇编: arm-linux-objdump -D test_debug > test_debug.dis...从上面看出,主要是将0x12(r3)放入地址0x00(r2)中 而0x00是个非法地址,所以出错 8.分析Stack信息,确定函数调用过程 参考: 37.Linux驱动调试-根据oops信息,确定函数调用过程

2.1K50
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核IO技术详解

图中描述了Linux下文件操作函数的层级关系和内存缓存层的存在位置。中间的黑色实线是用户态和内核态的分界线。...从上往下分析这张图,首先是C语言stdio库定义的相关文件操作函数,这些都是用户态实现的跨平台封装函数。stdio中实现的文件操作函数有自己的stdio buffer,这是在用户态实现的缓存。...Linux内核中的IO 这一小节来看Linux内核的IO的结构。...先上一张全貌图[4]: 由图可见,从系统调用的接口再往下,Linux下的IO致大致有三个层次: 文件系统层,以 write 为例,内核拷贝了write参数指定的用户态数据到文件系统Cache中,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间的交互 结合这个图,想想Linux系统编程里用到的Buffered IO、mmap、Direct IO,这些机制怎么和Linux IO联系起来呢

2.3K10

Linux 内核的网络协议

前言 本文主要记录 Linux 内核网络协议的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络...Linux 内核网络协议 协议的全景图 协议的分层结构 逻辑抽象层级: 物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。...毫无疑问,这是整个内核网络协议的核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。...网络协议初始化流程 这需要从内核启动流程说起。...函数 start_kerenl() 将会调用一系列的初始化函数,如:平台初始化,内存初始化,陷阱初始化,中断初始化,进程调度初始化,缓冲区初始化,完成内核本身的各方面设置,目的是最终建立起基本完整的 Linux

2.7K50

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

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节的空间分为两部分,将最高的 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...三、进程内核 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的并不是原先进程用户空间中的,而是一个单独内核空间的,这个称作进程内核

3.3K20

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

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节的空间分为两部分,将最高的 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...三、进程内核 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的并不是原先进程用户空间中的,而是一个单独内核空间的,这个称作进程内核

2.8K50

Linux内核分析内核编程

、原理及组成框架,主要分析Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux 内核,精通Linux内核编程。...第19章“Linux内核调试”分析内核调试的方法,控制台驱动程序以及如何将打印信息显示在控制台上,阐述了日志系统是如何工作的,还说明了ptrace调试跟踪的原理。...、原理及组成框架,主要分析Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux 内核,精通Linux内核编程。...第19章“Linux内核调试”分析内核调试的方法,控制台驱动程序以及如何将打印信息显示在控制台上,阐述了日志系统是如何工作的,还说明了ptrace调试跟踪的原理。...发布者:全程序员长,转载请注明出处:https://javaforall.cn/184438.html原文链接:https://javaforall.cn

11.3K20

Linux 内核架构分析

硬件控制层:该子系统由Linux安装中的所有可能的物理设备组成;例如,CPU,内存硬件,硬盘和网络硬件都是该子系统的成员 2.内核架构 2.1 内核之作用 Linux内核为用户进程提供了虚拟机接口。...进程编程无需知道计算机上安装了什么物理硬件,Linux内核将所有硬件抽象为一致的虚拟接口。...进程间通信(IPC)子系统实现在单个Linux系统上进行进程间通信的多种机制。 从依赖性的角度分析: 进程调度程序子系统使用内存管理器为恢复特定进程的特定进程调整硬件内存映射。...3.各子系统架构分析 3.1 进程调度器架构 进程调度器是Linux内核中最重要的子系统。其目的是控制对计算机CPU的访问。这不仅包括用户进程的访问,还包括其他内核子系统的访问。...3.3.1 模块结构分析 可分为四大模块: 公共驱动抽象模块 由于存在大量不兼容的硬件设备,因此存在大量的设备驱动程序。Linux系统最常见的扩展是添加了新的设备驱动程序。

2.7K30

Linux内核Crash分析

在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为:Linux2.6.32。...一般都是和内核有交互,例如用户空间程序使用系统调用进入内核空间。这时使用的不再是用户空间的空间,使用对应的内核空间。...在Linux-2.6.32内核中thread_info.h文件中有对内核堆栈的定义: #define THREAD_SIZE 8192 在Linux内核中使用下面的联合结构体表示一个进程的线程描述符和内核...,在内核中文件include/linux/sched.h。...在内核中的某一个进程使用了过多的空间时,内核就会溢出到thread_info部分,这将导致严重的问题(系统重启),例如,递归调用的层次太深;在函数内定义的数据结构太大。 ?

4.3K20

用户态内核态、用户内核

二、用户内核 内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每一个进程都有两个,一个用户,存在于用户空间;一个内核,存在于内核空间。...当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容都是用户地址,使用用户;当进程在内核空间时,CPU堆栈指针寄存器里面的内容是内核空间地址,使用内核。...进程陷入到内核态后,先把用户态堆栈的地址保存在内核之中,然后设置堆栈指针寄存器的内容为内核的地址,这样就完成了用户内核的转换;当进程从内核态恢复到用户态之后时,在内核态之后的最后将保存在内核里面的用户的地址恢复到堆栈指针寄存器即可...这样就实现了用户内核的互转。 那么,知道从内核转到用户态时,用户的地址是在陷入内核的时候保存在内核里面的,但是在陷入内核的时候,如何知道内核的地址?...所以在进程陷入内核的时候,直接把内核顶地址给堆栈指针寄存器就可以了。

1.8K20

一文搞懂 | Linux 中的各种(进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节的空间分为两部分,将最高的 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...三、进程内核 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的并不是原先进程用户空间中的,而是一个单独内核空间的,这个称作进程内核

4.6K20

如何学习 Linux 内核网络协议

协议的细节 下面将介绍一些内核网络协议中常常涉及到的概念。...sk_buff 结构自身并不存储报文内容,它通过多个指针指向真正的报文内存空间: sk_buff 是一个贯穿整个协议层次的结构,在各层间传递时,内核只需要调整 sk_buff 中的指针位置就行。...而这里提到的 socket 和 sock 是内核中的两个数据结构,其中 socket 向上面向用户,而 sock 向下面向协议。 如下图所示,这两个结构实际上是一一对应的。...L3->L4 我们知道网络协议是分层的,但实际上,具体到实现,内核协议的分层只是逻辑上的,本质还是函数调用。...Netfilter Netfilter 是报文在内核协议必然会通过的路径,我们从下面这张图就可以看到,Netfilter 在内核的 5 个地方设置了 HOOK 点,用户可以通过配置 iptables

1.4K20

如何学习 Linux 内核网络协议

1 协议的细节 下面将介绍一些内核网络协议中常常涉及到的概念。...sk_buff 结构自身并不存储报文内容,它通过多个指针指向真正的报文内存空间: sk_buff 是一个贯穿整个协议层次的结构,在各层间传递时,内核只需要调整 sk_buff 中的指针位置就行。...而这里提到的 socket 和 sock 是内核中的两个数据结构,其中 socket 向上面向用户,而 sock 向下面向协议。 如下图所示,这两个结构实际上是一一对应的。...L3->L4 我们知道网络协议是分层的,但实际上,具体到实现,内核协议的分层只是逻辑上的,本质还是函数调用。...Netfilter Netfilter 是报文在内核协议必然会通过的路径,我们从下面这张图就可以看到,Netfilter 在内核的 5 个地方设置了 HOOK 点,用户可以通过配置 iptables

1.4K20

一文读懂 | Linux 中的各种:进程 线程 内核 中断

各种的内存位置? 介绍完的工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节的空间分为两部分,将最高的 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程的初始化大小是由编译器和链接器计算出来的,但是的实时大小并不是固定的,Linux 内核会根据入情况对区进行动态增长(其实也就是添加新的页表)。...二、线程Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...Linux 为什么需要区分这些? 为什么需要区分这些,其实都是设计上的问题。这里就我看到过的一些观点进行汇总,供大家讨论: 1. 为什么需要单独的进程内核

1.6K20

33.Linux驱动调试-根据oops信息,确定函数调用过程

上章链接入口: https://blog.csdn.net/qq_16933601/article/details/104327937 在上章里,我们分析oops的PC值在哪个函数出错的 本章便通过信息来分析函数调用过程...1.上章的oops信息如下图所示: ?...当内核的某个函数出问题时,内核便通过LDMIA,将顶sp打印出来,然后顶sp+4,直到到达最初的顶 2.2我们以下图的3个函数为例: ?   ...若c()函数出问题后,内核就会打印b()函数的内容(0x03,LR), 打印a()函数的内容(0x02,LR),直到sp到达顶为止   其中lr值,便代表各个函数的调用关系 3.接下来我们便以上章的oops...,所以c008d888位于内核的某个函数里 3.2 然后将内核进行反汇编   在内核源码的根目录下: # arm-none-linux-gnueabi-objdump -D vmlinux > vmlinux.txt

89830

37.Linux驱动调试-根据oops信息,确定函数调用过程

在上章里,我们分析oops的PC值在哪个函数出错的 本章便通过信息来分析函数调用过程 1.上章的oops信息如下图所示: 9fe0: 代表最初的顶SP寄存器位置 9e80:代表函数出错的SP寄存器位置...  2.我们先来分析上图的信息,又是怎样的过程呢?...当内核的某个函数出问题时,内核便通过LDMIA,将顶sp打印出来,然后顶sp+4,直到到达最初的顶 2.2我们以下图的3个函数为例: 若c()函数出问题后,内核就会打印b()函数的内容(0x03,...LR), 打印a()函数的内容(0x02,LR),直到sp到达顶为止 其中lr值,便代表各个函数的调用关系 3.接下来我们便以上章的oops里的信息来分析 在上章里,我们找到PC值bf000078在...c008d888位于内核的某个函数里 3.2 然后将内核进行反汇编 在内核源码的根目录下: # arm-none-linux-gnueabi-objdump -D vmlinux > vmlinux.txt

2K50

原 《Linux内核分析》小节

直到我看到孟宁老师的《Linux内核分析》这门课时,我想我大概可以在二十年后吹牛了:“当年我大二,读Linux内核源码的时候.....” 只是在学习的过程中,没有找到合适的参考书,导致复习有些困难。...通过一个简单的时间片轮转多道程序内核代码,分析linux操作系统 mykernel是一个基于Linux 3.9.4的内核模拟程序,通过观察软件模拟的操作系统运行过程可以帮助我们理解操作系统的进程工作、调度机制...跟踪分析Linux系统的启动过程 MenuOS是一个基于Linux 3.18.6内核的微型操作系统,本文使用gdb来观察系统的启动过程,至init进程被启动为止。...分析system_call的中断处理过程 本文在原有MenuOS的基础上添加了fork和fork-asm命令,再使用gdb跟踪调试,最后分析Linux系统调用从system_call开始到iret结束之间的整个过程...陈政/arc001    原创作品转载请注明出处  《Linux内核分析》MOOC课程

1.6K60

Linux内核源码分析方法

Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。...我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。...…… 分析Linux内核代码如果能搜集到这些信息,应该说是非常“幸运”了。...因此,通过对待分析的代码进行信息搜集,然后按照上述的流程分析出代码的原本始末是了解内核本质的有效手段。这种按照具体需要分析内核代码的方式,为快速进入Linux内核的世界提供了可能。...通过这种方式,不断的对内核的其他模块分析,最后综合得到自己对Linux内核的理解,也就达到了我们学习Linux内核的目的。 最后向大家推荐两本学习内核的参考书。

5.2K70
领券