21069207《Linux内核原理与分析》第四周作业
本周首先我结合mooc网的视频资料,了解了计算机的三大法宝,分别是存储程序计算机,函数调用堆栈和中断机制。
在计算机的三大法宝中,存储程序计算机是根本,函数调用堆栈是高级语言运行的基础,而中断机制成就了多道程序运行的先河。
<pre>
<code>
push %ebp;
movl %esp,%ebp;
do something;
movel %ebp,%esp;
popl %ebp;
ret
</code>
</pre>
- 前两行指令建立了被调用者函数的堆栈框架
- 中间一行指令为被调用者执行的操作
- 最后三行指令为拆除被调用者函数的堆栈框架,并返回。
实验二搭建实验模拟时钟中断。
>cd LinuxKernel/linux-3.9.4
>qemu -kernel arch/x86/boot/bzImage
>vi mymain.c
>vi myinterrupt.c
这段代码定义了一个名为Thread的结构体,用于保存ip和sp。然后定义了进程描述符PCB结构体,其中包括进程号pid,进程状态state、进程的堆栈、进程的Thread(ip和sp)、程序入口task_entry、下一个进程的进程描述符*next、优先权priority。最后还生命了一个调度器my_schedule(void)。
下面来看mymain.c,
void __init my_start_kernel(void)
{
int pid = 0;
/* Initialize process 0*/
task[pid].pid = pid;
task[pid].state = 0;/* -1 unrunnable, 0 runnable, 0 stopped */// set task 0 execute entry address to my_process
task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
task[pid].next = &task[pid];/*fork more process */
for(pid=1;pid>>process 0 running!!!
该函数是初始化系统内核的,首先创建0号进程,初始化了一个只有一个PCB的循环链表。然后通过循环扩充链表,memcpy()函数将0号进程的所有数据拷贝到多个PCB中并对多个PCB数据进行修改。最后初始化堆栈ebp、esp、eip。
void my_process(void)
{
int i = 0;
while(1)
{
i++;
if(i%10000000 == 0)
{
if(my_need_sched == 1)
{
my_need_sched = 0;
sand_priority();
my_schedule();
}
}
}
}
该函数定义了时间片。
void my_timer_handler(void)
{
//if 1
// make sure need schedule after system circle 2000 times.
if(time_count%2000 == 0 && my_need_sched != 1)
{
my_need_sched = 1;
//time_count=0;
}
time_count ++ ;
//endif
return;
}
当发生中断时,把my_need_sched的值改成1.这时my_process中if部分开始,把my_need_sched复位为0,并调用my-schedul。
<
if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped /
{
//save current scene
/ switch to next process /
asm volatile(
"pushl %%ebp\n\t" / save ebp /
"movl %%esp,%0\n\t" / save esp /
"movl %2,%%esp\n\t" / restore esp /
"movl $1f,%1\n\t" / save eip /
"pushl %3\n\t"
"ret\n\t" / restore eip /
"1:\t" / next process start here */
"popl %%ebp\n\t"
: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
: "m" (next->thread.sp),"m" (next->thread.ip)
);
my_current_task = next;//switch to the next task
printk(KERN_NOTICE " switch from %d process to %d process\n >>>process %d running!!!<<<\n\n",prev->pid,next->pid,next->pid); }
else
{
next->state = 0;
my_current_task = next;
printk(KERN_NOTICE " switch from %d process to %d process\n >>>process %d running!!!<<<\n\n\n",prev->pid,next->pid,next->pid);/* switch to new process */
asm volatile(
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t" /* save esp */
"movl %2,%%esp\n\t" /* restore esp */
"movl %2,%%ebp\n\t" /* restore ebp */
"movl $1f,%1\n\t" /* save eip */
"pushl %3\n\t"
"ret\n\t" /* restore eip */
: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
: "m" (next->thread.sp),"m" (next->thread.ip)
);
}
跳转到下一个进程。
然后学习了linux内核与分析的课本内容
在第三章知道了struct thraead_info在文件<asm/thread_info.h>中的具体定义。
struct thread_info {
struct task_struct *task; /* main task structure /
__u32 flags; /* low level flags */
__u32 status; /* thread synchronous flags/
__u32 cpu; /* current CPU */
mm_segment_t addr_limit;
unsigned int sig_on_uaccess_error:1;
unsigned int uaccess_err:1; /* uaccess failed */
};
state域中的五种进程状态,运行,可中断,不可中断,被其他进程追踪,停止状态。以及创建进程的fork和clone,装入地址空间的exec,收集后代信息的wait,消亡进程的exit。
在第五章主要学习了系统调用的一些基本内容,包括内核的通信,应用程序通过在用户空间实现的应用编程接口来调用系统命令。理解了Linux如何实现系统调用和执行系统调用。
对本次学习的进程结合本科期间操作系统里面简述的进程对系统的进程调度和运行有了一个全新的认识!
21069207《Linux内核原理与分析》第四周作业的更多相关文章
- 2019-2020-1 20199303<Linux内核原理与分析>第二周作业
2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...
- 20169219 linux内核原理与分析第二周作业
"linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- 20169219linux 内核原理与分析第四周作业
系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...
- Linux内核原理与分析-第一周作业
本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业
前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...
- Linux内核原理与分析-第二周作业
写之前回看了一遍秒速五厘米:如果
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 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 ...
随机推荐
- Linux移植之子目录下的built-in.o生成过程分析
在Linux移植之make uImage编译过程分析中罗列出了最后链接生成vmlinux的过程.可以看到在每个子目录下都有一个built-in.o文件.对于此产生了疑问built-in.o文件是根据什 ...
- Android开发之使用SwipeRefreshLayout完成下拉刷新
SwipeRefreshLayout是V4包下的一个组件,老版本的V4包不支持这个组件功能.因此,如果发现自己的项目中无法导入SwipeRefreshLayout的包,那么说明项目中的V4包是老版本的 ...
- Android开发之ListView设置隔行变色
public class HLCheckAdapter extends BaseAdapter { private List<HuoLiang> list; private Context ...
- 4K - 找新朋友
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道 ...
- 使用/\_ 打印正三角形 C/C++
输入size,level,使用/\_,打印正三角形 #include<stdio.h> int main() { int level, size; printf("Enter l ...
- Linux Centos7 虚拟机上网设置
一.Windows下网卡,共享上网模式 二.虚拟机VMnet8的网卡模 三.Linux 下配置网卡 命令: vi /etc/sysconfig/network-scripts/ifcfg-ens33 ...
- MacDev.GarbageCollectionIsDeprecated-WhenXcodeCompileMacAppProject
Garbage Collection is not supported 当Xcode编译Mac OSX App时报错:"Garbage Collection is not supported ...
- js的日期格式判断
var reg = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/; var str = (new Date).toLocaleString() ...
- 20172325 2018-2019-2 《Java程序设计》第四周学习总结
20172325 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 <Java软件结构与数据结构>第六章-列表 一.概述 1.列表是什么? 列表集合 ...
- 使用mysql proxy对数据库进行读写分离
服务器安排如下: 192.168.100.128 主 192.168.100.129 从 192.168.100.130 mysql-proxy 1.在100.130中下载安装mysql-proxy ...