`

Android培训班(106)start_kernel函数3

 
阅读更多

unwind_init()

这个函数主要作用是提供调试和错误的初始化。由于内核是基于C语言开发的系统,而C语言是基于栈的函数调用语言,那么当函数出错时,软件开发工程师就逼切地想知道是从那里调用这个函数出错的,也就是想获取函数调用的路径,以便确认这条路径里是否考虑到的情况,如果没有考虑周到,说明就有错误出现了。如果系统提供这种查看函数调用栈的关系,那么会大大方便软件开发工程师对软件修改,提高质量。调用栈的形式一般如下:

unwind backtrace:

[0xffffffff810ef759]unw_backtrace+0x29/0x80

[0xffffffff810ef7d4]test_write+0x24/0x90

[0xffffffff81138940]vfs_write+0xd0/0x1a0

[0xffffffff81138b14]sys_write+0x54/0xa0

[0xffffffff814d7352]system_call_fastpath+0x16/0x1b

在这个调用栈里,从下至上地调用,发现最近发现错误的函数就是unw_backtrace



lockdep_init()

这个函数主要作用是初始化锁的状态跟踪模块。由于内核大量使用锁来进行多进程、多处理器的同步操作,那么死锁就会在代码不合理时出现,这时要知道那个锁造成的,真是比较困难的。遇到这种情况,就需要想办法知道那个锁造成的,因此就需要跟踪锁的使用状态,以便发现出错时,把锁的状态打印出来。造成死锁的情况有很多,主要有以下几种:

1. 同一个进程递归地加锁同一把锁。

2. 同一把锁在两次中断里加锁。

3. 几把锁形成一个闭环死锁。


debug_objects_early_init()

这个函数主要作用是对调试对象进行早期的初始化,其实就是HASH锁和静态对象池进行初始化。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics