跟踪分析Linux内核的启动过程

原创 2015年07月10日 16:18:32

跟踪分析Linux内核的启动过程

使用 gdb 跟踪调试内核

  • 使用 qemu

    qemu -kernel linux-3.18.6 /arch/x86/boot/bzImage -initrd rootfs.img -s -S
    

    参数:

    • -s:在初始化时冻结 CPU
    • -S: 为 gdb 分配1234端口

image

  • gdb 调试

    另开 shell

    gdb
    (gdb) file linux-3.18.6/vmlinux  #在 gdb 界面中 target remote之前加载符号表
    (gdb) target remote :1234   #建立连接
    (gdb) break start_kernel    #设置断点
    

    image

    image

从 start_kernel 开始到 init 进程启动

  • set_task_stack_end_magic()

    为了检测栈溢出

  • smp_setup_processor_id()

    设置对称多处理器

  • cgroup_init_early ()

    初始化 Control Groups

    *Control Groups provide a mechanism for aggregating/partitioning sets of
    tasks, and all their future children, into hierarchical groups with
    specialized behaviour.*

  • page_address_init()

    页地址初始化(属于内存管理部分)

  • setup_arch()

    setup_arch - architecture-specific boot-time initializations

  • build_all_zonelists()

    Called with zonelists_mutex held always unless system_state == SYSTEM_BOOTING.

  • page_alloc_init ()

  • setup_log_buf ()

    初始化log 缓冲区(kernel/printk/printk.c)

  • pidhash_init ()

    初始化 pid 哈希表

    The pid hash table is scaled according to the amount of memory in the machine. From a minimum of 16 slots up to 4096 slots at one gigabyte or more.

  • vfs_caches_init_early ()

  • sort_main_extable ()

    Sort the kernel’s built-in exception table

  • trap_init ()

    初始化中断向量

  • mm_init ()

    内存管理初始化

  • sched_init ()

    调度服务初始化

  • ……

  • rest_init()

    剩余初始化

    • kernel_init:init进程
    • kthreadd:内核线程
    • cpu_idle进程:代码中一直循环,如果系统中没有可执行的进程时,执行 idle 进程

总结

  • 在 start_kernel执行到最后部分时,在 rest_init 中 新建了kernel_init 进程,kernel_thread(kernel_init, NULL, CLONE_FS);,init 进程是系统中的1号进程,是以后所有用户态进程的祖先,然后新建kthreadd进程,pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);,kthreadd 作为2号进程,是所有内核线程的祖先,在cpu_startup_entry(CPUHP_ONLINE)中,是一个 while(1)循环,始终有一个 idle 进程在执行,如果系统还总没有任何可以执行的进程时,idle 进程会执行。

最后引用孟宁老师的一段话:

道生一:(start_kernel)

一生二:(kernel_init 和 kthreadd)

二生三:(即0,1,2号进程)

三生万物:(1号进程是所有用户态进程祖先,2号进程是所有内核线程祖先)

版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com)

《Linux内核分析》(三)——跟踪分析Linux内核的启动过程

作者:徐恒 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 实验环境:c+Lin...
  • FIELDOFFIER
  • FIELDOFFIER
  • 2015年08月16日 21:29
  • 1979

跟踪分析Linux内核的启动过程

实验指导 使用实验楼的虚拟机打开shell 执行命令:cd LinuxKernel/ 执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzIma...
  • u013232740
  • u013232740
  • 2015年03月17日 14:53
  • 467

Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

本文介绍了Linux内核的启动过程,分析了系统的关键部分代码从而可以让大家从一个大体上谅解Linux的启动过程,本人也是Linux的菜鸟级别。网络上很多的分析不太好动希望同属于初学者,这篇文章对大家有...
  • finzale
  • finzale
  • 2015年03月20日 22:33
  • 1944

分析Linux内核启动过程:从start_kernel到init

郑德伦 原创作品转载请注明出处《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 STEP1:在自己的linux...
  • a363344923
  • a363344923
  • 2015年03月17日 20:05
  • 7188

理解MySQL启动过程及常见启动故障处理

Mysql启动配置文件加载路径 Mysql启动的方式 Mysql启动的内部流程 常见启动故障及分析过程  Mysql可以读取到的配置文件路径顺序 /etc/my.cnf---->/etc/m...
  • jerry____wang
  • jerry____wang
  • 2017年02月17日 11:52
  • 3463

Linux内核分析:跟踪分析Linux内核的启动过程

张家骥 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000...
  • Neo19901121
  • Neo19901121
  • 2015年03月20日 01:38
  • 662

利用gdb跟踪分析Linux内核的启动过程

刘文 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 今天的实验我们使用g...
  • Morse1113
  • Morse1113
  • 2017年03月11日 15:26
  • 286

实验三:跟踪分析Linux内核的启动过程

1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息、符号表的最初的内核,大小约23MB;  命令...
  • sinat_34144680
  • sinat_34144680
  • 2016年03月09日 14:06
  • 212

Linux内核分析——跟踪分析Linux内核的启动过程

张瑜 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000一、实验过程:实验内容为使用gdb跟踪调试内核从start...
  • u010771356
  • u010771356
  • 2017年03月11日 20:22
  • 132

学习笔记3-跟踪分析Linux内核的启动过程

跟踪分析Linux内核的启动过程         本周孟老师以自己的一个简单操作系统menuOS为例,介绍了linux内核的目录结构、如何调试linux内核。由于自己虚拟机上加载debug信息(f...
  • u013546587
  • u013546587
  • 2015年03月21日 23:52
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:跟踪分析Linux内核的启动过程
举报原因:
原因补充:

(最多只允许输入30个字)