![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux-0.11
18279216400
这个作者很懒,什么都没留下…
展开
-
6.1:文件系统-待续
待续原创 2020-04-18 14:36:38 · 63 阅读 · 0 评论 -
5.2:外设-块设备磁盘
磁盘工作过程1)磁头移动,找到柱面2)柱面中选择读写的磁道3)旋转磁盘,将对应磁道中要读写的那个扇区转到磁头下方4)都系扇区中的内容到缓存中代码实现1:第一层抽象-扇区到磁盘块请求因为数据传输数据和寻道、旋转时间相比要小得多,所以寻道,旋转一次读写K个扇区的策略比只读写一个扇区的策略,读写速度会提供K倍。所以抽象处磁盘快后,磁盘的读写速度会有非常显著的提高。当用户传入磁盘的盘块号时...原创 2020-04-14 09:23:35 · 111 阅读 · 0 评论 -
5.1:外设-字符设备键盘
1:键盘中断当按下键盘时会产生键盘中断,进入keyboard_interrupt:处理函数中keyboard_interrupt: call key_table(,%eax,4)在key_table里会找每个案件对应的处理函数,大部分都是do_selfkey_table: .long none,do_self,do_self,do_self /...原创 2020-04-13 10:26:27 · 100 阅读 · 0 评论 -
4.3:内存管理-换入/换出
待续。。。。。。原创 2020-04-13 09:46:26 · 74 阅读 · 0 评论 -
4.2:内存管理-重看fork
1:建立段表nr为进程号,所以每个进程都会分割64M的虚拟内存使用,且不会重叠set_base很明显可以看出是在设置段表copy_process->copy_mem new_data_base = new_code_base = nr * 0x4000000; p->start_code = new_code_base; set_b...原创 2020-04-10 14:37:50 · 75 阅读 · 0 评论 -
4.1:内存管理-段页机制
1:分段机制段表:程序由不同的段组成:代码段,数据段,栈…,通过这种方式可以将相同熟悉的数据放到一起进行管理。而将不同的段载入内存时,需要记录不同段的基地址,这样就会形成一个表,这就是段表。因为系统中会有很多的进程,所有每个进程都会有自己的段表(LDT),我们还需要找到每个进程的LDY表,所以就有了全局描述表(GDT)。地址转换:采用了分段机制后,程序中的逻辑地址就会变成“段号:段内偏...原创 2020-04-08 17:42:25 · 165 阅读 · 0 评论 -
3.7:进程调度-实验:基于内核栈切换的进程切换
《冬夜读书示子聿》(南宋)陆游古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。实验目的:深入理解进程和进程切换的概念;综合应用进程、CPU 管理、PCB、LDT、内核栈、内核态等知识解决实际问题;开始建立系统认识实验内容:现在的 Linux 0.11 采用 TSS(后面会有详细论述)和一条指令就能完成任务切换,虽然简单,但这指令的执行时间却很长,在实现任务切换时大...原创 2020-04-07 18:20:46 · 190 阅读 · 1 评论 -
3.6:进程调度-退出
1:exit程序退出处理程序int do_exit(long code)1)释放当前进程的代码段和数据段占的内存页free_page_tables(get_base(current->ldt[1]),get_limit(0x0f));free_page_tables(get_base(current->ldt[2]),get_limit(0x17)); 2)如果当前进...原创 2020-04-05 15:05:14 · 108 阅读 · 0 评论 -
3.5:进程调度-调度
一:调度函数schedule1:检测任务状态,设置可中断任务的状态位RUNNINGvoid schedule(void){ int i,next,c; struct task_struct ** p;/* check alarm, wake up any interruptible tasks that have got a signal */ ...原创 2020-04-04 17:41:54 · 163 阅读 · 0 评论 -
3.4:进程调度-创建
一:0号进程的创建1:PCB初始化static union task_union init_task = {INIT_TASK,};#define INIT_TASK \/* state etc */ { 0,15,15, \/* signals */ 0,{{},},0, \/* ec,brk... */ 0,0,0,0,0,0, \/* pid etc.. */ 0,-1,...原创 2020-04-04 16:21:45 · 230 阅读 · 1 评论 -
3.3:进程调度-进程,用户级线程,内核级线程总结
进程和线程的对比进程线程详细描述能否并发能能都可以做到交替执行切换内容指令流指令流+资源进程切换时资源也需要一起切换切换代价小大线程切换不需要资源一起切换资源消耗小大创建线程时共用进程资源相互影响操作同一内存完全分离同一进程的不同线程使用先相同地址空间安全性小大隶属关系同一进程操作系统先创建进程...原创 2020-04-03 18:22:39 · 641 阅读 · 2 评论 -
3.2:进程调度-线程
线程概念线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。用户级线程1:创建1)设置创建线程的TCB中的栈指针esp,在栈中弹出需要执行函数的起始地址2)完成相应的可切换函数3)传递相应的参数,即将需要传递的参数依次放人ESP+4,ESP+8的地址2:...原创 2020-04-03 18:02:43 · 156 阅读 · 0 评论 -
3.1:进程调度-进程
进程概念:进程是要管理CPU才引出的概念:程序以及反应程序执行信息的数据结构的总和。人们也给这个数据结构定义了一个基本概念:PCB(process control block),即进程控制块。多进程视图如果只有一个进程,在遇到IO操作的时候,CPU就只能等待I/O操作完成,造成CPU工作效率低下。为了解决这个问题,操作系统中应该启动多个进程,并能在多个进程之间合理切换。具体来说,系统在...原创 2020-04-03 16:44:58 · 96 阅读 · 0 评论 -
2.3:系统调用-实验操作
《冬夜读书示子聿》(南宋)陆游古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。1:实验目的建立对系统调用接口的深入认识;掌握系统调用的基本过程;能完成系统调用的全面控制;2:实验内容在 Linux 0.11 上添加两个系统调用,并编写两个简单的应用程序测试它们。(1)iam()第一个系统调用是 iam(),其原型为:int iam(const char * ...原创 2020-04-03 12:35:08 · 1934 阅读 · 0 评论 -
2.2:系统调用-实现
1:内核态和用户态所有的程序都需要装入内存中使用,所以放置内核代码的那一段程序就是“内核态区域”,放置用户态的那一段代码就是“用户态区域”。用户态代码无法通过jump直接跳到内核态内存区域执行,或通过MOV获取到内核态内存中的数据。那么是如何实现这种操作的呢?操作系统会划定每个区域的特权级,如果访问内存的特权级高于自己,CPU就会拒绝执行。具体来说,cpu会取出俩个主要数值:当前特权级(CP...原创 2020-04-02 18:46:23 · 134 阅读 · 0 评论 -
2.1:系统调用-接口
简介1:进程相关的系统调用有4个1)fork:创建进程2)exec:从磁盘上载入并执行某个可执行程序3)wait:调用wait的进程会等到子进程结束再执行4)exit:进程自己退出时调用的东西2:文件相关的系统调用:1)open:打开某个文件2)read:对文件读操作3)write:对文件写操作使用1.进程#include<stdio.h>#include&l...原创 2020-04-02 16:18:08 · 125 阅读 · 0 评论 -
1.6:系统启动-实验操作
《冬夜读书示子聿》(南宋)陆游古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。实验目的:能对启动进行相应的控制,加深对启动的过程的深入认识实验内容:1)修改启动显示内容,能在屏幕上打印一段提示信息“XXX is booting…”,其中 XXX 是你给自己的操作系统起的名字2)改写 setup.s 主要完成如下功能:bootsect.s 能完成 setup.s 的...原创 2020-04-01 17:45:14 · 136 阅读 · 0 评论 -
1.5:系统启动-总结
总结整个系统启动分为三个过程:1)系统准备2)系统初始化3)系统运转具体过程如下图:linux0.11 整个系统启动已结束,对比现在的启动流程其实本质上思想还是一致的,就是多了一些功能,前面的一部分代码变成了boot这些优化改动。做完相应的实验,就开始下一章的系统调用了。千里之行,始于足下。踏实走好每一步。...原创 2020-04-01 14:54:32 · 148 阅读 · 0 评论 -
1.4:系统启动-第四阶段main.c
1:功能在进入main.c后,主要就是初始化各种管理软硬件的资源。具体细节在后面一一展开。2:代码实现mem_init(main_memory_start,memory_end); //内存初始化trap_init(); //中断向量初始化blk_dev_init(); //块设备初始化chr_dev_init(); //字符设备初始化tty_init(); //tty初始化tim...原创 2020-04-01 14:35:52 · 105 阅读 · 0 评论 -
1.3:系统启动-第三阶段head.s
1:功能setup在获取一些硬件参数,启动保护模式后,就会进入head.s代码中执行。head.s中会进行:1)设置中断表2)设置GDT表3)设置页表4)跳转到main函数2:代码实现2.1 设置中断表重新设置中断描述符idt,共256项,并使各个表项均指向一个只报错误的哑中断程序setup_idt: lea ignore_int,%edx mo...原创 2020-03-31 18:19:15 · 186 阅读 · 0 评论 -
1.2:系统启动-第二阶段setup.s
1:功能从bootset.s跳转到setup.s中执行,该代码作用如下:1:获取初始化的基本参数2:进入保护模式1)将system模块从0x10000-0x8ffff整体移动到0X0地址处2)启动保护模式3)进入32位保护模式运行,并跳转到head.s2:代码实现2.1:获取初始化参数! Get memory size (extended mem, kB)//获取扩展内存并放人...原创 2020-03-31 16:14:35 · 246 阅读 · 0 评论 -
1.1:系统启动-第一阶段bootset.s
1:功能系统开机后,从0xFFFF0处(ROM)取出第一条指令开始执行,进行BIOS自检,检查正常后就用BIOS的输入功能将启动磁盘上的bootset.s读入内存0X7C00处,然后将自己移动到0X90000处。该段程序的主要作用就是:1:将setup加载到bootset后,0X90200处2:调用int 0X10中断,输出屏幕信息:“Loading system…”3:将system模...原创 2020-03-30 16:30:35 · 762 阅读 · 1 评论 -
linux学习目录
记录linux的学习过程目标:完整理解linux 0.11的设计思路,完成相关实验,记录下学习过程以及心得体会1:系统启动2:系统调用3:进程调度4:内存管理5:设备驱动6:文件系统千里之行始于足下,脚踏实地走好每一步。...原创 2020-03-28 16:47:32 · 75 阅读 · 0 评论