免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: accessory
打印 上一主题 下一主题

调试KERNEL时,找出当前进程信息的方法 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-01-02 22:51 |只看该作者
进来学习~~~

论坛徽章:
0
22 [报告]
发表于 2012-03-27 22:50 |只看该作者
在应用层能有办法找到这个current吗?

论坛徽章:
0
23 [报告]
发表于 2012-03-29 16:44 |只看该作者
楼主所说的方法只适用于当前进程处于内核态时,如果进程处于用户态,ESP指示的是用户态栈,在用户态可以从TSS段(x86架构)里获取内核栈地址。

论坛徽章:
0
24 [报告]
发表于 2012-03-31 18:34 |只看该作者
因为current 只是个宏,在Linux  kernel 2.6.8 中current定义由下列代码实现:

static inline struct thread_info *current_thread_info(void)
{
        register unsigned long sp asm ("sp");
        return (struct thread_info *)(sp & ~0x1fff);
}

static inline struct task_struct *get_current(void)
{
        return current_thread_info()->task;
}

#define current (get_current())

因此current 就是内核当前执行的进程的struct task_struct 结构的指针,  能够理解下面两行代码就可以理解这个原理
        register unsigned long sp asm ("sp");
        return (struct thread_info *)(sp & ~0x1fff);

sp 是寄存器变量,始终等于ARM 当前模式的Stack pointer(r13)的值, Linux内核才创建进程的时候,为每个process 都分配2个连续
的物理页(8KB), 8KB的顶部位descending的stack. 8KB底部存放struct thread_info 结构,thread_info 结构是进程的一个数据结构,
这个结构主要用于任务切换时状态判断和上下文保存(包括进程是否需要被调度出去,抢占计时器,是否有未处理的信号等)这个结构中用个task
指针在进程创建的时候已经初始化指向进程的struct task_struct .

说到调试:
宏是预处理阶段识别的名字,编译后根本就没有宏了,也就是说程序符号表中根本就找不到宏, 所以调试的时候用current 是不行的

调试的时候你只能让gdb告诉你符号(symbol),

论坛徽章:
0
25 [报告]
发表于 2012-11-22 10:25 |只看该作者
谢谢分享哈

论坛徽章:
0
26 [报告]
发表于 2012-12-12 22:27 |只看该作者
使用这个方法也可以在Xen中获取到Dom0的进程id,但是获取不到DomU的

论坛徽章:
0
27 [报告]
发表于 2014-03-14 08:30 |只看该作者
这个帖子说的是用gdb调试kernel吧, 为何不用crash呢?  crash里面什么都有啊

求问 需用gdb调试kernel的场景? 我能想到的是kgdb调试kernel的启动代码,其他的场景不想要用gdb去调试kernel.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP