20179223《Linux内核原理与分析》第四周学习笔记
补交第三周作业
完成一个简单的时间片轮转多道程序内核
1.使用实验楼的虚拟机打开shell,用cd LinuxKernel/linux-3.9.4进入linux-3.9.4。
2.执行命令qemu -kernel arch/x86/boot/bzImage会发现弹出新的窗口,代表内核启动了。

执行mykernel代码

进入mykernel代码,可以看到mymain.c和myinterrupt.c

打开mymain.c代码如下:开始启动操作系统。

前面是头文件,然后有一个my_start_kernel()函数,该函数是整个操作系统的入口, 变量i不停的自加1,if循环是执行i每当加到1000000的整数倍的时候就打印出当前的i的值,我们也可以通过修改if的条件使打印加快或减慢
打开myinterrupt.c代码如下:

前面还是头文件,然后有一个my_timer_handler函数,里面只有一条prink的打印语句,每次时钟中断都调用这个printk()输出,所以屏幕会不停的有信息打印出来。
阅读教材3、5章
进程管理
1.进程就是处于执行期的程序。但进程并不仅仅局限于一段可执行程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。
2.线程是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象不是进程而是线程。一个进程可以包含多个线程。但linux系统的线程实现并不特别区分进程和线程。
3.调用fork()系统的结果,该系统调用通过复制一个现有进程来创建一个全新的进程。fork()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。调用exec()这组函数就可以创建新的地址空间,并把新的程序载入其中。
系统调用
1.一般情况下,应用程序通过在用户空间实现的应用的编程接口(API)而不是直接通过系统调用来编程。
2.要访问系统调用,通常通过C库中定义的系统调用来进行。系统调用还会通过一个long类型的返回值来表示成功或者错误。负的返回值表示错误,返回0通常表明成功。
3.Linux中每个系统调用都有一个系统调用号。通过这个独一无二大的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。系统调用的列表存储在sys_call_table中。
4.Linux系统调用比其他许多操作系统执行要快。Linux很短的上下文切换时间是一个重要原因,进出内核都被优化的简洁高效。另外一个原因是系统调用处理程序和每个系统调用本身也都非常简洁。
5.内核驻留在受保护的地址空间上,所以用户空间的程序不能直接调用内核空间中的函数。通常通过软中断,触发一个异常促使系统切换到内核执行系统调用处理程序。在x86上预定义的软中断中断号是128.
在x86上,系统调用号是通过eax寄存器传递给内核的。
6.内核在执行系统调用的时候处于进程上下文。current指针指向当前任务,即引发系统调用的那个进程。
7.在进程上下文中,内核可以休眠并且可以被抢占。能够休眠说明系统调用可以使用内核提供的绝大部分功能。在进程上下文中能够内抢占表明,像用户空间内的进程一样,当前的进程同样可以被其他进程抢占。因为新的进程可以使用相同的系统调用,所以必须小心,保证系统调用是可重入的。
8.建立一个新的系统调用有利有弊,需谨慎使用。
9.常用的系统调用函数有fork、wait、getpid等。
第四周实验
一、静态库的测试实验
1.gcc -c *.c,-c为把.c文件生成.o文件
2.ar cr libmymath.a *.o,其中ar cr是生成静态库的语句,对于静态库开头要用lib+名字结尾再.a,把.o文件生成到libmymath.a里
gcc main.c -L. lmymath,-L.表示要库依赖,-l表示是寻这个静态库

4.运行结果

二、共享库的测试实验
1.使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接
2.cp 是复制,复制libmymath.so到/lib文件中
3.之后同静态库命令一样执行

三、跟踪分析Linux内核的启动过程
使用实验楼的虚拟机打开shell,输入以下代码启动内核
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

使用gdb跟踪调试内核
输入代码qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S当前状态被冻结
再打开一个窗口,输入gdb,把Linux-3.18.6/vmLinux加载进去,连接到刚才启动的被冻结的Linux
输入file linux-3.18.6/vmlinux,target remote:1234,显示连接超时

四、遇到的问题:
1.在做动态库实验室的时候,会出现以下现象:

