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.中断处理过程(包 ...
随机推荐
- Struts2框架学习第二章——Struts2下的HelloWorld
本章要点 — Struts 2的下载和安装 — 纯手工创建一个Web应用 — 纯手工创建一个Struts 2应用 — 实现Struts 2的Action — 配置Struts 2的Action — ...
- 解决mac上matplotlib中文无法显示问题
系统:mac os, high sierra; python3.7(by brew installed) 在网上找了很多基本上都是让下载SimHei字体,然后放到mac的matplotlib的字体 ...
- Tomcat服务部署步骤
Tomcat服务部署步骤 1. 2. 3. tar -zxvf apache-tomcat-7.0.68.tar.gz,然后修改文件夹名称为需要的名称, 使用mv命令 4. 删除 /webapps/R ...
- 大小堆C++实现
C++大小堆实现(仿函数) 具体代码如下 #pragma once #include<iostream> #include<vector> using namespace st ...
- 联表更新SQL语句
联表更新语句第一次写,,,主要是在实现功能上需要向repay_detail添加一个新的字段item_id.但是以前的老数据的话这个字段的值就为null 所以就写了下面一条语句就更新了老数据...SQL ...
- 010——数组(十)compact extract in_array
<?php /** 10 数组 compact extract in_array */ //compact() (紧凑的,简洁的) 将变量转换为数组,变量名为数组键名,变量值为数组的键值. /* ...
- 在Linux下设置定时任务(每分钟执行一次特定的shell脚本)
在当前用户下,开始编辑定时任务 crontab -e 按键 i 进入编辑模式 输入下述命令 */ * * * * sh /***/*****.sh 然后按键 Esc 退出编辑模式,再输入 wq 保存退 ...
- 消除浏览器对input输入框的自动填充
Mozilla官方文档建议的是 直接使用 autocomplete = ‘off’ 即可禁止输入框从浏览器cache获取数据,博主以前使用这个也就足够兼容浏览器了. 现在发现,却在chrome.fir ...
- CSS: Grid Layout Module
Grid Layout The CSS Grid Layout Module offers a grid-based layout system, with rows and columns, mak ...
- 一个好工具-everything-可以找到浏览器的所有缓存
下载路径http://www.voidtools.com/downloads/ 我用它来寻找浏览器缓存的google瓦片.