操作系统
文章平均质量分 91
mxy990811
这个作者很懒,什么都没留下…
展开
-
操作系统真象还原实验记录之实验三十四:实现管道
操作系统真象还原实验记录之实验三十四:实现管道1.管道相关知识总结先说我们操作系统的管道实现:上述图中,管道缓冲区就是一页内存,这一页内存被我们当成了环形缓冲区结构,当这页管道被创建出来后,全局打开文件表中某个表项记录会着这个管道,其中fd_inode记录着这页地址,fd_flag=PIPE_FLAG表示管道,fd_pos记录着此管道打开数。此表项会被安装到进程的fd_table中,占用两个fd用于读写,pipefd[0]、pipefd[1]分别保存这两个fd。由此看来,管道是一页环形缓冲区原创 2022-02-09 18:41:00 · 574 阅读 · 0 评论 -
操作系统真象还原实验记录之实验三十三:实现系统调用wait和exit
操作系统真象还原实验记录之实验三十三:实现系统调用wait和exit1.wait、exit、孤儿进程、僵尸进程exit由子进程调用,表面上功能是使子进程结束运行并传递返回值给内核,本质上是内核在幕后回收该子进程除了pcb一页外的所有资源。wait由父进程调用,表面上功能是使父进程阻塞自己,直到子进程调用exit结束自己时,获取子进程的返回值,本质上是内核在幕后将子进程的返回值传递给父进程后会唤醒父进程,并且将子进程pcb回收。孤儿进程就是子进程生命周期尚未结束,尚未调用exit,但是父进程提前结束,原创 2022-02-09 08:52:14 · 914 阅读 · 0 评论 -
操作系统真象还原实验记录之实验三十二:加载用户进程
操作系统真象还原实验记录之实验三十二:加载用户进程1.实现execexec.c之segment_load#include "exec.h"#include "thread.h" #include "stdio-kernel.h"#include "fs.h"#include "string.h"#include "global.h"#include "memory.h"extern void intr_exit(void);typedef uint32_t Elf32_Word原创 2022-02-08 10:53:50 · 507 阅读 · 7 评论 -
操作系统真象还原实验记录之实验三十一:实现简单的shell
操作系统真象还原实验记录之实验三十一:实现简单的shellWindows中,图形界面的资源管理器和命令行窗口都是交互接口,尽管这些交互接口名字及外观各异,但他们往往统称外壳程序shell的功能是获取用户的输入,分析输入的命令,判断内部命令还是外部命令,然后执行不同的命令策略shell.c之print_prompt函数#define MAX_ARG_NR 16 // 加上命令名外,最多支持15个参数#define cmd_len 128 //最大支持键入128个字符的命令行输入原创 2022-02-06 18:43:18 · 1324 阅读 · 6 评论 -
操作系统真象还原实验记录之实验三十:fork的实现,增加read、putchar、clear系统调用
操作系统真象还原实验记录之实验三十:fork的实现,增加read、putchar、clear系统调用1. fork原理与实现fork是叉子,作用是将父进程克隆给子进程,并返回父进程pid。父进程先调用fork系统调用中断进入内核态,完成了拷贝父进程给子进程,并将子进程设置为就绪态后,中断返回父进程pid,执行fork之后的代码,打印父进程pid,父进程结束。调度执行子进程,设置好thread_stack,利用switch_to进入intr_exit,利用中断返回,从而跳转到子进程并返回子进程pid,原创 2022-02-05 17:25:59 · 888 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十九:实现删除目录、工作目录、文件属性
操作系统真象还原实验记录之实验二十九:1.删除目录删除目录的本质是不断递归删除空目录与删除文件dir.c之dir_is_empty、dir_remove/* 判断目录是否为空 */bool dir_is_empty(struct dir* dir) { struct inode* dir_inode = dir->inode; /* 若目录下只有.和..这两个目录项则目录为空 */ return (dir_inode->i_size == cur_part->s原创 2022-01-30 15:22:05 · 1002 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十八:实现文件删除、创建与遍历目录
操作系统真象还原实验记录之实验二十八:实现文件删除文件的删除首先是格局。删除一个已被打开的文件,那么它内存的inode,磁盘的inode,打开文件表表项,以及pcb的文件描述符数组对应项,均无意义,相应的磁盘里的inode位图,inode数组也要修改。它占用的若干扇区也要回收,扇区地址记录在inode直、间接索引,相应block位图也要修改。最后它的目录项需要清除inode.c的基本函数inode_release、inode_delete(回收inode)inode_release:函数功原创 2022-01-30 09:22:11 · 798 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十七:文件的打开、关闭、写、读、读写指针定位
操作系统真象还原实验记录之实验二十七:文件的打开与关闭1. 文件的打开与关闭fs.c之sys_open完善switch (flags & O_CREAT) { case O_CREAT: printk("creating file\n"); fd = file_create(searched_record.parent_dir, (strrchr(pathname, '/') + 1), flags); dir_close(searched_record.parent_原创 2022-01-29 09:47:27 · 2447 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十六:创建文件
操作系统真象还原实验记录之实验二十六:创建文件创建一个普通文件波及的东西首先明确一点,创建是在磁盘创建,内存中不需要有任何关于此文件的信息,因为并不是打开,所以关注的应该是磁盘里那些东西需要修改、同步。(1)文件需要分区分配inode结点,于是这就会波及inode_bitmap、inode_table数组里的某一项。(2)文件需要存储在具体的扇区,inode->i_sector存储着文件扇区地址,需要向block_bitmap申请。(3)文件必须有一个目录项,存储于某个目录,所以它的目录的原创 2022-01-28 14:27:26 · 367 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十五:文件操作相关基础函数
操作系统真象还原实验记录之实验二十五:文件操作相关基础函数原创 2022-01-27 10:28:20 · 552 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十四:创建并挂载文件系统
操作系统真象还原实验记录之实验二十四:文件系统MBR.S用于加载某个分区的的操作系统引导块,可以理解成loader.s,而loader.s负责加载根目录、操作系统。不同的分区可以不同的操作系统。你可以加载c盘的Linux操作系统,也可以加载d盘的windows操作系统。根目录文件地址规定死,记录在超级块中。目录文件里有目录项,一个目录项对应一个文件,它的inode指针就是指向该文件。这个文件可以是目录文件,里面原创 2022-01-19 17:43:49 · 1141 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十三:硬盘分区,并编写硬盘驱动程序
操作系统真象还原实验记录之实验二十三:编写硬盘驱动程序1.硬盘分区1.1 创建Seven80.img硬盘./bximage -mode=create -imgmode=flat -hd=80 -q Seven80.img1.2 查看bochs配置的硬盘数1.3 修改bochsrc.diskata0-slave: type=disk, path="Seven80.img", mode=flat, cylinders=162, heads=16,spt=63柱面数=162,磁头数=16,原创 2022-01-16 20:37:28 · 2251 阅读 · 2 评论 -
操作系统真象还原实验记录之实验二十二:完善堆内存管理
操作系统真象还原实验记录之实验二十二:完善堆内存管理之前的内存管理基于创建的一个内核内存池,一个用户内存池,以及它们对应的位图,构造了一些用于分配内存的函数,但是这些函数每次分配最少也是4KB即一个页框。为了实现更小的内存分配,实现sys_malloc,这次实验增加了一些数据结构和对应的函数。1.实验代码(实现sys_malloc)1.1 memory.h增/* 内存块 */struct mem_block { struct list_elem free_elem;};/* 内存块描原创 2021-07-07 20:05:44 · 254 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十一:实现printf
操作系统真象还原实验记录之实验二十一:实现printf实现write系统调用略2.实验代码2.1 stdio.c#include "stdio.h"#include "interrupt.h"#include "global.h"#include "string.h"#include "syscall.h"#include "print.h"#define va_start(ap, v) ap = (va_list)&v // 把ap指向第一个固定参数v#define va原创 2021-07-07 12:25:45 · 286 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二十:实现系统调用
操作系统真象还原实验记录之实验二十:实现系统调用1.实验代码1.1 interrupt.c(增加)#define IDT_DESC_CNT 0x81 // 目前总共支持的中断数extern uint32_t syscall_handler(void);/*初始化中断描述符表*/static void idt_desc_init(void) { int i, lastindex = IDT_DESC_CNT - 1; for (i = 0; i < IDT_DESC原创 2021-07-07 10:18:41 · 384 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十九:实现用户进程
操作系统真象还原实验记录之实验十九:实现用户进程1.相关基础知识1.1 特权级(书P229)cs寄存器的最后两位就是CPL,表示了cpu当前特权级。对于访问数据段(type含有X可执行属性)CPL和RPL<=DPL对于访问非一致性代码段(type不含有X可执行属性)只能平级,如果想执行跟高级的代码段,只能采用调用门,中断门,执行后CPL会改变成非一致性代码段的DPL。特权级从低到高,调用门、中断门从高到低,iret,retf访问一致性代码段(type字段C为1)数值上CPL>原创 2021-07-06 13:46:39 · 839 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十八:环形缓冲区
操作系统真象还原实验记录之实验十八:环形缓冲区1.实验代码1.1 ioqueue.h#ifndef __DEVICE_IOQUEUE_H#define __DEVICE_IOQUEUE_H#include "stdint.h"#include "thread.h"#include "sync.h"#define bufsize 64 /* 环形队列 */struct ioqueue {// 生产者消费者问题 struct lock lock; /* 生产者,缓冲区不满时就原创 2021-07-01 13:12:53 · 331 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十七:实现键盘输入
操作系统真象还原实验记录之实验十七:实现键盘输入1.相关基础知识8042位于南桥芯片8048位于键盘,通过USB接口与8042通信键盘按下一个键,8048向8042发出了改建的通码,8042收到后转化成第一套键盘扫描码,然后存入自己的输出缓冲区,然后8042向中断代理发中断8042输出缓冲区寄存器端口号0x60,大小只有1字节。键盘中断处理程序用in指令通过端口0x60读出扫描码。其他见书。2.实验代码2.1 键盘驱动前的小准备2.1.1 kernel.S增加VECTOR 0x21,原创 2021-06-30 17:09:15 · 537 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十六:用锁实现终端输出
操作系统真象还原实验记录之实验十六:用锁实现终端输出1.相关基础知识信号量 初值代表可用临界资源可用个数PV操作P:信号量为0就阻塞,为1就减一V:信号量+12.实验代码2.1关中断解决临界区的竞争put_char的工作原理1.获取光标值(1)通知光标寄存器(显卡上的端口)获取高8位(2)获取光标值的高8位(3)通知光标寄存器(显卡上的端口)获取低8位(4)获取光标值的低8位2.将光标值转化成字节地址,[gs:bx]访问显存写入字符以及属性3.更新光标的值(1)通知光标寄存器原创 2021-06-30 15:24:54 · 565 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十五:多线程调度
操作系统真象还原实验记录之实验十五:多线程调度对应书P428 9.4节1.相关基础知识2.实验记录2.1 实验流程上次实验中,实现了一个线程的运行:具体是1.申请了一页物理页作为PCB2.init_thread填写了位于PCB所在物理页最低地址处的PCB结构体3.thread_create留出位于PCB所在物理页最高地址的中断栈、线程栈的位置,并填写了线程栈的各个成员,其中eip赋值成了函数kernel_thread地址。4.最后一句内联汇编将esp置为线程栈首地址,ret开启了线程,执行原创 2021-06-20 15:25:11 · 781 阅读 · 0 评论 -
# 操作系统真象还原实验记录之实验十四:实现内核线程
操作系统真象还原实验记录之实验十四:内存管理系统对应书P409 9.2节1.相关基础知识总结进程有资源即页表,进程的所有线程公用进程的页表2.实验代码2.1thread.h#ifndef __THREAD_THREAD_H#define __THREAD_THREAD_H#include "stdint.h"typedef void thread_func(void*);/* 进程或线程的状态 */enum task_status { TASK_RUNNING, TAS原创 2021-06-18 21:37:44 · 456 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十三:内存管理系统
操作系统真象还原实验记录之实验十三对应书P374 8.3节1.相关基础知识总结2.实验代码2.1 实现字符串操作函数2.1.1 针对size个字节的操作函数以字节为单位就是以字符为单位,内存是一个字节对应一个内存地址编号的,比如一个char a 或者一个uint8_t a。a均代表八位比特的数值(或ASCII码)。 *a代表这个ASCII码的内存地址。++(*a)代表a的下一个内存地址编号/* 将dst_起始的size个字节置为value */void memset(void* dst_,原创 2021-06-18 17:24:42 · 878 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十二:实现ASSERT
操作系统真象还原实验记录之实验十二:实现assert断言,通过makefile完成编译对应书P367 第8.2节1.相关基础知识见书2.实验代码2.1 interrupt.c增加的代码#define EFLAGS_IF 0x00000200 // eflags寄存器中的if位为1#define GET_EFLAGS(EFLAG_VAR) asm volatile("pushfl; popl %0" : "=g" (EFLAG_VAR))/* 开中断并返回开中断前的状态*原创 2021-05-26 18:06:55 · 623 阅读 · 0 评论 -
操作系统真象还原实验记录之实验十一:实现中断处理(二)
操作系统真象还原实验记录之实验十一:实现中断处理(二)书p335 7.6.2 改进中断处理程序,并调快时钟1.实验代码第一次修改对应书p335 7.6.2 改进中断处理程序这次是上一次实验的修改在cpu获得中断向量号后,会调用中断处理程序,上次实验中断处理程序kernel.s是汇编写的,这次对kernel.s进行修改,在中断处理程序里调用了c语言写的处理程序来执行中断处理1.1 interrupt.c#include "interrupt.h"#include "stdint.h"#in原创 2021-05-24 20:21:49 · 622 阅读 · 4 评论 -
操作系统真象还原实验记录之实验十:实现中断处理
操作系统真象还原实验记录之实验八:实现中断处理书P3191.相关基础知识1.1 中断处理过程忽视细节,整体过程如下1.外设发出中断信号给8259A芯片2.8259A芯片处理信号,并向CPU发送中断向量号3.CPU根据中断向量号,在IDT表中找到对应的中断门描述符,从获取中断门描述符获取对应的中断处理程序所在代码段的选择子和偏移地址,开始执行中断处理程序4.中断处理程序执行结束,CPU返回原程序1.2 8259A芯片对应上述第二步,在8259A芯片的某个引脚接收到外设的中断信号后,发生原创 2021-05-24 14:56:53 · 1475 阅读 · 1 评论 -
操作系统真象还原实验记录之实验九:实现打印字符串函数和整数函数
操作系统真象还原实验记录之实验八:实现打印字符串函数书P276本次实验就是上次实验打印字符的连续调用。1.相关基础知识c编辑器会把字符串结尾自动填上0,并为该字符串分配连续的内存,如果传递参数是字符串的话,那么传递的是字符串的内存首地址。2.实验代码2.1 print.h#ifndef __LIB_KERNEL_PRINT_H#define __LIB_KERNEL_PRINT_H#include "stdint.h"void put_char(uint8_t char_asci);v原创 2021-05-15 17:49:02 · 613 阅读 · 0 评论 -
操作系统真象还原实验记录之实验八:用c与汇编混合编程实现打印字符函数
操作系统真象还原实验记录之实验八:打印函数对应书P2742.实验代码2.1 print.sTI_GDT equ 0RPL0 equ 0SELECTOR_VIDEO equ (0x0003<<3) + TI_GDT + RPL0[bits 32]section .text;------------------------ put_char -----------------------------;功能描述:把栈中的1个字符写入光标所在处;-------原创 2021-05-15 00:36:03 · 828 阅读 · 3 评论 -
操作系统真象还原实验记录之实验七:加载内核
操作系统真象还原实验记录之实验七:加载内核对应书P2071.相关基础知识总结1.1 elf格式1.1.1 c程序如何转化成elf格式写好main.c的源程序//main.cint main(void){ while(1); return;}使用命令gcc -c -o main.o main.c && ld main.o -Ttext 0xc0001500 -e main -o kernel.bingcc会自动将main.c转化成具有elf格式的kernel.b原创 2021-04-18 19:42:05 · 1529 阅读 · 1 评论 -
操作系统真象还原实验记录之实验六:内存分页
操作系统真象还原实验记录之实验五:内存分页对应书P199页 5.21.相关基础知识总结页目录 页目录项 页表 页表项 物理页 虚拟地址 物理地址概念略页目录项及页表项低3字节都是属性。高20位都是物理地址。本次实验虚拟地址:32位=4GB物理地址:32MB (但是分页机制下能访问的实地址只有低1MB)32MB是上次实验内存容量的检测结果。一块物理页大小:4kB一个页表大小:4kB一个页表项大小:4B一个页表有1024个页表项所以一个页表可表示1024*4kB=4MB的虚拟内存原创 2021-04-17 18:51:17 · 1080 阅读 · 0 评论 -
操作系统真象还原实验记录之实验五:内存容量检测
操作系统真象还原实验记录之实验五:内存容量检测对应书P181页1.相关知识总结BIOS中断0x15的3个子功能0xe820、0xe801、0x88详情具体见书P1782.实验记录2.1实验目的上次实验我们进入了保护模式,但在从实模式进入保护模式前,其实还应该先在实模式下获取硬盘内存的容量。实模式下,BIOS中断0x15提供了3个子功能,均可以获取内存容量本次实验,我们将修改上次实验loader.s代码,在该代码进入保护模式前,使用这3个子功能,获取内存容量,方便进入保护模式后的编程。本次原创 2021-04-16 22:19:34 · 683 阅读 · 0 评论 -
操作系统真象还原实验记录之实验四:第一次进入保护模式
操作系统真象还原实验记录之实验四:保护模式一.相关基础知识1.段描述符 GDT LDT GDTR LDTR 选择子1.1 段描述符:1.2 GDTR:指令格式:lgdt 48位内存数据。 GDTR记录GDT内存起始地址1.3 LDTR: 指令格式:lldt 16位寄存器/16位内存数据表示将某个16位寄存器数据或者16位内存数据放入LDTR寄存器。LDTR只有16位,并不能记录LDT的内存起始地址,所以LDTR充当选择子作用。LDT的内存起始地址在位于GDT的段描述符中,LDTR用于索引原创 2021-04-15 19:04:50 · 1022 阅读 · 0 评论 -
操作系统真象还原实验记录之实验三:让mbr使用硬盘
操作系统真象还原之实验三:让mbr使用硬盘对应书中129页 3.6.1 让mbr使用硬盘1.相关基础知识总结1.1 硬盘与硬盘控制器硬盘控制器是针对硬盘的I/O接口,与显卡与显示器不同的是,显卡与显示器是分开的,硬盘与硬盘控制器是连接在一起的。硬盘:0盘0道1扇区(CHS方式从1开始编号)与0盘0道0扇区(LBA方式从0开始编号)硬盘的并行和串行接口:以前的接口为并行,叫做PATA(Parallel ATA)。现在刚出道的接口为串行接口,叫做SATA(serial ATA)连接硬盘与PAT原创 2021-04-14 15:48:02 · 694 阅读 · 0 评论 -
操作系统真象还原实验记录之实验二:改进mbr,访问显存
操作系统真象还原之实验二:改进mbr对应书中第110页 3.3.4改进mbr,直接操作显卡1.相关基础知识总结实模式下,文本模式的显存是从0xB8000到0xBFFFF,大小是32KB。文本模式也分为多种模式,用列数*行数来表示,显卡加电后,默认置为模式80 * 25,代表一屏可容纳2000个字符。一个字符要占显存两个字节,第一个字节是属性,第二个字节是ASCII码。所以一屏需要显存4000字节。所以32KB显存可以容纳大约32KB/4000约等于8屏的数据。2.实验记录2.1实验目的上原创 2021-04-14 15:47:38 · 463 阅读 · 0 评论 -
操作系统真象还原实验记录之实验一:第一次编写mbr
操作系统真象还原之实验一:第一次编写mbr对应书中第2.3节:让mbr飞一会 第58页一.相关基础知识提炼总结在电脑未开机前,BIOS就被加载到内存的F0000~FFFFF中。此区域为ROMMBR被加载到磁盘的0盘0道1扇区(CHS方式)CHS 方式中扇区的编号是从 开始的当电脑按下power键后,cs:ip会被强制置为F000:FFF0 ,所以cpu会执行内存地址FFFF0处的指令。FFFF0处的指令为跳转指令jmp far f000:e05b。跳转后,BIOS 便马不停蹄地检测内原创 2021-04-14 14:05:07 · 1740 阅读 · 6 评论