1. 阴天☁️

你说你爱烟雨微茫,雨来时你却伞遮霓裳;

你说你爱春光灿烂,阳光普照时你却孑然惆怅;

你说你爱微风轻柔,风拂发梢时你却紧闭门窗;

这便是为何你说你也深深爱我,我却眼波成霜。

2. 今日发问,如何写博客。如何排版

一、书本第三章知识总结

  • 计算机的三大法宝

    • 存储程序计算机
    • 函数调用堆栈
    • 中断
  • 操作系统的两把宝剑
    • 中断上下文的切换——保存现场和恢复现场
    • 进程上下文的切换
  • Linux内核源码的目录结构如下所示。
  • 关键的目录
    • arch:arch目录在Linux内核目录中占比相当庞大,主要原因是arch目录中的代码可以使Linux
      内核支持不同的CPU和体系结构。
    • block:存放Linux存储体系中关于块设备管理的代码。
    • crypto:存放常见的加密算法的C语言代码,譬如crc32、md5、sha1等。
    • drives:驱动目录。
    • fs:文件系统(File System)。
    • init:init是初始化的意思,存放Linux内核启动时的初始化代码。
    • ipc:Linux系统支持的IPC(进程间通信)的代码实现。
    • kernel:存放内核本身需要的一些核心代码文件,其中有很多关键代码,包括pid——进程号等。
    • lib:公用的库文件,里面是一些公用的库函数。需要注意的 是在内核编程中不能用C函数标准库函数。
    • mm: 内存管理,存放Linux的内存管理代码。
    • net:存放网络相关的代码,譬如TCP/IP的协议栈等。
  • 注意事项
    • init目录下有main.c源文件,它是整个Linux内核启动的起点,但它的起点不是main函数,而是start_kernel
      函数,start_kernel函数是初始化Linux内核启动的起点, start_kerne前的代码使用汇编语言来进行硬件初始化。
    • qemu仿真kernel。
    • bzImage是vmlinux经过压缩后的文件,是压缩的内核映像;vmlinux是编译出来的最原始的内核ELF文件。
    • qemu命令中的-s、-S参数,-s表示用1234端口上的gdb-server连接,可以用-gdb tcp:xxxx来代替;-S表
      示在CPU初始化之前冻结,使用c继续执行。
  • 几个函数
    • init目录下的main.c函数
    • start_kernel()函数
    • init_task()函数
    • rest_init()函数

二、实验部分

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

1. 内核运行

2. 重新运行,加上参数,内核被冻结

3. 调试内核

4. 设置断点到start_kernel

5. 设置断点到rest_init

6. 从 start_kernel 开始到 init 进程启动

···
-set_task_stack_end_magic()

 为了检测栈溢出

-smp_setup_processor_id()

设置对称多处理器

-cgroup_init_early ()

初始化 Control Groups

-page_address_init()

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

-setup_arch()

-build_all_zonelists()

-page_alloc_init ()

-setup_log_buf ()

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

-pidhash_init ()

初始化 pid 哈希表

-vfs_caches_init_early ()

-sort_main_extable ()

初始化中断向量

-mm_init ()

内存管理初始化

-sched_init ()

调度服务初始化

-rest_init()

剩余初始化

         -  kernel_init:init进程

         -  kthreadd:内核线程

         -  cpu_idle进程:代码中一直循环,如果系统中没有可执行的进程时,执行 idle 进程

···

(2)部分函数分析

1. rest_init()函数代码展示

···

static noinline void __init_refok rest_init(void)
{
int pid;

rcu_scheduler_starting();
/*
 * We need to spawn init first so that it obtains pid 1, however
 * the init task will end up wanting to create kthreads, which, if
 * we schedule it before we create kthreadd, will OOPS.
 */
kernel_thread(kernel_init, NULL, CLONE_FS);
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);

/*
 * The boot idle thread must execute schedule()
 * at least once to get things moving:
 */
