pkzd(一个类Unix操作系统的实现)

pkzd: 一个类unix操作系统的简单实现, 由unix v6改写而成
 注: 系统的名字取自游戏pokemon和zelda(注意是pkzd不是pmzd哦)
系统简介:
 pkzd是一个根据unix v6改写的简单的请求调页的类unix操作系统, 系统的设计力求简洁, 所以很多设计非常简陋.
模拟机:
 系统镜像pkzd.img可以在bochs, qemu和virtualbox中运行(virtualbox中的格式为hdd并口硬盘, 只要把pkzd.img改成pkzd.hdd就行了)
硬件支持: x86架构
 系统追求简单只支持键盘, 显示屏和IDE硬盘
系统调用: pkzd支持以下的系统调用:
 pid_t fork(void);
 int execve(char *filename, char **argv, char **envp);
 int exit(int status);
 pid_t wait(int *status);
 pid_t  getpid(void);
 pid_t getppid(void);
 uid_t getuid(void);
 uid_t geteuid(void);
 gid_t getgid(void);
 gid_t getegid(void);
 int setpgid(void);
  该函数为system v版, 在调用此系统调用时父进程应该保证没有子进程存在
 int brk(uint addr);
 int creat(const char *pathname, mode_t mode);
 int open(const char *pathname, int flags, mode_t mode);
 int close(int fd);
 int dup(int fd);
 int read(int fd, char *buf, size_t cnt);
 int write(int fd, const char *buf, size_t cnt);
 off_t lseek(int fd, off_t offset, int whence);
 int mknod(const char *pathname, mode_t mode, dev_t dev);
 int access(const char *pathname, mode_t mode);
 int link(const char *oldpath, const char *newpath);
 int unlink(const char *path);
 int mkdir(const char *pathname, mode_t mode);
 int rmdir(const char *pathname);
 int chdir(char *pathname);
 int stat(const char *pathname, struct stat *stbuf);
 int fstat(int fs, struct stat *stbuf);
命令: 为了节省时间, 我并没有编写太多的命令, 目前只实现了以下命令
 ls
  ls命令只支持参数-aclu
 date
 chdir
 cat
文件系统: pkzd所使用的是一个简单的基于inode的文件系统
 fs目录下有一个最简单的支持文件的命令子集
  mkfs命令:
   mkfs device swapsize inodenumber
   初始化一个虚拟磁盘, device为虚拟磁盘(pkzd.img), swapsize为交换空间的块数(至少1024), inodenumber为inode的数目(至少100)
  ls命令:
   ls device directory
   列出虚拟磁盘device指定目录directory下的所有文件, directory必须为绝对路径
  rm命令:
   rm device pathname
   删除虚拟磁盘device的指定文件pathname, pathname必须为绝对路径, pathname可以是文件, 特殊文件或者空目录
  cat命令:
   cat device pathname
   显示虚拟磁盘device的指定文件pathname, pathname必须为绝对路径, pathname可以是文件或特殊文件
  link命令:
   ./link device dest source
   在虚拟磁盘中创建source的硬链接dest, dest和source必须为绝对路径
  mknod命令:
   ./mknod device pathname mode dev
   在虚拟磁盘中创建一个特殊文件pathname, pathname必须为绝对路径, dev为设备号
   mode为linux结构struct stbuf中的st_mode的值的十进制
   比如16895代表目录, 8630代表字符设备, 33279代表为普通文件
  add命令:
   add device dest source mode  
   复制linux中的普通文件source(unix/linux中的路径名)到虚拟磁盘的dest(虚拟磁盘中绝对路径)中, mode的值同mknod命令中的mode
 虚拟磁盘:
  虚拟磁盘必须包含内核文件/pkzd, /init, 字符设备/dev/tty(设备号必须为0), 目录/bin(所有的命令都在该目录下)
信号:
 系统的信号只存在两种情况, 终止或者忽略
时间:
 时间是北京时间, 其他的时区无法正确的显示时间.我不知道如何从硬件获取正确的时区信息, 如果你知道请告知我.
系统发布在sourceforge:地址如下
https://sourceforge.net/projects/pkzd/

时间: 2024-11-05 18:51:21

pkzd(一个类Unix操作系统的实现)的相关文章

Linux和类Unix系统上5个惊艳的开源备份软件(转)

