kernel crash 发生后的那些事(二)

51 篇文章 9 订阅
__do_kernel_fault主要包含两个函数show_pte and die.
/**************************************************************************/
void show_pte(struct mm_struct *mm, unsigned long addr)
{
    pgd_t *pgd;

    if (!mm)
        mm = &init_mm;

    printk(KERN_ALERT "pgd = %p\n", mm->pgd);
    pgd = pgd_offset(mm, addr);
    printk(KERN_ALERT "[%08lx] *pgd=%08llx",
            addr, (long long)pgd_val(*pgd));

    do {
        pud_t *pud;
        pmd_t *pmd;
        pte_t *pte;

        if (pgd_none(*pgd)){
            printk(KERN_ALERT "pgd_none\n");
            break;
        }
    }while(0);
    printk("\n");
}
这里涉及页表目录和页表项的操作。
对arm体系结构而言,相关的宏包含在文件arch/arm/include/asm/pgtable.h中,如以下:
/* to find an entry in a page-table-directory */
#define pgd_index(addr)        ((addr) >> PGDIR_SHIFT)
#define pgd_offset(mm, addr)    ((mm)->pgd + pgd_index(addr))
#define pgd_val(x)    ((x).pgd[0])

在文件arch/arm/include/asm/pgtable.h中包含
#ifdef CONFIG_ARM_LPAE
#include <asm/pgtable-3level.h>
#else
#include <asm/pgtable-2level.h>
#endif
根据.config 文件,可知没有定义CONFIG_ARM_LPAE,固包含头文件
arch/arm/include/asm/pgtable-2level-types.h
arch/arm/include/asm/pgtable-2level.h
比如PGDIR_SHIFT在这些文件中定义。

从crash的分析结果中,可以明确看出 pgd_t,pud_t,pmd_t,pte_t的定义。
crash> whatis pgd_t
typedef unsigned int [2] pgd_t;
SIZE: 8

crash> whatis pud_t
typedef struct {
    pgd_t pgd;
} pud_t;
SIZE: 8

crash> whatis pmd_t
typedef unsigned int pmd_t;
SIZE: 4

crash> whatis pte_t
typedef unsigned int pte_t;
SIZE: 4

对该例而言,pgd = e6390000
crash> rd 0xe6390000 16
e6390000:  00000000 00000000 00000000 00000000

如打印显示的那样:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = e6390000
[00000000] *pgd=00000000

这里应该弄清楚,arm中为什么pgd_t占8个字节?
task_struct/ mm_struct/ thread_info/ sp 等之间的关系。待续---
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值