init_idle_bootup_task(current);
schedule_preempt_disabled();
/* 当系统没有进程需要执行时,就调度到idle进程 */
cpu_startup_entry(CPUHP_ONLINE);

}
···

2. start_kernel()分析:

lockdep_init(); //死锁检测模块初始化
debug_objects_early_init(); //初始化堆栈 此堆栈有额外的越界保护功能
page_address_init(); //初始化页表地址
pidhash_init(); //给新进程分配进程号
mm_init(); //初始化内存管理
sched_init(); //启动调度器
radix_tree_init(); //init some links before init_ISA_irqs() //初始化中断

三、实验收获与疑问

(1)收获

1. 线程与进程

  • 进程:指在系统中能够独立运行并作为资源分配的基本单位,进程只能由父进程建立。
    进程的个体是完全独立的,而线程间是彼此依存的。
  • 线程:是进程中的一个实体,作为系统调度的基本单位。
  • 多进程环境中,任何一个进程的终止,不会影响到其他进程。而多线程环境中,父线程
    终止,全部子线程被迫终止(没有了资源)。而任何一个子线程终止一般不会影响其他线程
    ,除非子线程执行了exit()系统调用。任何一个子线程执行exit(),全部线程同时灭亡。可
    以看出,进程和线程是包含的关系,对于书上内核线程的描述就更加迷惑了,又查找了关
    于linux系统下的进程与线程相关资料:
  • 内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也
    参与内核抢占。这个进程的特别之处有两点,第一、该进程没有前台。第二、永远在内核
    态中运行。内核线程类似于用户进程,通常用于并并发处理性质的任务,并且可以抢占调
    度。不同于用户进程,内核线程位于内核空间,并且可以访问内核函数和内核数据。

2. 针对于rest_init()函数来说,会启动三个进程,分别是idle(0号进程)、kernel_init(1号进程)、kthreadd(2号进程)。

(2)疑问

1. “gcc -o init linktable.c menu.c test.c -m32 -static –lpthread”执行这句话的时候gcc报错出现:找不到lpthread?

最新文章

  1. 【WPF系列】基础学习-XAML
  2. (转)为什么所有浏览器的userAgent都带Mozilla
  3. oracle 解锁表
  4. CSS之利用text-indent隐藏文字用图片当Login
  5. 上传系列:ajaxupload.js
  6. 数据结构练习 02-线性结构2. Reversing Linked List (25)
  7. Invalid segment BIN$xxx and dba_recyclebin was empty (回收站空,释放无效的BIN$xx空间)
  8. TalkingDataGame SDK在android Lua上的使用
  9. eclipse tomcat 网页404的一个小问题
  10. poj中一些对我来说不错的东西(每天不同的加入,要保持)
  11. 【LightOJ1282】Leading and Trailing(数论)
  12. 练习 python之数据库增删改查
  13. Metaclasses
  14. [转]Ubuntu Precise - Install youtube-dl package using Quantal repo
  15. shell编程学习笔记(十二):Shell中的break/continue跳出循环
  16. Linux下修改IP、DNS、路由命令行设置
  17. Redis的安装和客户端使用注意事项
  18. hdu3605 Escape 二分图多重匹配/最大流
  19. 创建第一个servlet程序--HelloServlet
  20. Jersey 2.x 运行项目

热门文章

  1. 深入理解PHP的运行模式
  2. Python3 与 C# 并发编程之~ 协程篇
  3. css 函数
  4. 【asp.net】asp.net遍历Request的信息
  5. javax.websocket.DeploymentException: Multiple Endpoints may not be deployed to the same path [/websocket/{sid}] : existing endpoint was class com.sanyi.qibaobusiness.framework.webSocket.WebSocketServe
  6. Python系列之 - 前端总结
  7. 利用git提交代码
  8. Python列表中查找某个元素的索引(多个)
  9. PL/SQl编程 基本语法
  10. vue封装axios方法推荐)