内核之旅
文章平均质量分 70
wlp600
这个作者很懒,什么都没留下…
展开
-
vmlinux和bzImage的Makefile部分阅读
本文分析的是linux2.6.36版本的Makefile原创 2010-12-12 13:49:00 · 2609 阅读 · 1 评论 -
perf_event 源码分析
由于工作需要, 去年12月份前后花了半个月的时间全职阅读perf代码,那时还是2.6.30的内核版本,第一次阅读内核代码,走了不少弯路,但也算收获颇丰。现在内核已经是3.0.*了,乘着国庆无事,将这部分代码再重新分析一下,一来方便以后备查,二来再巩固熟悉下内核编程的一些技术。原创 2011-09-30 18:55:38 · 6005 阅读 · 1 评论 -
perf_event源码分析(二)——cmd_report
__cmd_report() => perf_session_open(),打开perf.data=>perf_session_read_header()根据perf.data的头部初始化session->evlist链表上的各个事件。perf_session__proces原创 2011-10-15 10:01:48 · 3682 阅读 · 5 评论 -
VDSO
VDSO(Virtual Dynamically-lined Shared Object),这是一个由内核提供的虚拟.so文件,它不在磁盘上,而在内核里,内核将其映射到一个地址空间中,被所有程序共享,正文段大小为一个页面。$ ldd /bin/lsmod linux-vdso.so.1 => (0x00007ffff7fdf000) libc.so.6 =原创 2011-10-18 23:50:10 · 16750 阅读 · 2 评论 -
call_chain & dump_trace
调用链是剖析工具中常备的一种显示方式,可以为用户呈现明确的函数调用关系,在perf中,可以根据调用链分析主函数的sample分布到了哪些子函数中。在内核调试中,根据调用链可以得到出错函数的上层调用者是谁。调用链的实现其实很简单,就是遍历函数栈,在x86中,bp寄存器指向的内存位置存放的是旧栈帧基地址,这个位置之上(高地址处)是函数返回地址,因此在函数返回时pop %ebp,就是把旧栈帧地址置放原创 2011-10-21 21:49:04 · 2373 阅读 · 0 评论 -
perf_event源码分析(一)——cmd_record
cmd_record是perf用户层的一个核心工具,为之后的report, annotate等工具提供profile,监测数据都记录在perf.data中,后面就是进行上层分析,这里对cmd_record()的分析主要是关注perf.data文件内容组成。parse_events()会根据用户在命令行上的指定来配置监测事件,为每一个事件分配一个perf_evsel结构体,其中记录了事件名称与配原创 2011-10-10 23:04:51 · 5219 阅读 · 0 评论 -
start_kernel
void __init x86_64_start_kernel(char * real_mode_data){ int i; /* 内核映像和模块区域映射的完整性检查 */ ... /* clear bss before set_intr_gate with early_idt_handler */ clear_bss(); /* Make NULL poi原创 2011-11-04 14:31:53 · 2497 阅读 · 0 评论 -
include/linux/init.h
这个头文件只需要包含另一个头文件#include ,这个文件中的宏被用来标记函数和初始化数据为`initialization ` 函数,内核据此认为这些函数只在内核初始化时使用,并在完成初始化后释放这些函数和数据占用的存储。对于函数初始化,在函数名前立即假如__init修饰符,如:static void __initinitme(int x, int y){ extern int原创 2011-11-03 23:22:10 · 5057 阅读 · 0 评论 -
/dev/mem
/dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法。有几个论据倾向于用户空间编程,有时编写一个所谓的用户空间设备驱动对比钻研内核是一个明智的选择,用户空间驱动的好处在于:完整的C库可以链接,驱动可以进行许多奇怪的任务,原创 2011-10-21 13:24:46 · 9130 阅读 · 1 评论