linux内核分析第三周学习笔记

标签(空格分隔): 20135328陈都


陈都 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


构造一个简单的Linux系统MenuOS


上周回顾:

  • 计算机三大法宝

  • 存储程序计算机

  • 函数调用堆栈

  • 中断

  • 操作系统两把宝剑

  • 中断上下文的切换

  • 进程上下文的切换


Linux内核源码简介

我们关注的部分

  • arch/x86目录下的代码
  • init/main.c中start_kernel函数就相当于普通C程序的main函数
  • kernel目录:存放linux内核最核心的代码,用于实现系统的核心模块,包括进程管理、进程调度器、中断处理、系统时钟管理、同步机制等

README

提供内核的各种编译方法、生成文件的查看方法。

  • installing 如何安装内核源代码
  • make mrproper 清理安装时生成的中间代码

启动Linux内核的三个参数:

  • kernel
  • initrd
  • root所在分区、目录

需要知道的一行代码:qemu -kernel (文件名) -initrd (rootfs.img)

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



使用gdb跟踪调试内核

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

-S # 关于-s和-S选项的说明:

-S freeze CPU at startup (use ’c’ to start execution)

-s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb

tcp:xxxx来取代-s选项

另开一个shell窗口

gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

(gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

(gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

总结分析start_kernel

start_kernel:包括很多模块的初始化。

分析内核都会涉及到start_kernel,都会在init初始化。

详细分析从start_kernel到init进程启动的过程

start_kernel函数的执行代码在init目录下的main.c[1]

  1. 500asmlinkage __visible void __init start_kernel(void)
  2. 501{
  3. char *command_line;
  4. char *after_dashes;
  5. 505 /*
  6. * Need to run as early as possible, to initialize the
  7. * lockdep hash:
  8. */
  9. lockdep_init();
  10. set_task_stack_end_magic(&init_task); init_task即手工创建的PCB0号进程即最终的idle进程。
  11. smp_setup_processor_id();
  12. debug_objects_early_init();
  13. 514 /*
  14. * Set up the the initial canary ASAP:
  15. */
  16. boot_init_stack_canary();
  17. 519 cgroup_init_early();
  18. 521 local_irq_disable();
  19. early_boot_irqs_disabled = true;
  20. 524/*
  21. * Interrupts are still disabled. Do necessary setups, then
  22. * enable them
  23. */
  24. boot_cpu_init();
  25. page_address_init();
  26. pr_notice("%s", linux_banner);
  27. setup_arch(&command_line);
  28. mm_init_cpumask(&init_mm);
  29. setup_command_line(command_line);
  30. setup_nr_cpu_ids();
  31. setup_per_cpu_areas();
  32. smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
  33. 538 build_all_zonelists(NULL, NULL);
  34. page_alloc_init();
  35. 541 pr_notice("Kernel command line: %s\n", boot_command_line);
  36. parse_early_param();
  37. after_dashes = parse_args("Booting kernel",
  38. static_command_line, __start___param,
  39. __stop___param - __start___param,
  40. -1, -1, &unknown_bootoption);
  41. if (!IS_ERR_OR_NULL(after_dashes))
  42. parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
  43. set_init_arg);
  44. 551 jump_label_init();
  45. 553 /*
  46. * These use large bootmem allocations and must precede
  47. * kmem_cache_init()
  48. */
  49. setup_log_buf(0);
  50. pidhash_init();
  51. vfs_caches_init_early();
  52. sort_main_extable();
  53. trap_init(); 涉及到中断的初始化
  54. mm_init();
  55. 564 /*
  56. * Set up the scheduler prior starting any interrupts (such as the
  57. * timer interrupt). Full topology setup happens at smp_init()
  58. * time - but meanwhile we still have a functioning scheduler.
  59. */
  60. sched_init();
  61. /*
  62. * Disable preemption - early bootup scheduling is extremely
  63. * fragile until we cpu_idle() for the first time.
  64. */
  65. preempt_disable();
  66. if (WARN(!irqs_disabled(),
  67. "Interrupts were enabled *very* early, fixing it\n"))
  68. local_irq_disable();
  69. idr_init_cache();
  70. rcu_init();
  71. context_tracking_init();
  72. radix_tree_init();
  73. /* init some links before init_ISA_irqs() */
  74. early_irq_init();
  75. init_IRQ();
  76. tick_init();
  77. rcu_init_nohz();
  78. init_timers();
  79. hrtimers_init();
  80. softirq_init();
  81. timekeeping_init();
  82. time_init();
  83. sched_clock_postinit();
  84. perf_event_init();
  85. profile_init();
  86. call_function_init();
  87. WARN(!irqs_disabled(), "Interrupts were enabled early\n");
  88. early_boot_irqs_disabled = false;
  89. local_irq_enable();
  90. 600 kmem_cache_init_late();
  91. 602 /*
  92. * HACK ALERT! This is early. We're enabling the console before
  93. * we've done PCI setups etc, and console_init() must be aware of
  94. * this. But we do want output early, in case something goes wrong.
  95. */
  96. console_init();
  97. if (panic_later)
  98. panic("Too many boot %s vars at `%s'", panic_later,
  99. panic_param);
  100. 612 lockdep_info();
  101. 614 /*
  102. * Need to run this when irqs are enabled, because it wants
  103. * to self-test [hard/soft]-irqs on/off lock inversion bugs
  104. * too:
  105. */
  106. locking_selftest();
  107. 621#ifdef CONFIG_BLK_DEV_INITRD
  108. if (initrd_start && !initrd_below_start_ok &&
  109. page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
  110. pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.\n",
  111. page_to_pfn(virt_to_page((void *)initrd_start)),
  112. min_low_pfn);
  113. initrd_start = 0;
  114. }
  115. 629#endif
  116. page_cgroup_init();
  117. debug_objects_mem_init();
  118. kmemleak_init();
  119. setup_per_cpu_pageset();
  120. numa_policy_init();
  121. if (late_time_init)
  122. late_time_init();
  123. sched_clock_init();
  124. calibrate_delay();
  125. pidmap_init();
  126. anon_vma_init();
  127. acpi_early_init();
  128. 642#ifdef CONFIG_X86
  129. if (efi_enabled(EFI_RUNTIME_SERVICES))
  130. efi_enter_virtual_mode();
  131. 645#endif
  132. 646#ifdef CONFIG_X86_ESPFIX64
  133. /* Should be run before the first non-init thread is created */
  134. init_espfix_bsp();
  135. 649#endif
  136. thread_info_cache_init();
  137. cred_init();
  138. fork_init(totalram_pages);
  139. proc_caches_init();
  140. buffer_init();
  141. key_init();
  142. security_init();
  143. dbg_late_init();
  144. vfs_caches_init(totalram_pages);
  145. signals_init();
  146. /* rootfs populating might need page-writeback */
  147. page_writeback_init();
  148. proc_root_init();
  149. cgroup_init();
  150. cpuset_init();
  151. taskstats_init_early();
  152. delayacct_init();
  153. 668 check_bugs();
  154. 670 sfi_init_late();
  155. 672 if (efi_enabled(EFI_RUNTIME_SERVICES)) {
  156. efi_late_init();
  157. efi_free_boot_services();
  158. }
  159. 677 ftrace_init();
  160. 679 /* Do the rest non-__init'ed, we're now alive */
  161. rest_init();
  162. 681}

  1. -20135301blog ↩︎

