《Linux内核原理与设计》

视频学习及操作

给MenuOS增加time和time-asm命令的方法:

1、更新menu代码到最新版

rm menu -rf      //强制删除menu, rm -rf 表示强制删除的意思。
git clone 网址 //克隆一个新的menu,这样就使得menu的代码更新到最新版

2、在main()函数中增加MenuConfig

3、增加对应的Time函数和TimeAsm函数(这里的函数要换成我们自己编写的使用系统调用的函数,比如mkdir和mkdirAsm)

4、make rootfs (帮我们自动编译、生成根文件系统,同时自动帮我们启动起来Menuos,这时我们发现menu支持的命令比原来多)

使用gdb跟踪系统调用内核函数sys_time

.编辑 menu 中的 text.c 文件,把上周作业写的fork和fork_asm写在menuos里面:

make rootf 打开 menu 镜像,输入help可以看到MenuOS菜单中新增了两条命令:

接下来开始用gdb调试:

cd 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 //链接到menu os里
b start_kernel //在start_kernel处设置断点
c //继续执行

接下来设置断点,启动MenuOs,输入mkdir,看gdb调试结果:

list        //查看startkernel这段代码
b sys_mkdir //在要分析的这个系统调用处设置断点
c //继续执行
c
c

b sys_time 一个 断点,按 c 继续执行 time 命令,发现进入系统调用后会停在sys_time这个函数

关于从system_call到iret之间的过程

从保存现场到恢复现场,画了一个流程图大致如下:

教材第九、十章学习

1、链表中每个结点代表一个请求。线程持有锁,而锁保护了数据。各种锁机制之间的区别主要在于,当锁已经被其他线程持有而不可用时,一些锁会执行等待,另一些会使当前任务睡眠知道锁可用。互斥锁mutex中,0意味着开锁,1意味着上锁。

2、伪并发执行是指单线程的多个进程共享文件,或者在一个程序内部处理信号,也可能产生竞争条件,但两者其实并不是同时发生的,它们相互交叉进行;真并发是指在一台支持对称多处理器的的机器上,两个进程真正的在临界区中同时执行。内核中产生并发执行的原因来自于中断、软中断和tasklet、内核抢占、睡眠及与用户空间的同步、对称多处理。

3、为什么要上锁呢?是怕其他执行线程可以访问这些数据,避免什么其他什么东西都能看到他,就要上锁,如果是局部数据,仅仅被它本身访问,它们独立存在于执行线程的栈中,纳闷就不需要给这些局部变量加锁。

4、如果有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有资源都已被占用,所有线程都在相互等待,且它们永远不会释放已占有的资源,这就是死锁。死锁的例子有很多,自死锁,ABBA死锁等,要避免死锁,就要按顺序加锁(嵌套的使用多个锁)、防止发生饥饿、不要重复请求同一个锁、设计应力求简单。恰当的加锁既要满足不死锁,可扩展,还要清晰简洁,加锁的精髓在于力求简单。

5、在内核同步方法中,主要介绍了11种内核同步方法,同步的目的就是为了保障数据的安全,其实就是保障各个线程之间共享资源的安全。其中大内核锁(BLK)是内核的原始混沌时期,应用不多,因此我们主要学习另外十种内核同步方法。

10.1 原子操作

原子操作是由编译器来保证的,用于临界区只有一个变量的情况,只有一个整数,保证一个线程对数据的执行过程不会被其他线程打断。原子操作有2类:

1、原子整数操作,有32位和64位,头文件分别为<asm/atomic.h>和<asm/atomic64.h>

2、原子位操作,头文件 <asm/bitops.h>

10.2 自旋锁

自旋锁是Linux中最常见的锁,它最多只能被一个可执行线程持有,如果一个执行线程试图获得一个已被持有的自旋锁,则该线程会一直进行忙循环-旋转-等待锁重新可用。由于处于等待状态的线程在等待锁重新可用时自旋,特别浪费CPU时间,因此自旋锁不应该被某一线程长时间持有。它的头文件为<asm/spinlock.h>

警告:

1、自旋锁是不可递归的,否则递归的请求同一个自旋锁会自己锁死自己。

2、线程获取自旋锁之前,要禁止本地中断,否则中断处理程序就会打断正持有锁的内核代码,且有可能和获取锁的线程竞争自旋锁。

自旋锁和下半部:

1、下半部处理和进程上下文共享数据时,由于下半部的处理可以抢占进程上下文的代码,所以进程上下文在对共享数据加锁前要禁止下半部的执行,解锁时再允许下半部的执行。

2、中断处理程序(上半部)和下半部处理共享数据时,由于中断处理(上半部)可以抢占下半部的执行,所以下半部在对共享数据加锁前要禁止中断处理(上半部),解锁时再允许中断的执行。

3、同一种tasklet不能同时运行,所以同类tasklet中的共享数据不需要保护。

4、对于软中断,无论同种类型,如果数据被软中断共享,那它必须得得到锁的保护,但是同一处理器上一个软中断不会抢占另一个软中断,因此不需要禁止下半部。

10.3 读-写自旋锁

读写自旋锁方面,本周四课上已经讲过,读和读是不互斥的,其余的读和写,写和写之间都是互斥的。

