linux内核目录结构

  • arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录。PC机一般都基于此目录。

  • include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下。

  • init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件。这是研究核心如何工作的好起点。

  • mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下。

  • drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound。

  • ipc目录包含了核心进程间的通信代码。

  • modules目录存放了已建好的、可动态加载的模块。

  • fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录。

  • Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下。

  • net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面。

  • lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下。

  • scripts目录包含用于配置核心的脚本文件。

  • documentation目录下是一些文档,是对每个目录作用的具体说明。

QEMU是一个面向完整PC系统的开源仿真器。在本次实验中它就起到仿真一个Linux系统的作用。

  • -kernel 引用一个linux内核
  • -initrd 初始化一个临时的RAM磁盘,是系统引导过程中挂载的一个临时文件系统。

start_kernel

  • start_kernel函数之前的内容基本都是汇编语言,而从该函数开始内核进入c语言部分,功能则是内核主要功能的初始化。
  • 步骤如下:
    • smp_setup_processor_id(); 制定当前cpu的逻辑号,当系统中只有一个cpu的情况,则此函数不做出操作
    • lockdep_init(); 初始化内核依赖的关系表(hash表)
    • localirq_disable(); 关闭当前CPU中断
    • early_boot_irqs_off(); early_boot_irqs_enabled,通过该标记可以让我们知道是否在early bootup code。
    • early_init_irq_lock_class(); 设置所有IRQ描述符的锁是统一的锁还是各有各的小锁
    • lock_kernel(); 获得大内核锁,该锁可以用来锁定整个内核。
    • time_init(); 初始化tick控制功能,注册clockevents的框架
    • boot_cpu_init(); 设置第一个CPU核为活跃CPU核。若系统为单CPU核系统,则设置仅有的CPU为活跃CPU核。
    • printk(KERN_NOTICE); printk(linux_banner);输出打印版本信息。
    • setup_arch(&command_line); 设置与初始化硬件体系相关的环境并调用
    • setup_per_cpu_areas(); 每个cpu分配pre-cpu结构内存
    • sched_init(); 进程调度器初始化
    • preempt_disable(); 内核的抢占
    • printk(boot_command_line); 提取分析核心启动参数过程(从bootloader中传递)
    • build_all_zonelists(); 建立系统内存页区(zone)链表
    • printk(KERN_NOTICE "Kernel command line: %s/n", boot_command_line); 打印Linux启动命令行参数
    • parse_early_param(); 解析早期格式的内核参数
    • trap_init(); 设置CPU的异常处理函数。
    • init_IRQ(); 初始化IRQ中断和终端描述符。
    • pidhash_init(); 初始化hash表
    • init_timers(); 初始化定时器Timer相关的数据结构。
    • hrtimers_init(); 对高精度时钟进行初始化。
    • softirq_init(); 初始化软中断。
    • time_init(); 初始化系统时间
    • profile_init();对内核的一个性能测试工具profile进行初始化。
    • local_irq_enable(); 使能IRQ中断
    • console_init(); 初始化控制台以显示printk的内容
    • 接下来就是执行rest_init();

进程产生

  • 从rest_init()开始,Linux系统就开始产生进程,通过kernel(kernel_init,NULL,CLONE_FS)启动内核进程kernel_init,也就是1号进程,它管理调度其他的内核进程,并由kthread_create_list全局链表管理其内核线程列表。
  • 接着创建二号进程kthreadadd()
  • 当系统没有进程需要执行的时候,就会调度到idle进程,也就是0号进程,它自系统开始运作时便一直存放于系统之中。在某种角度来说,它创建了1号进程和其他的进程。

实验截图

    • 设置start_kernel的断点与rest_init的断点

linux及安全第三周总结——跟踪分析LINUX内核的启动过程的更多相关文章

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

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

  2. Linux第三周——跟踪分析内核的启动过程

    跟踪分析内核的启动过程实验 张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周主要学习的是对内核 ...

  3. linux内核分析第三周-跟踪分析Linux内核的启动过程

    一.实验流程 1.打开环境 执行命令:cd LinuxKernel/ 执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...

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

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

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

    实验三:跟踪分析Linux内核的启动过程 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.16 ...

  6. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

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

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

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

    一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...

  9. 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点

    跟踪分析Linux内核的启动过程 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.stud ...

随机推荐

  1. 1.1开篇一:C语言编译器的选择---Dev C++

    返回总目录 目录: 1.Dev C++的下载&安装: 2.Dev C++的使用: 前言: 那么多编译器,为什么选择Dev C++?理由有下 理由一:Dev C++ 体积比较小,不占用太多的内存 ...

  2. Linux 小知识翻译 - 「TCP/IP」

    上次说了「协议」相关的话题,这次专门说说「TCP/IP」协议. 这里的主题是「TCP/IP」到底是什么?但并不是要说明「TCP/IP」是什么东西,重点是「TCP/IP」究竟有什么意义,在哪里使用「TC ...

  3. oracle用户权限和角色

    用户权限是最基本的数据库安全控制.其作用就是控制用户对数据的访问,sql语句的执行.当oracle用户创建的时候,可以通过授权来控制用户对数据的连接,数据库对象的操作等等. 在oracle中,分为两种 ...

  4. 17秋 软件工程 团队第五次作业 Alpha 用户反馈

    用户反馈 Bug 测试对不同机型进行了测试,包括: 小米NOTE, MIUI 8.5 稳定版 [已修复]点登录按钮之后自动退出: [已修复]登录界面的背景图片没有显示. 小米4 [已修复]闪退,无法打 ...

  5. 转载 使用axis2构建webservice

    axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...

  6. go标准库的学习-strings-字符串操作

    参考https://studygolang.com/pkgdoc 导入方式: import "strings" strings包实现了用于操作字符的简单函数. 常用的几个函数: f ...

  7. day16 Python 内置函数 大体演示想看就看,会用就行

    1.abs() 获取绝对值 a = -10 print(a.__abs__()) 结果: 10 2.all()  接收一个迭代器,如果跌电气的所有元素都为真,那么返回True,否则返回False tm ...

  8. springboot跨域配置

    前言: 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP request).比如说,域名A ( http://dom ...

  9. java Switch中的case后面加上大括号({})和不加大括号的区别

    java基础求真之switch 的case 后面加上大括号和不加大括号的区别. 下面给出三段代码大家看一下有什么不同以及哪段代码能够编译通过那段代码编译不能通过,为什么?(Why?) 代码片段一: i ...

  10. java语言基础1问题汇总

    1.一个Java类文件中真的只能有一个公有类吗? 程序实验: public class test1 { public static void main( String args[] ){ } publ ...