`
dato0123
  • 浏览: 936255 次
文章分类
社区版块
存档分类
最新评论

kdb代码分析(四)

 
阅读更多

先来看KDB_ENTER().这是与体系结构相关的宏.对于i386来说,我们得看i386特定的patch(kdb-v4.4-2.6.22-i386-1):

14434 Index: linux/include/asm-i386/kdb.h

14435 ===================================================================

14436 --- /dev/null

14437 +++ linux/include/asm-i386/kdb.h

14438 @@ -0,0 +1,45 @@

14439 +#ifndef _ASM_KDB_H

14440 +#define _ASM_KDB_H

14441 +

14442 +/*

14443 + * Kernel Debugger Architecture Dependent Global Headers

14444 + *

14445 + * This file is subject to the terms and conditions of the GNU General Public

14446 + * License. See the file "COPYING" in the main directory of this archive

14447 + * for more details.

14448 + *

14449 + * Copyright (c) 1999-2004 Silicon Graphics, Inc. All Rights Reserved.

14450 + */

14451 +

14452 +/*

14453 + * KDB_ENTER() is a macro which causes entry into the kernel

14454 + * debugger from any point in the kernel code stream. If it

14455 + * is intended to be used from interrupt level, it must use

14456 + * a non-maskable entry method.

14457 + */

14458 +#define KDB_ENTER() do {if (kdb_on && !KDB_IS_RUNNING()) { asm("/tint $129/n"); }} while(0)

14459 +

这里的KDB_IS_RUNNING()虽然意思很明了,我们还是看一下它的定义:

4273 +/*

4274 + * kdb_initial_cpu is initialized to -1, and is set to the cpu

4275 + * number whenever the kernel debugger is entered.

4276 + */

4277 +extern volatile int kdb_initial_cpu;

4278 +extern atomic_t kdb_event;

4279 +extern atomic_t kdb_8250;

4280 +#ifdef CONFIG_KDB

4281 +#define KDB_IS_RUNNING() (kdb_initial_cpu != -1)

4282 +#define KDB_8250() (atomic_read(&kdb_8250) != 0)

4283 +#else

4284 +#define KDB_IS_RUNNING() (0)

4285 +#define KDB_8250() (0)

4286 +#endif /* CONFIG_KDB */

很明显只要kdb_initial_cpu不为-1就表示KDB_IS_RUNNING,或者说只要我们进入了kdb,kdb_initial_cpu肯定不会是-1,而是表示cpu的编号.

asm表示里面包含的是汇编指令.那么这里着int $129是什么意思呢?int是中断指令,这里的中断号是129,129换成十六进制就是0x81.与此同时我们发现i386的那个patch中有下面一段:

14700 Index: linux/include/asm-i386/mach-default/irq_vectors.h

14701 ===================================================================

14702 --- linux.orig/include/asm-i386/mach-default/irq_vectors.h

14703 +++ linux/include/asm-i386/mach-default/irq_vectors.h

14704 @@ -29,6 +29,7 @@

14705 #define FIRST_EXTERNAL_VECTOR 0x20

14706

14707 #define SYSCALL_VECTOR 0x80

14708 +#define KDBENTER_VECTOR 0x81

14709

14710 /*

14711 * Vectors 0x20-0x2f are used for ISA interrupts.

14712 @@ -48,6 +49,7 @@

14713 #define INVALIDATE_TLB_VECTOR 0xfd

14714 #define RESCHEDULE_VECTOR 0xfc

14715 #define CALL_FUNCTION_VECTOR 0xfb

14716 +#define KDB_VECTOR 0xf9

14717

14718 #define THERMAL_APIC_VECTOR 0xf0

14719 /*

这里我们看到KDBENTER_VECTOR被定义成0x81.你凭良心说,KDBENTER_VECTOR你是不是见过?你要说没见过那你一定是瞎说,你说假话的水平和新闻联播有得一拼.当初在初始化那部分,不是有一个kdba_arch_init()?再来回顾一下:

8592 +static int __init

8593 +kdba_arch_init(void)

8594 +{

8595 +#ifdef CONFIG_SMP

8596 + set_intr_gate(KDB_VECTOR, kdb_interrupt);

8597 +#endif

8598 + set_intr_gate(KDBENTER_VECTOR, kdb_call);

8599 + return 0;

8600 +}

没错,就是这里,设置了一个中断门.至于什么是中断门这不用我多说了吧,总之这里这行的效果就是使得中断向量KDBENTER_VECTOR和中断服务函数kdb_call给联系了起来.kdb_call也是跟体系结构相关的,对于i386来说:

8920 Index: linux/arch/i386/kernel/entry.S

8921 ===================================================================

8922 --- linux.orig/arch/i386/kernel/entry.S

8923 +++ linux/arch/i386/kernel/entry.S

8924 @@ -978,6 +978,26 @@ ENTRY(alignment_check)

8925 CFI_ENDPROC

8926 END(alignment_check)

8927

8928 +#ifdef CONFIG_KDB

8929 +

8930 +ENTRY(kdb_call)

8931 + RING0_INT_FRAME

8932 + pushl %eax # save orig EAX

8933 + CFI_ADJUST_CFA_OFFSET 4

8934 + SAVE_ALL

8935 + movl %esp,%ecx # struct pt_regs

8936 + movl $0,%edx # error_code

8937 + movl $1,%eax # KDB_REASON_ENTER

8938 + call kdb

8939 + jmp restore_all

8940 + CFI_ENDPROC

8941 +

8942 +#ifdef CONFIG_SMP

8943 +BUILD_INTERRUPT(kdb_interrupt,KDB_VECTOR)

8944 +#endif /* CONFIG_SMP */

8945 +

8946 +#endif /* CONFIG_KDB */

8947 +

8948 ENTRY(divide_error)

8949 RING0_INT_FRAME

8950 pushl $0 # no error code

,,这里可是一段汇编代码.不是每个人都能看懂的.不过我们也不用每行都看懂,其实很明显的有一行,8938,”call kdb”,这是干嘛?地球人都知道,调用函数kdb().这时候我们猛然发现,原来KDB_ENTER()绕来绕去,最终还是要调用kdb(),你说这不瞎耽误工夫么?你直接调用不就行了么?有这工夫写这段无聊的汇编代码还不如好好品味品味色戒里汤唯姐姐精彩绝伦的床戏呢.

分享到:
评论

相关推荐

    kdb-master.zip

    当我们提到“kdb-master.zip”时,这通常意味着我们正在讨论kdb+的一个源代码版本或者开发分支。本文将深入剖析kdb+的基本概念、核心特性以及在解压后的“kdb-master”目录中的关键文件和它们的功能。 1. **kdb+...

    linux下调试工具kdb

    4. **跟踪点**(tracepoints): kdb可以利用内建的跟踪点功能,记录内核运行中的特定事件,这对于性能分析和问题定位很有帮助。 5. **条件断点**: 可以设置基于特定条件的断点,只有当条件满足时才会触发。 6. **数据...

    q_and_kdb+.pdf

    ### Q_and_kdb+: 金融量化编程语言 ...通过以上分析可以看出,Q 和 kdb+ 为金融行业提供了一套完整的解决方案,不仅能够处理大规模数据集,还支持复杂的数据查询和实时分析。这对于金融市场中的高效决策具有重要意义。

    matlab方差分析代码-kdb.q.kalman.filter.beta.ETFs:kdb+/qkalmanbetamatlabpython

    matlab方差分析代码该项目的代码使用matlab,python和q / KDB +代码编写。 代码互为镜像 我的贡献是将matlab文件转换为q / KDB +,用于卡尔曼增益部分。 代码引用以下方程式:书:Ernest P Chan“算法交易-策略及其...

    kdb内核调试文档等

    - **内存分析**:KDB提供了强大的内存检查功能,如查找特定内存区域,分析内存泄漏等。 - **系统调用追踪**:可以跟踪系统调用,观察其参数和返回值,以了解内核与用户空间的交互。 - **内核环缓冲区查看**:KDB...

    linux源代码分析.zip

    Linux源代码分析是一个深入理解操作系统内核工作原理的重要实践,对于任何希望在系统级编程、设备驱动开发或者想要提升对操作系统理解的IT专业人员来说,这都是一个宝贵的资源。在这个"linux源代码分析.zip"文件中,...

    Linux操作系统内核分析+深入分析linux内核源代码-陈莉君.zip

    其次,"深入分析Linux-内核源代码-陈莉君-人民邮电出版社.pdf"可能侧重于通过源代码分析来理解内核的工作方式。源代码分析可以涵盖: 1. 内核模块:了解如何编写和加载内核模块,以扩展内核功能。 2. 调试技术:...

    linux内核代码分析

    在深入探讨"Linux内核代码分析"这一主题之前,我们首先要理解Linux内核的重要性。Linux内核是操作系统的核心部分,负责管理硬件资源、提供系统调用接口以及协调各个进程之间的交互。它是一套开放源码的软件,允许全...

    kdb_debugger.rar_V2

    通过阅读和分析这个源代码,我们可以了解到以下关键知识点: 1. **KGDB初始化**:KGDB的启动通常在内核启动过程中完成,`kdb_debugger.c`中的相关函数会设置调试器的通信通道,如串口或网络,并初始化必要的数据...

    Linux内核源代码分析.pdf

    《Linux内核源代码分析》是一本深入探讨Linux操作系统核心机制的专业书籍。它不仅涵盖了Linux内核的基础架构,还详细解析了其工作原理,旨在帮助读者深入理解这一开源操作系统的精髓。通过阅读这本书,读者可以了解...

    Linux内核源代码情景分析(上)(下)

    《Linux内核源代码情景分析》是一套深入探讨Linux内核源码的书籍,分为上下两部分。本书旨在帮助读者理解Linux操作系统的核心运作机制,通过分析源代码来揭示其内部的工作原理。书中不仅涵盖了基本的内核架构,还...

    商业编程-源码-KDB论坛 v1.2.0.zip

    源码分析可以帮助我们了解如何在实际项目中高效地利用KDB进行数据存储和查询,以及如何构建适应高并发场景的应用。 其次,作为一个社区平台,KDB论坛 v1.2.0的源码涵盖了用户管理、话题发布、评论互动、搜索功能等...

    Linux内核2·4版源代码分析大全

    《Linux内核2.4版源代码分析大全》是一本深度剖析Linux内核的专业书籍,旨在帮助读者理解和掌握Linux内核的工作原理。该书详细解析了2.4版本的内核源代码,这一版本在Linux发展史上具有重要的里程碑意义,为后来的...

    kdb_debugger.rar_interface

    标题中的“kdb_debugger.rar_interface”暗示了我们要讨论的是一个与调试相关的接口,特别是针对KDB...通过分析“kdb_debugger.c”,我们可以学习如何构建这样的跨系统调试接口,并从中获取调试高级功能的实现思路。

    LINUX内核源代码情景分析

    《LINUX内核源代码情景分析》这本书是深入理解Linux操作系统内核的重要参考资料。它以情境分析的方式,带领读者逐步探索Linux内核的工作原理和设计思路。以下将围绕该书内容,详细介绍Linux内核源代码的相关知识点。...

    kxsystems.github.io:GitHub上的kdb +和q存储库索引

    kdb+和q是金融行业中广泛使用的高性能数据库和编程语言,尤其在实时数据处理和时序数据分析方面表现出色。kxsystems.github.io是kdb+社区在GitHub上的一个项目,它提供了一个综合的索引来展示用户创建的kdb+和q相关...

    linux内核调试文档

    四、kdb高级技巧 1. 使用内存查看和修改命令:`mem`允许查看和修改内存区域,`x`可以用来十六进制显示内存。 2. 追踪数据结构:通过跟踪指针,可以深入理解内核数据结构的变化。 3. 跟踪系统调用:利用`syscall`命令...

    qprofiler:kdb+q 的简单分析器

    **qProfiler:kdb+/q的简易分析器** 在kdb+/q编程环境中,性能优化是至关重要的,因为高效的数据处理能力是这个低延迟、内存数据库系统的核心优势。`qProfiler`工具就是为了帮助开发者深入了解代码执行性能而设计的...

Global site tag (gtag.js) - Google Analytics