Linux内核分析—完成一个简单的时间片轮转多道程序内核代码
---恢复内容开始---
20135125陈智威
原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”
实验要求:
运行并分析一个精简的操作系统内核,理解操作系统是如何工作的
使用实验楼的虚拟机打开shell
- cd LinuxKernel/linux-3.9.4
- qemu -kernel arch/x86/boot/bzImage
然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c
使用自己的Linux系统环境搭建过程参见mykernel,其中也可以找到一个简单的时间片轮转多道程序内核代码
实验过程:
1.使用实验楼的虚拟机打开shell,输入
cd LinuxKernel/linux-3.9.4qemu -kernel arch/x86/boot/bzImage
2.观察内核运行的程序:

3.查看mykernel中所包含的文件:

4.运行mymain.c并查看其中的内核启动代码:

5.运行myinterrupt.c并查看其中的时间中断函数代码:

实验分析:
这是内核代码的启动函数,C语言编写,循环部分是每执行100000次,输出一条语句。
void __init my_start_kernel(void)
{
int i = 0;
while(1)
{
i++;
if(i%100000 == 0) /*这里的10000次根据每台机器系统运行的快慢可以自行调节*/
printk(KERN_NOTICE "my_start_kernel here %d \n",i);
}
}
这段代码是被时间中断时调用,每次被调用的时候输出一条语句。
void my_timer_handler(void)
{
printk(KERN_NOTICE "\n>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<\n\n");
}
这里我们能够看出比之前的更加简单,每一次输出的时候均调用printk,只需要在中断发生时做中断的处理即可
然后我对Github上的代码添加了一些自己的注解,见下图:

最后是之前课上我觉得有必要知道的一些小tips,见下图:

实验感悟:
此次实验我了解到三个非常重要的寄存器,ebp、esp和eip,而在课上可以知道我们定义的Thread即是用来保存eip和esp的。对于tPcb,我知道了他是用来表示进程的,即是用来对堆栈进行初始化的。现在我对时间中断的过程和原理比之前了解了许多。CPU每过一个时间点就产生一个时间中断。
---恢复内容结束---
Linux内核分析—完成一个简单的时间片轮转多道程序内核代码的更多相关文章
- Linux内核分析:完成一个简单的时间片轮转多道程序内核代码
PS.贺邦 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 1.m ...
- 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析
一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...
- linux内核分析第二周-完成一个简单的时间片轮转多道程序内核代码
中断时计算机运行的一个非常重要的功能.之所以重要,是因为由于种种原因,计算机不能将一个程序从头执行到尾不间断,而是可能会出现很多像等待输入设备输出设备的过程,如果没有中断系统,CPU只能等待,造成资源 ...
- linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核代码
计算机如何工作 三个法宝:存储程序计算机.函数调用堆栈.中断机制. 堆栈 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 Esp 堆栈指针 (stack pointer) ...
- Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码
Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...
- Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码
陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用实验楼的虚拟机 ...
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
- Linux内核分析-构造一个简单的Linux系统MenuOS
构造一个简单的Linux系统MenuOS linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel C ...
- Linux内核分析——构造一个简单的Linux系统MenuOS
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...
随机推荐
- centos6.5安装lnmp环境
1.安装nignx的源,默认cenots6没有的. rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-cent ...
- frame里的链接跳转
<a href="javascript:parent.location='index_frame.html';void(0);">索引</a> <a ...
- 使用 Sublime Text 2 开发 Unity3D 项目
用 Sublime 已经有很长一段时间,很舒适,很贴心,根本停不下来.之前因为是开发页游,所以是用 AS3 开发,近段时间,新开了个手游项目,引擎方面选定了 Unity3D,老实说,之前没有太多的 3 ...
- 安装LoadRunner提示缺少vc2005_sp1_with_atl..
装自动化负载测试工具LoadRunner前,需要预先安装其运行的基础环境.如:安装LoadRunner 11时就需要先安装Micrsoft Visual C++ 2005 SP1.C++ 2008运行 ...
- 判断整数是否能被n整除
(1)1与0的特性: 1是任何整数的约数,即对于任何整数a,总有1|a. 0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0.2.4.6或 ...
- asp.net c#过滤html代码,净化DIV SPAN等
public static string GetSafeHtml(string val) { if (string.IsNullOrEmpty(val)) { return string.Empty; ...
- 使用Kettle抽取数据时,出现中文乱码问题解决方案
使用Kettle在不同的数据库抽取数据时,有时会出现中文乱码问题:其解决方案如下: 1.查看数据库的字符集是否是UTF-8(最常用的字符集) 2.如果数据库设置正确仍然存在中文乱码,则可能是因为有的客 ...
- spark示例
1)java(App.java) package com.ejiajie.bi.hello; import org.apache.spark.api.java.JavaSparkContext; im ...
- bzoj 3611: [Heoi2014]大工程
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- 多个radiobutton选定一个
asp.net中怎么判断其中一个radiobutton被选中后登录的是一个窗体,另一个被选中后登录的是另一个窗体. 页面设置两按钮的GroupName为同一组值: <asp:RadioButto ...