一个好的备份计划是非常必要的,这样可以有能力恢复被下面几种情形顺坏的数据: 人为损坏 RAID或者磁盘损坏 文件系统损坏 数据中心损毁以及其它 在这篇文章里我会给你列举一些惊艳的开源备份软件. 当给企业选择备份软件的时候应该注意什么? 确保你部署的备份软件支持以下特性: 1.开源软件:你必须使用那些源代码可以被自由修改的软件.这样即使项目停止了或者没有补丁更新也可以确保你能恢复数据. 2.跨平台支持:确保备份软件可以在各种桌面和服务器操作系统上工作. 3.数据格式:开放的数据格式可以确保你能在项

Unix操作系统的入门与基础

http://dev2dev.cnblogs.com/archive/2005/10/10/251894.aspx 与大家熟悉的Windows用户界面和使用习惯不同,Unix是常使用命令运行.极具灵活性的操作系统,目前的产品主要有IBM-AIX.SUN-Solaris.HP-UNIX等.初期接触Unix操作系统,下列的问题几乎是常遇的:由图形界面操作转到以命令行方式操作的不习惯性:在短期内掌握全部命令的困难性:针对同一操作有几个命令的难选择性:不同shell命令格式的易混淆性,等等.一些初学者可

Linux与其它类Unix内核的比较

单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix内核仅支持静态连接: 内核线程:Linux以一种十分有限的方式使用内核线程来周期性地执行几个内核函数,而一些Unix内核则本身被组织成一组内核线程: 多线程应用程序支持:Linux定义了自己的轻量级进程版本,并以此来实现对多线程应用程序的支持,而商用Unix则都是基于内核线程来作为多线程应用程序的执

Linux 和类 Unix 系统上5个最佳开源备份工具

转载:http://linux.cn/article-4623-weixin.html#rd?sukey=cbbc36a2500a2e6cb7678c4d38b691a9fa7403b259f898ef85fa4620177de89e521da2071ebd494c71482c97449337f9 一个好的备份最基本的目的就是为了能够从一些错误中恢复: 人为的失误 磁盘阵列或是硬盘故障 文件系统崩溃 数据中心被破坏等等. 所以,我为大家罗列了一些开源的软件备份工具. 当为一个企业选择备份工具的时

Linux就是一个与Unix相似的锅炉

Unix系列的操作系统是繁殖衍生出来的,而不是诞生出来的!然而其一开始则是诞生出来的——-该观点来自斯宾格勒所著的<西方的没落> Unix一开始,其小巧易用的特点迅速将自身传播开来,就像蒲公英一样.一个偶然的突变造就了Unix,然后就落地生根了,其后再也没有其它的类 Unix系统诞生,而只是在最初的Unix上衍生出很多的系统,比如BSD,Linux...这到底是达尔文主义在起作用还是斯宾格勒的理论在起作用?不得而知!不过可以看看UNIX进程间通信课程. Linux就是一个大锅炉,保持着Unix

【Linux】类Unix 操作系统进程监控控制工具 Supervisor

Supervisor 是一个客户端服务器系统,允许用户监控和控制类 Unix 操作系统上的进程数. 官网 http://supervisord.org 安装1. easy_install supervisor2.setuptools (latest) from http://pypi.python.org/pypi/setuptools.meld3 (latest) from http://www.plope.com/software/meld3/.elementtree (latest) fr

一个类有多大

#include <iostream> using namespace std; class A{}; class B { int b; char c; }; class C { int c1; static int c2; }; int C::c2 = 1; class D:public C,public B{ int d; }; int main() { cout<<"sizeof(A)="<<sizeof(A)<<endl; cou

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

Java语言程序设计 上机实验4 掌握声明接口、一个类实现接口的声明和使用方法

Java语言程序设计 上机实验4 实验目的: 理解接口的作用,理解接口和实现接口的类的关系,掌握声明接口.一个类实现接口的声明和使用方法:熟悉Java语言包和实用包中的常用类. 实验内容:(*)为选做 声明圆柱体类Cylinder,继承椭圆类Ellipse(实现周长Perimeter接口和面积Area接口),为圆柱体类设计较为全面的构造方法,并实现体积Volume接口,计算表面积和体积. 将Java的若干关键字(15个以上)保存在一个字符串数组中,对其按升序排列,再采用顺序查找和二分法查找,判断