不知道问题所在,自己想的是是不是电脑配置太低,所以没有办法执行命令?所以用同学的电脑完成了共享库的实验。
2.在跟踪分析内核时,为什么会显示连接超时?之后输入break start_kernel断点的设置,为什么显示无法运行?
20179223《Linux内核原理与分析》第四周学习笔记的更多相关文章
- 2018-2019-1 20189221《Linux内核原理与分析》第四周作业
2018-2019-1 20189221<Linux内核原理与分析>第四周作业 教材学习:<庖丁解牛Linux内核分析> 第 3 章 MenuOS的构造 计算机三大法宝:存储程 ...
- 20169211《Linux内核原理与分析》第四周作业
20169211<Linux内核原理与分析>第四周作业内容列表 1.教材第3.5章节知识学习总结: 2.实验楼配套实验二实验报告: 1.<linux内核设计与实现>教材第3.5 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周作业 一.上周问题总结: 虚拟机环境缺少部分库文件 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境使用gdb跟踪调试内核 1.1 在该环境下输入 ...
- 2019-2020-1 20199328《Linux内核原理与分析》第四周作业
<Linux内核原理与分析>第四周作业 步骤一 首先我们指定一个内核并指定内存根文件系统,这里的bzImage是vmLinux经过gzip压缩的内核,"b"表示&quo ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
- 20169207《Linux内核原理及分析》第十三周作业
第一周作业::对Linux的基本知识进行了了解,并对基本操作进行熟悉和应用. 第二周作业::了解了冯诺依曼体系结构.各种寄存器的功能和汇编指令的作用和功能. 第三周作业::这周主要了解了Linux系统 ...
- 《Linux内核原理与分析》教学进程
目录 2019-2020-1 <Linux内核原理与分析>教学进程 考核方案 第一周: 第二周: 第三周: 第四周: 第五周 第六周 第七周: 第八周 第九周 第十周 第十一周: 第十二周 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
随机推荐
- Spring的注解配置与XML配置之间的比较
注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作. 如:使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- GDB操作基本命令
GDB操作基本命令 1 打开文件及退出操作 shell下输入 gdb filename : 打开单个文件 gdb filename -q: 打开单个文件,屏蔽掉GDB自带的说明信息 gdb下输入qui ...
- Entity Framework教程及文章传送门
Entity Framework视频教程http://www.iqiyi.com/playlist296844502.html Model-Code First做法講解與教學 (ASP.net MVC ...
- Angular2-使用Augury来调试Angular2程序
参考: http://www.jianshu.com/p/efecaea287f2https://augury.angular.io/ https://augury.angular.io/pages/ ...
- python脚本9_打印斐波那契数列
#打印斐波那契数列 f0 = 0 f1 = 1 for n in range(2,101): fn = f1 + f0 if fn <= 100: print(fn) f0 = f1 f1 = ...
- Windows 下配置Git
在Windows上安装git很长时间了,一直都没有配置,就是简单的使用.当然配置后就可以在任意目录下使用git命令.其实就是配置下git的环境变量. 首先,当然下载windows版本:点我下载 安装直 ...
- FreeMarker初探--安装FreeMarker
这里安装FreeMarker相当简单,不需要真正的安装过程.仅仅是拷贝 lib/freemarker.jar 到你 Java 应用程序的路径中,让类加载器可以发现它.比如,如果你在 Web 使用了 F ...
- 【2018多校第一场】hdu6308-Time Zone(日期)
Problem Description Chiaki often participates in international competitive programming contests. The ...
- 十九、dbms_resource_manager(用于维护资源计划,资源使用组和资源计划指令)
1.概述 作用:用于维护资源计划,资源使用组和资源计划指令;包dbms_resource_manager_privs用于维护与资源管理相关的权限. 2.包的组成 1).dbms_resource_ma ...
- 十五、dbms_space(分析段增长和空间的需求)
1.概述 作用:用于分析段增长和空间的需求. 2.包的组成 1).unused_space作用:用于返回对象(表.索引.簇)的未用空间语法:dbms_space.unused_space(segmen ...