视频知识学习

1.fork()函数被调用一次,但返回两次;

2.Linux通过复制父进程来创建一个子进程,通过调用fork来实现;

3.Linux会为每个子进程动态的分配一个task_struct结构。

创建一个新进程在内核中的执行过程

fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建;

Linux 通过复制父进程来创建一个新的进程,那么这就给我们理解这一个过程提供一个想象的框架:

复制一个PCB——task_struct

  1. 1. err=arch_dup_task_struct(tsk,orig);

要给新进程分配一个新的内核堆栈

  1. 1. ti=alloc_thread_info_node(tsk,node);
  2. 2. tsk->stack = ti;
  3. 3. setup_thread_stack(tsk,orig); //这里只是复制thread_info,而非复制内核堆栈

要修改复制过来的进程数据,比如pid、进程链表等等都要改改吧,见copy_process内部。

从用户态的代码看fork()函数返回了两次,即在父子进程中各返回一次,父进程从系统调用中返回比较容易理解,子进程从系统调用返回,那它在系统调用处理过程中的哪里开始执行的呢?这就涉及子进程的内核堆栈数据状态和task_struct中thread记录问题,这是在哪里设定的?copy_thread in copy_process

  1. 1.*chidregs = *current_pt_regs(); //复制内核堆栈
  2. 2. childregs->ax = 0; //为什么子进程的fork返回,这里就是原因
  3. 3.
  4. 4.p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
  5. 5.p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

实验——使用gdb跟踪创建新进程

删除旧的的menu目录,clone新的版本。操作如下:

  1. $ cd /home/shiyanlou/LinuxKernel
  2. $ rm -rf menu
  3. $ git clone http://github.com/mengning/menu.git

还需要把test_fork.c test.c覆盖掉,重新编译并启动程序:

  1. $ cd menu
  2. $ mv test_fork.c test.c
  3. $ make rootfs

输入fork,可以看到创建了子进程和父进程,如图:

水平分割,对其进行调试

  1. $ cd /home/shiyanlou/LinuxKernel
  2. $ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
  3. $ gdb
  4. $ file linux-3.18.6/vmlinux
  5. $ target remote:1234

设置几个断点:sys_clone,do_fork,dup_task_struct,copy_process,copy_thread,ret_from_fork,如图

按C继续执行后,如图

可以看到出现了copy_process,如图

继续跟踪如下:

第11、12章课本知识学习

系统定时器使用高频率与使用低频率各有哪些优劣?

提高节拍率意味着时钟中断产生得更加频繁,所以中断处理程序也会更加频繁地执行。如此一来会给整个系统带来如下好处:

(1)更高的时钟中断解析度可提高时间驱动事件的解析度。

(2)提高了时间驱动事件的准确度。

高HZ的优势:

内核定时器能够以更高的频度和更高的准确度运行;依赖定时值执行的系统调用,比如poll()和select(),能够以更高的精度运行;对诸如资源消耗和系统运行时间等的测量会有更精细的解析度;提高进程抢占的准确度。

高HZ的劣势:

把节拍率提高到1000HZ,节拍率越高,意味着时钟中断频率越高,也就意味着系统负担越重。

硬时钟和定时器

实时时钟是用来持久存放系统时间的设备,即便系统关闭后,它也可以靠主板上的微型电池提供的电力保持系统的计时。

定时器是管理内核流逝的时间的基础。内核要推后执行某些代码,下半部机制就是为了将工作放到以后执行,下半部的本意并非是放到以后的某个时间去执行任务,而仅仅是不在当前时间执行就可以了。而内核定时器正是解决这个问题的理想工具。

slab分配器

SLAB_HWCACHE_ALIGN——这个标志命令slab层把一个slab内的所有对象按高速缓存行对齐。这就防止了“错误的共享”。

SLAB_POISON——这个标志导致slab层用已知的值填充slab。这就是所谓的“中毒”,有利于对未初始化内存的访问。

SLAB_RED_ZONE——这个标志导致slab层在已分配的内存周围插入“红色警界区”以探测缓冲越界。

SLAB_PANIC——这个标志当分配失败时提醒slab层。