10.4 信号量

信号量也是一种睡眠锁,和自旋锁不同的是,线程获取不到信号量的时候,不会像自旋锁一样循环的去试图获取锁,而是进入睡眠,直至有信号量释放出来时,才会唤醒睡眠的线程,进入临界区执行,所以信号量适用于等待时间较长的临界区。信号量有二值信号量和计数信号量2种,其中二值信号量比较常用。

二值信号量表示信号量只有2个值:信号量为1时,表示临界区可用;信号量为0时,表示临界区不可访问。

10.5 读-写信号量

读写信号量都是二值信号量(互斥信号量),即计数值最大为1,增加读者时,计数器不变,增加写者,计数器才减一,也就是说读写信号量保护的临界区,最多只有一个写者,但可以有多个读者。

10.6 互斥体

内核中唯一允许睡眠的锁是信号量。mutex在内核中对应的数据结构mutex,其行为和使用计数为1的信号量相似,但操作接口更简单,实现也更高效,且使用限制更强,因此首选mutex,除非不能满足其约束条件。

10.7 完成变量

完成变量是使两个任务得以同步的简单方法,完成变量的机制类似于信号量,如果一个线程要执行工作时,另一个线程会在完成变量上等待;当线程完成了工作之后,使用完成变量来唤醒等待的任务。

完成变量的头文件:<linux/completion.h>

10.9 顺序锁

通常简称seq锁,与自旋锁和读写信号量不同,顺序锁用于读写共享数据。

10.10 禁止抢占

自旋锁虽然可以防止内核抢占,但是有时候仅仅需要禁止内核抢占,不需要像自旋锁那样连中断都屏蔽掉,这时可以使用禁止内核抢占的方法。禁止抢占的头文件为<linux/preempt.h>

10.11 顺序和屏障

对于一段代码,编译器或者处理器在编译和执行时可能会对执行顺序进行一些优化,从而使得代码的执行顺序和我们写的代码有些区别。在并发条件下,可能会出现取得的值与预期不一致的情况,因此为了保证代码的执行顺序,引入了一系列屏障方法来阻止编译器和处理器的优化。

参考网址:内核同步处理方法

问题与思考

教材第九章提到要给数据加锁而不是给代码加锁,而第九章P140的总结却说要加锁的是代码?我的理解是通过编代码的方式,给数据进行加锁,P140的说法是不是不太准确

2017-2018-1 20179205《Linux内核原理与设计》第六周作业的更多相关文章

  1. 2017-2018-1 20179205《Linux内核原理与设计》第九周作业

    <Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多 ...

  2. 2017-2018-1 20179205《Linux内核原理与设计》第二周作业

    <Linux内核原理与分析>第二周作业 本周视频学习情况: 通过孟老师的视频教程,大致对风诺依曼体系结构有了一个初步的认识,视频从硬件角度和程序员角度对CPU和Main Memory(内存 ...

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

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

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

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

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

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

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

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

  7. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  9. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  10. 2017-2018-1 20179205《Linux内核原理与设计》第四周作业

    <Linux内核原理与分析> 视频学习及实验操作 Linux内核源代码 视频中提到了三个我们要重点专注的目录下的代码,一个是arch目录下的x86,支持不同cpu体系架构的源代码:第二个是 ...

随机推荐

  1. AppDomain.CurrentDomain.AssemblyResolve

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 参 ...

  2. c++:error2019,无法解析的外部命令blabla~

    出现这个原因的问题汇总: 1,相应的附加库没有包含进去,注意附加库的目录是 / 2,函数没有与之对应的类,却在main中以某一类的对象调用了该方法. 其实,当错误中显示fun()成为无法解析的外部命令 ...

  3. 2011 Multi-University Training Contest 6 - Host by JLU

    打了4hours,做出一道题...太菜了.rank:45/107 开场看B,题目看不懂...3hours半才发现i<=N-1,不是i<=x-1.然而还是不会. 看到J有人过了,发现是个简单 ...

  4. BZOJ 1875 HH去散步(矩阵快速幂)

    题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...

  5. 转:使用 python Matplotlib 库 绘图 及 相关问题

     使用 python Matplotlib 库绘图      转:http://blog.csdn.net/daniel_ustc/article/details/9714163 Matplotlib ...

  6. 【题解】CF#24 D-Broken Robots

    在某次考试的时候用过的办法,懒人必备……[笑哭] 一个非常显然的 dp,我们用 \(f[i][j]\) 表示第 \(i\) 行第 \(j\) 列的格子走到最后一排的期望步数转移即为 \(f[i][j] ...

  7. BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...

  8. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 https://www.luogu.org/problemnew/show/P3346 幽香 ...

  9. JS深度合并对象

    /** * 如果target(也就是FirstOBJ[key])存在, * 且是对象的话再去调用deepObjectMerge, * 否则就是FirstOBJ[key]里面没这个对象,需要与Secon ...

  10. JQuery选择符的理解与应用

    JQuery强大的选择符可以让我们获得页面中任何元素进行操作,并且使用简单方便,可读性强.本章内容根据本人在开发中常用到的选择符作为例子来进行讲解,如有更多常用的简单的例子可回复提供,参与讨论,一起学 ...