设为首页 收藏本站
查看: 961|回复: 0

[经验分享] 20179223《Linux内核原理与分析》第七周学习笔记

[复制链接]

尚未签到

发表于 2017-11-18 07:14:29 | 显示全部楼层 |阅读模式
视频知识学习
  1.fork()函数被调用一次,但返回两次;
  2.Linux通过复制父进程来创建一个子进程,通过调用fork来实现;
  3.Linux会为每个子进程动态的分配一个task_struct结构。

创建一个新进程在内核中的执行过程
  fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建;
  
Linux 通过复制父进程来创建一个新的进程,那么这就给我们理解这一个过程提供一个想象的框架:
  
复制一个PCB——task_struct
  

  1. err=arch_dup_task_struct(tsk,orig);  

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

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

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

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

实验——使用gdb跟踪创建新进程
  删除旧的的menu目录,clone新的版本。操作如下:
  

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

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

$ cd menu  
$ mv test_fork.c test.c
  
$ make rootfs
  

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

  水平分割,对其进行调试
  

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

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

  按C继续执行后,如图
DSC0002.png

  可以看到出现了copy_process,如图
DSC0003.png

  继续跟踪如下:
  
DSC0004.png

第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等概念,内存空间的各种不同的描述单位,包括字节、页面和区。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-408116-1-1.html 上篇帖子: linux 巨页使用测试以及勘误1 下篇帖子: Linux下升级Python到3.5.2版本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表