用户操作
[即时聊天] [发私信] [加为好友]
fudan_abcID:fudan_abc
215191次访问,排名325好友0人,关注者38
fudan_abc的文章
原创 226 篇
翻译 0 篇
转载 0 篇
评论 326 篇
最近评论
yzdai:知道了,是SCSI设备号,CH,...等
yzdai:粗过了一遍.很棒很棒是不用多说.有些调用例就更好了.不是fs而是系统的调用例,比如禁止/允许USB/SCSI端口或设备,或取参数.还有漏掉的图.
zlzdsp或楼主有WORD/PDF请发一下或放在CSDN上.
"...,比如/dev/sda,然后读写这个文件就可以了"是对的.
"没有命令界面"是说没有console,要在自启动文件里自动运行应用程序.那也一样.<……
yzdai:粗过了一遍.很棒很棒是不用多说.有些调用例就更好了.不是fs而是系统的调用例,比如禁止/允许USB/SCSI端口或设备,或取参数.还有漏掉的图.
zlzdsp或楼主有WORD/PDF请发一下或放在CSDN上.
"...,比如/dev/sda,然后读写这个文件就可以了"是对的.
"没有命令界面"是说没有console,要在自启动文件里自动运行应用程序.那也一样.<……
yzdai:在过度疲劳的工作中看到楼主的文章,失笑了多回了.
虽然没太懂,也没来得及看完.我借助它解决了SCSI 设备号固定于硬端口的问题.
赞一个: 是金子总是要发光的.
yzdai:sd 2:0:0:0: Attached scsi removable disk sda
请问上面的 2:0:0:0 的含义?
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky

    原创 kdb代码分析(四)收藏

    新一篇: kdb代码分析(五) | 旧一篇: 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(),你说这不瞎耽误工夫么?你直接调用不就行了么?有这工夫写这段无聊的汇编代码还不如好好品味品味色戒里汤唯姐姐精彩绝伦的床戏呢.

    发表于 @ 2008年03月03日 14:20:00|评论(loading...)|编辑

    新一篇: kdb代码分析(五) | 旧一篇: kdb代码分析(三)

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © fudan_abc