SLAB_CACHE_DMA——这个标志命令slab层使用可以执行DMA的内存给每个slab分配空间。

还学习了时钟中断、时钟节拍、及jiffies等概念,内存空间的各种不同的描述单位,包括字节、页面和区。

20179223《Linux内核原理与分析》第七周学习笔记的更多相关文章

  1. 20179223《Linux内核原理与分析》第九周学习笔记

    视频学习 进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: --I/O-bound:1.频繁的进行I/O:2.通常会花费很多时间等待I/O操作的完成 --CPU-bound: ...

  2. 20179223《Linux内核原理与分析》第二周学习笔记

    第二周实验 本周学习情况: 学习了X86 cpu的几个寄存器及X86汇编指令: movl %eax,%edx edx=eax %表示一个寄存器,把eax内容放入edx,等号相当于把eax赋值给edx, ...

  3. 20179223《Linux内核原理与分析》第一周学习笔记

    第一周实验 尝试创建两个文件,用通配符查找这两个文件:在创建文件的时候,需要同时创建多个文件的方法运行. 根据作业要求,实现一个lilux命令. 根据作业要求添加一个用户loutest,使用sudo创 ...

  4. 20179203李鹏举 《Linux内核原理与分析》第一周学习笔记

    Linux基础入门 一.Linux的基础学习 1.1 Linux的重要基础操作 Linux不同于Windows的纯粹的图形化界面,虽然也有图形桌面的操作但是更多的操作还是通过命令行来进行,当然除了命令 ...

  5. 20179223《Linux内核原理与分析》第四周学习笔记

    补交第三周作业 完成一个简单的时间片轮转多道程序内核 1.使用实验楼的虚拟机打开shell,用cd LinuxKernel/linux-3.9.4进入linux-3.9.4. 2.执行命令qemu - ...

  6. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  7. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  8. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  9. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  10. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

随机推荐

  1. Struts 2 + Hibernate + Spring 整合要点

    Struts 2 和 Spring 的功能有重合,因此有必要说明下,整合中分别使用了两种框架的哪些技术. Struts 2 使用功能点: 1.拦截器.一处是对非登录用户购物进行拦截,一处是对文件上传的 ...

  2. response.getWriter().write("中文");乱码问题

    起初遇到这个问题,网上几乎所有的建议都是: response.setHeader("Content-type", "text/html;charset=UTF-8&quo ...

  3. IO与NIO

    IO IO概念: Java IO Java IO 即java的输入系统,不管我们编写任何种语言,都难免输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,还要考虑的因素特别多,比如我们要考 ...

  4. 如何调试nRF5 SDK

    本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...

  5. 一、nginx 安装

    添加官方 yum 源 vim /etc/yum.repos.d/nginx.rep 输入以下内容(OS为你的系统,OSRELEASE 系统版本) [nginx] name=nginx repo bas ...

  6. 安装 python 数据分析插件 pandas

    一上午试验了各种方法,发现利用pycharm是最快的.可以抛弃版本,命令和兼容问题的烦恼.纯粹傻瓜式 方法是 pycharm, 直接在settings里面,搜索pandas,添加即可,他会把所有之前需 ...

  7. 1-12 RHEL7-find命令的使用

    1.文件查找findfind命令是在目录结构中,搜索文件,并执行特定的操作find命令提供了相当多的查找条件,功能很强大 2.格式usage:find pathname -options[-print ...

  8. vue的slot的使用问题

    slot的使用问题 根据官方文档来说,有三种使用方式 https://cn.vuejs.org/v2/guide/components.html#%E4%BD%BF%E7%94%A8%E6%8F%92 ...

  9. Java复习3.变量.常量.String.

    Java 中的变量常量数据类型 20131004 前言: 还是国庆节,无聊的很,就没事复习点Java的知识,其实C/C++基本上是现在大型企业面试的语言,但是多学习点Java是没有坏处的,而且,将来工 ...

  10. 重温MVC基础入门

    重温MVC基础入门   简介 本文主要是作者回顾MVC基础的文章,整合个人认为基础且重点的信息,通过简单实践进行复习. 相关代码地址:https://github.com/OtherRuan/Revi ...