![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
os操作系统
泽田-慎独
千里之行 始于足下
展开
-
8086CPU寄存器 & linux bootsect.s分析
##8086CPU寄存器有14个寄存器,每个寄存器都有16位长度,分别为AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。AX、BX、CX、DX被定义为通用寄存器,可以用来暂存数据,互不影响。CS、DS、SS、ES被定义为段寄存器,用来提供内存单元的段地址。8086CPU不支持将数据直接送入段寄存器的操作,但支持将一个寄存器中的内容送入另一个寄存器(通...原创 2019-01-06 22:45:08 · 379 阅读 · 0 评论 -
linux-0.11互斥信号量内核代码的实现
互斥信号量内核代码的实现当我们读取磁盘中的一些数据时,我们会调用read这个函数进行读取数据: #include <unistd.h> ssize_t read(int fd, void *buf, size_t count);接着这个read函数内部又调用了系统调用sys_read函数:// linux-0.11/fs/read_write.cint sys_read(...原创 2019-03-18 01:56:34 · 345 阅读 · 0 评论 -
操作系统之内存分区与分页
内存分区如何将程序中的代码段、数据段等内容存放在内存中?1、采用可变分区的方法,每次存放程序段之前找到与之大小匹配的空闲内存段,然后存放进去。2、采用此种方法需要维护2个核心数据表:空闲分区表和已分配分区表。3、此种方法随着进程段的增多会造成大量的小空闲分区,也叫作内存碎片。如果不加以处理,会降低内存使用率。4、当出现大量的内存碎片时,可以采用内存紧缩的方法,合并空闲分区,去除内存碎片。...原创 2019-03-25 01:41:27 · 322 阅读 · 0 评论 -
linux-0.11系统添加信号量功能实验并验证
添加系统调用接口在kernel文件夹中的sem.c文件添加sem_open、sem_wait、sem_post、sem_unlink等接口:int sys_sem_open(const char *name, unsigned int value);int sys_sem_wait(sem_t *sem);int sys_sem_post(sem_t *sem);int sys_sem_...原创 2019-03-24 00:14:17 · 362 阅读 · 0 评论 -
操作系统之段页式内存管理
概述操作系统中使用段页式内存管理策略的目的是为了更好地访问内存。那段页式内存管理策略究竟是什么样呢?先看一张有关这个策略的图片:这张图片从左向右看,最开始的cs:ip(也被称为逻辑地址或者偏移地址),与中间的虚拟地址(也被称为线性地址)建立关联,然后将虚拟地址与右边的内存物理地址建立关联。问题:我们使用内存的目的其实是把程序放入内存中,然后在必要的时候访问内存,读写内存。为什么把程序段放入...原创 2019-03-27 01:59:19 · 1483 阅读 · 0 评论 -
操作系统死锁处理方法
什么是死锁简单来说:多个进程之间各自占有的资源和互相申请的资源形成了环形等待,这种情况下会造成死锁。1、举例分析// 生产者Producer(item) {P(empty); // 替换为P(mutex)P(mutex); // 替换为P(empty)... // 处理共有资源V(mutex);V(full); }// 消费者Consumer() {P(full);...原创 2019-03-24 17:23:00 · 1024 阅读 · 0 评论 -
操作系统之地址映射与共享实验
实验内容1、用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,了解IA-32和Linux 0.11的内存理机制。2、在Ubuntu上编写多进程的生产者—消费者程序,用共享内存做缓冲。3、在信号量实验的基础上,为Linux 0.11增加共享内存功能,并将生产者—消费者程序移植到Linux 0.11。跟踪地址翻译过程1、编写view-memory.c文件:#inclu...原创 2019-04-05 12:55:13 · 1900 阅读 · 0 评论 -
操作系统中内存管理之请求调页
概述我们知道当我们使用内存管理策略时,我们编程中使用的地址在0-4G之间(对于32位机器来说),但是往往实际的内存没有那么大,可能只有1G左右。当pc指针移动取址时,发现取出的虚拟地址无法映射到实际的内存页上,这种情况就称为缺页。发生缺页的原因通常是一个程序的程序段在虚拟内存上排列的较为分散,起始范围与末梢范围太大,这种情况下,每次执行到不同的段时容易发生缺页。请求调页如果本身的程序很大,...原创 2019-03-28 00:24:06 · 2333 阅读 · 0 评论 -
操作系统之键盘捕捉
linux下挂载键盘试想一下,当按下键盘上某个字符时,操作系统是怎样获取到这个字符的呢?然后又怎样回显到终端的呢?按下键盘触发键盘中断void main(void){ ... tty_init(); ...}void tty_init(void){ rs_init(); con_init();}void con_init(void){ ... // 设置键盘中断处...原创 2019-04-11 00:19:43 · 1106 阅读 · 0 评论 -
操作系统之内核栈的切换实验
实验内容现在的Linux 0.11采用TSS和一条指令就能完成任务切换,虽然简单,但这指令的执行时间却很长,在实现任务切换时大概需要 200 多个时钟周期。而通过堆栈实现任务切换可能要更快,而且采用堆栈的切换还可以使用指令流水的并行优化技术,同时又使得CPU的设计变得简单。所以无论是 Linux还是 Windows,进程/线程的切换都没有使用 Intel 提供的这种TSS切换手段,而都是通过堆栈...原创 2019-04-07 18:44:26 · 546 阅读 · 0 评论 -
操作系统之字符显示的控制实验
实验目的按下F12,后面终端显示键盘的字符全部用’*'代替;再次按下F2,后面终端显示键盘的字符又恢复正常。实验过程编写press_f12_handle函数// linux-0.11/kernel/chr_drv/tty_io.cint switch_show_char_flag = 0;void press_f12_handle(void){ if (switch_show_ch...原创 2019-04-11 22:20:50 · 1328 阅读 · 0 评论 -
操作系统之打印Hello World
调用printf// linux-0.11/init/main.cstatic int printf(const char *fmt, ...){ va_list args; int i; va_start(args, fmt); // 核心代码,再调用write write(1,printbuf,i=vsprintf(printbuf, fmt, args)); va_end...原创 2019-04-09 23:23:09 · 864 阅读 · 0 评论 -
操作系统之生磁盘的使用一
磁盘的使用一什么磁盘简单来说,就是信息的载体。磁盘利用了电流的磁效应,对一些电信号进行磁化,保存在磁盘中,用来表示一些信息。那么磁盘的结构又是怎样的呢?上面这张图是磁盘的示意图。磁盘中有一个概念:盘面。盘面可以理解为磁盘内部中有很多叠加在一起的盘面,磁盘的信息就存储在这些盘面上。那每张盘面都有什么结构呢?从上面这张图可以看出每个盘面上都有磁道、扇区这2个概念。先从磁道说起,每个盘面上...原创 2019-04-13 21:49:08 · 590 阅读 · 0 评论 -
操作系统之生磁盘的使用二
C-SCAN磁盘调度(电梯算法)上节我们已经知道了通过传递block这个参数就可以在磁盘中指定的一些扇区进行读写操作。现在我们考虑一种情况,一个操作系统中会有多个进程使用到磁盘,如何保证这些进程使用磁盘既准确又快速?那么就要引出我们的磁盘调度算法了,这里我们介绍操作系统中正在使用的调度算法,就是C-SCAN磁盘调度算法,也被称作电梯算法。我们都知道电梯在运行的时候有上升和下降2种逻辑情况。当电...原创 2019-04-14 12:44:38 · 222 阅读 · 0 评论 -
操作系统中内存使用与分段
计算机运行本质计算机运行的本质是取址执行。1、这里的取址就是从内存中的某个地址处取得指令,然后放入CPU中进行解析该指令2、这里的执行就是在CPU解析完该指令后,按照该指令的意愿去处理一些任务,比如读数或写数。内存中的物理地址与程序中的虚拟地址计算机操作系统上电运行时会把存储在磁盘上的程序指令读入到内存中。我们知道程序每次运行一个周期都会取址一次,这里的地址就是对应着我们在写程序时对各函...原创 2019-03-24 20:03:10 · 249 阅读 · 0 评论 -
linux进程运行轨迹实验
linux进程运行轨迹实验实验目的编写一个进程样本程序,运行在修改的linux-0.11系统上,收集进程运行的轨迹,观察各个进程的就绪、运行、等待等状态的切换。实验步骤1、编写样本程序:2、编写内核打印程序:3、调整linux-0.11/init/main.c:4、添加专有打印代码:&amp;gt; 如何添加这些fprintk?其实就是在内核代码中所有有关进程的state变量被赋值的地方...原创 2019-03-16 17:23:31 · 286 阅读 · 0 评论 -
linux-0.11 schedule调度函数主要源码分析
schedule调度函数主要源码分析// linux-0.11/kernel/sched.cvoid schedule(void){ int i,next,c; struct task_struct ** p;/* check alarm, wake up any interruptible tasks that have got a signal */ for(p = &amp...原创 2019-03-10 10:22:15 · 849 阅读 · 0 评论 -
汇编语言学习之基础篇章
机器指令是什么本质上来说,机器指令是一串二进制数据,电子器件通过读取这串数据来进行电子器件内部的与非门、或门等开关选择。汇编指令是什么汇编指令本质上对机器指令进一步包装,形成便于人们记忆的符号。人们通过汇编指令向机器表达自己的逻辑,然后汇编编译器将编写好的汇编指令解析成对应的机器指令,最后机器读取机器指令表达既定的逻辑选择。汇编指令的组成:1、汇编指令:机器码的助记符,有对应的...翻译 2019-01-10 23:49:00 · 124 阅读 · 0 评论 -
汇编语言学习之寄存器
寄存器一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。运算器进行信息处理。寄存器进行信息存储。控制器控制各种器件进行工作。内部总线连接各种器件,在他们之间进行数据的传送。通用寄存器对于8086CPU来说,所有的寄存器都是16位的。AX、BX、CX、DX这4个寄存器被定义为通用寄存器,用来存放一般性的数据。AX可以分为AH和AL;BX可以分为BH和BL...翻译 2019-01-13 21:07:32 · 282 阅读 · 0 评论 -
汇编语言学习之[bx]&loop
[bx]的含义mov a1,[bx] 的意思:将一个内存单元的内容送入a1,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。idata是什么意思约定符号idata表示常量mov ax, [idata] == mov ax,[1]、mov ax,[2]、mov ax,[3]等mov ax, idata == mov ax,1、mov ax,2、mo...翻译 2019-01-18 21:59:37 · 483 阅读 · 0 评论 -
汇编语言学习之定位内存地址
and & or 指令and指令:逻辑与指令,按位进行与运算。or指令:逻辑或指令,按位进行或运算。以字符形式给出的数据在汇编程序中,用’…'的方式指明数据是以字符的形式给出的比如:db 'unix’表示的意思是db 75h,6eh,49h,58h[bx+idata][bx+idata]表示一个内存单元,它的偏移地址为bx中的数值加上idataSI &...翻译 2019-01-19 23:24:09 · 1323 阅读 · 0 评论 -
汇编语言学习之编写第一个程序
程序从写出到执行的过程1、使用文本编辑器,使用汇编语言编写汇编源程序。2、对源程序进行编译链接。汇编链接的过程:1、产生目标文件。2、使用连接程序对目标文件进行链接,生成可在操作系统中直接运行的可执行文件。可执行文件包含两部分内容:1、程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)2、相关的描述信息(比如,程序有多大、要占用多少内存空间等)...翻译 2019-01-15 22:16:07 · 526 阅读 · 0 评论 -
汇编语言学习之转移指令
操作符offset操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。jmp指令jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。jmp指令要给出两种信息:1、转移的目的地址2、转移的距离(段间转移、段内短转移、段内近转移)jmp short 标号(转到标号处执行指令)–段内短转移方式jmp far ptr 标号–实现...翻译 2019-01-21 23:55:02 · 562 阅读 · 0 评论 -
汇编语言学习之标志寄存器
ZF标志零标志位,它记录相关指令执行后,其结果是否为0.如果结果为0,那么zf=1,反之,则zf=0.影响zf标志的大都是运算指令。PF标志奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是否位偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0.SF标志符号标志位,它记录相关指令执行后 ,其结果是否为负。如果结果为负,sf=1;如果非负,sf=0....翻译 2019-01-22 23:27:59 · 232 阅读 · 0 评论 -
汇编语言学习之中断
8086CPU中断过程1、(从中断信息中)取得中断类型码;2、标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中);3、设置标志寄存器的第8位TF和第9位IF的值为0;4、CS的内容入栈;5、IP的内容入栈;6、从内存地址为中断类型码4和中断类型码4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。汇编中段处理程序的编写方法和子程序的比较相似...翻译 2019-02-05 17:01:02 · 1199 阅读 · 0 评论 -
汇编语言学习之链接过程相关知识
内存中相关概念.global symbol解释.global 为汇编编译器中的关键字,其作用是使得链接器ld能够识别symbol声明symbol是全局可见的。例如:.global _start —定义_start为外部程序可以访问的标签.text解释.text后面的内容存放在代码段,代码段是可以被cpu每次读取指令取址执行的text段在内存中被映射为只读.bss解释...原创 2019-02-08 16:49:29 · 822 阅读 · 0 评论 -
操作系统调用实验过程记录
实验内容1、在linux-0.11系统下添加两个系统调用:sys_iam(const char* name) 和sys_whoami(char* name, unsigned int size).2、sys_iam()实现向内核空间写入一段字符串,字符串长度不大于23的功能。3、sys_whoami()实现从上述的内核空间读出那段字符串到用户空间中的功能。4、并编写应用程序测试这个加...原创 2019-02-21 23:14:30 · 359 阅读 · 0 评论 -
linux系统调用的实现-流程分析-以printf为例
为什么用户程序不能直接访问内核态的内存?因为为了安全起见,强制规定用户程序只能通过系统调用来访问内核态的内存。区分内核和用户段:一种处理器“硬件设计”DPL在GDT表中会有初始化CPL:当前特权级,处于CS的低2位DPL:目标特权级DPL &amp;gt;= CPL用户程序主动进入访问内核的方法通过使用中断&quot;int&quot;指令可以主动进入内核系统调用核心用户程序中包含一段int指令...原创 2019-02-18 00:05:37 · 1979 阅读 · 0 评论 -
操作系统进程概述
多进程图像Process Control Block:用来记录进程信息的数据结构进程状态有运行状态、就绪状态、等待状态、终止状态和新建状态。多进程如何交替新开一个进程时,会进行系统调度运行schedule()函数schedule()函数内部核心步骤是先获取下一个就绪的进程pcb信息然后在现有的进程基础上切换到新的进程。切换的核心过程,首先将当前进程的信息保存到对应的PCB结...原创 2019-02-28 00:28:13 · 130 阅读 · 0 评论 -
进程源码分析-以fork函数为例分析
进程源码分析-以fork函数为例分析int main(int argc, char **argv){ A(); B(); exit(0); return 0;}void A() {fork();}前提知识点:1、每次在执行一个函数内部功能前会把函数的下一条指令压栈2、每个栈都与每一层的函数接口相对应3、分析汇编代码,要时刻关注栈的内容变化在...原创 2019-03-06 01:14:57 · 261 阅读 · 0 评论 -
操作系统之建立proc文件系统实验
实验目的在linux-0.11内核中添加proc文件系统实验过程编写文件// oslab/linux-0.11/fs/namei.c@ -441,7 +441,7 @@ int sys_mknod(const char * filename, int mode, int dev) return -ENOSPC; } inode->i_mode = mode;- if...原创 2019-04-18 01:06:13 · 909 阅读 · 0 评论