Linux内核分析第三周学习笔记的更多相关文章

  1. 20135320赵瀚青LINUX内核分析第三周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...

  2. Linux内核分析——第三周学习笔记

    20135313吴子怡.北京电子科技学院 chapter1 知识点梳理 一.Linux内核源代码简介 (视频中对目录下的文件进行了简介,记录如下) arch目录 占有相当庞大的空间 arch/x86目 ...

  3. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  4. 《Linux内核分析》第二周学习笔记

    <Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  5. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  6. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  7. 《Linux内核分析》第一周学习笔记

    <Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

  8. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

  9. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

随机推荐

  1. 菜鸟对APP界面设计的一些心得小结

    1. 前言 当我看着我以前做的一些app界面,我意识到我应该把我的界面设计能力水平再提升一个,因为实在是丑啊!贴一些以前的设计: 现在看来,是不能看的了.我主要是做需求设计,后面也有一些美工的工作,我 ...

  2. vue-devtoools 调试工具安装

    最近在研究vue单页面应用,一步一步用上全家桶,开发避免不了的就是调试工具,因为vue是进行数据驱动的,单从chrome里面进行element查看,查不到什么鸟东西,必须要进行对数据动向进行关查,那我 ...

  3. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...

  4. MetaMask/provider-engine-3-test

    通过看其test的代码去好好看看它是怎么使用的 1. provider-engine/test/basic.js const test = require('tape') const Provider ...

  5. linux 邮件工具利器sendEmail时效超好

    下载:http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz 安装方法: ) Extract the pac ...

  6. 清北学堂寒假集训DAY1

    第一天,上午讲了些基本的技巧和简单算法,主要就是适应这里. 中午跑到食堂吃了顿“饭”(我并没有挖苦233333),然后回宿舍休息休息 因为 迎接我们的是模拟啊啊啊啊啊阿 下午题一发下来,并没有想象中的 ...

  7. handsontable合并项mergeCells应用及扩展

    由于我这个项目主要是配置多表头信息,主要使用了handsontabel合并项功能. 但是,在该功能使用过程中发现了一些问题和一些自己根据需要做的一些扩展 $("#topFieldDiv&qu ...

  8. 【MongoDB】MongoDB的下载 安装 配置及使用

    windows系统  教程 1.下载地址   (官方提供根据系统位数选择对应的bit.exe下载) 由于自己win32系统不支持该官方版本,在网上又找了个 mongodb-win32-i386版本 p ...

  9. python_分布式进程中遇到的问题

    看文档学习分布式进程中遇到了一下问题,文档里面例题是python2.X,我用的python3.x,就出现了一下莫名奇妙的问题,最终版代码先呈上: taskManager.py # coding:utf ...

  10. Verilog使用相对路径时应注意的问题

    在Quartus编译环境下,使用include, fopen等文件操作指令时,会涉及到文件路径问题. 以 E:\quartus_project\sd_card_controller\rtl\sd_wb ...