Linux第六周作业
一 实验过程
1 先进入LinuxKernel环境下,更新menu代码到最新版,用到的命令为rm menu -rf //强制删除当前menu,git clone http://git.shiyanlou.com/mengning/menu.git //重新克隆新版本的menu。make rootfs //rootfs是事先写好的一个脚本,自动编译自动生成根文件系统,同时自动启动MenuOS
2 test.c源代码修改如下:
include <stdio.h>
include <stdlib.h>
include "menu.h"
define FONTSIZE 10
int PrintMenuOS()
{
int i, j;
char data_M[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
char data_e[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
char data_n[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
char data_u[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
char data_O[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" "
};
char data_S[FONTSIZE][FONTSIZE] =
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ** ",
" "
};
for(i=0; i<FONTSIZE; i++)
{
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_M[i][j]);
}
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_e[i][j]);
}
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_n[i][j]);
}
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_u[i][j]);
}
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_O[i][j]);
}
for(j=0; j<FONTSIZE; j++)
{
printf("%c", data_S[i][j]);
}
printf("\n");
}
return 0;
}
int Quit(int argc, char argv[])
{
/ add XXX clean ops */
exit(0);
}
include <sys/stat.h>
include <sys/types.h>
...
int MakeDir() {
int ret = 0;
ret = mkdir("./testdir", 0777);
printf("ret is: %d.\n", ret);
return 0;
}
int MakeDirAsm() {
int ret = 0;
//ret = mkdir("./testdir", 0777);
char *dir = "./testdir";
int mode = 0777;
asm volatile(
"movl %1, %%ebx\n\t"
"movl %2, %%ecx\n\t"
"movl $39, %%eax\n\t"
"int $0x80\n\t"
"movl %%eax, %0\n\t"
: "=m"(ret)
: "m"(dir), "m"(mode)
);
printf("ret is: %d.\n", ret);
return 0;
}
int main()
{
PrintMenuOS();
SetPrompt("MenuOS>>");
MenuConfig("version","XXX V1.0(Menu program v1.0 inside)",NULL);
MenuConfig("quit","Quit from XXX",Quit);
MenuConfig("make-dir","Make Directory",MakeDir);
MenuConfig("make-dir-asm","Make Directory(asm)",MakeDirAsm);
ExecuteMenu();
}
代码添加完成后make rootfs重新编译,此时系统会自动启动。如下图:
其增加了相应功能
3 执行以下命令开启内核的调试功能 qemu -kernel linux-3.18.6/arch/x86/boot/bz/Image -initrd rootfs.img -s -S,此时系统处于停止状态
其增加了相应功能
4重启内核调用
$ cd /home/shiyanlou/LinuxKernel
$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
再打开一个命令行窗口输入gdb,在gdb命令提示符下依次输入file linux-3.18.6/vmlinux, target remote:1234命令连接内核并跟踪调试,设置断点break sys_getpid, 接着continue开始运行,此时menuOS从stopped状态开始执行。在menu程序的提示符下输入who,程序执行到断点时暂停,此时gdb窗口显示程序断在sys_getpid处,接着使用gdb单步执行命令。next:不进入函数体的单步执行;step:进入函数体的单步执行;finish:进入函数体后退回调用函数
二 课本知识
同步的概念
临界区:也称为临界段,就是访问和操作共享数据的代码段。
竞争条件: 2个或2个以上线程在临界区里同时执行的时候,就构成了竞争条件。
所谓同步,其实防止在临界区中形成竞争条件。
如果临界区里是原子操作(即整个操作完成前不会被打断),那么自然就不会出竞争条件。但在实际应用中,临界区中的代码往往不会那么简单,所以为了保持同步,引入了锁机制。但又会产生一些关于锁的问题。
死锁产生的条件:要有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有资源都已被占用。所以线程相互等待,但它们永远不会释放已经占有的资源。于是任何线程都无法继续,死锁发生。
自死锁:如果一个执行线程试图去获得一个自己已经持有的锁,它不得不等待锁被释放。但因为它正在忙着等待这个锁,所以自己永远也不会有机会释放锁,死锁产生。
饥饿(starvation) 是一个线程长时间得不到需要的资源而不能执行的现象
同步的方法
原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作,内核代码可以安全的调用它们而不被打断。
原子操作分为整型原子操作和位原子操作。
spinlock自旋锁
自旋锁的特点就是当一个线程获取了锁之后,其他试图获取这个锁的线程一直在循环等待获取这个锁,直至锁重新可用。
由于线程实在一直循环的获取这个锁,所以会造成CPU处理时间的浪费,因此最好将自旋锁用于能很快处理完的临界区。
Linux第六周作业的更多相关文章
- 2018-2019-1 20189221 《Linux内核原理与分析》第六周作业
2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第六周作业
<Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用syste ...
- 2020-2021-1 20209307《Linux内核原理与分析》第六周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业> 这个作业的目标 & ...
- Linux第六周学习总结——进程额管理和进程的创建
Linux第六周学习总结--进程额管理和进程的创建 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/cour ...
- 201621123080《java程序设计》第六周作业总结
201621123080<java程序设计>第六周作业总结 1. 本周学习总结 2. 书面作业 clone方法 1.1 在test1包中编写Employee类,在test2包中新建一个Te ...
- 1903021116—吉琛—Java第六周作业—类的定义
项目 内容 课程班级博客链接 19信计班 这个作业要求链接 第六周作业链接 java面向对象的概念和定义 博客名称 学号-姓名-Java第六周作业-题目自拟 要求 每道题要有题目,代码(使用插入代码, ...
- C语言--第六周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1250 一.评分要求 要求1 完成PTA第六周所有题,若存在抄袭现象,倒扣此题 ...
- 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...
- 1903021121—刘明伟—Java第六周作业—java类
项目 内容 课程班级博客链接 19信计班(本) 作业要求链接 第6周作业 扩展阅读 java面向对象的概念和定义 作业要求 每道题要有题目,代码,截图(只截运行结果). 题目1: 一个Phone ...
随机推荐
- 动态LINQ(Lambda表达式)
1.准备数据实体 public class Data { public string AccountNO { get; set; } public int Count { get; set; } } ...
- django表单的Widgets
不要将Widget与表单的fields字段混淆.表单字段负责验证输入并直接在模板中使用.而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据.widget是字段的一个内在属性,用于定 ...
- [osg]osgcallback各种回调使用的例子介绍
观察MyReadFileCallback结构体的内容,可以发现它继承自osgDB::Registry::ReadFileCallback,并重载了一个函数readNode,分析源代码可知,该函数在os ...
- asdasda
git://git.coding.net/lick468/wf.git git地址:https://git.coding.net/lick468/wf.git
- python + lisp hy的新手注记1
想在python里用lisp方言hy的目的: 1 用lisp去parse 包含 “数据+简单if控制流(代码.AST)”的配置文件,或者说用包含s-exp的.hy文件作为这类配置文件的实现(而不是用y ...
- C++之初体验
#include<iostream> using namespace std; int main() { cout<<" Hello imooc "< ...
- com.netflix.zuul.exception.ZuulException: Forwarding error
一.问题描述 在使用Spring Cloud的zuul组件,做路由转发时,每次重新启动后端服务,头几次调用都会出现com.netflix.zuul.exception.ZuulException: F ...
- SPL之Iterator(迭代器)接口
前言:SPL是用于解决典型问题(standard problems)的一组接口与类的集合. <?php /** * Class MyIterator * 在 PHP 中,通常情况下遍历数组使用 ...
- MySQL补充
1.mysql限制显示条目数:Limit, offset 图片网址:https://sqlbolt.com/lesson/filtering_sorting_query_results 实例: SEL ...
- SQL SERVER pivot(行转列),unpivot(列转行)
[pivot]行转列:多行变一列 假设学生成绩表Score1 Name Subject Score 小张 语文 88 小花 数学 89 小张 数学 90 Name 语文 数学 小花 null 89 小 ...