smash:一个类unix内核
前言
每一个蹩脚的C++程序员都有一颗做操作系统内核的心。我从大学毕业开始就对操作系统内核感兴趣,将其看作是术之尽头,可惜那时候一直在无忧无虑的忙着玩网游,也就搁置了。随着时间的推移,逐渐就将其淡忘了,但无忧无虑的日子终有到头的时候,在这个寒冬,不情愿的放了个假,也终于有时间来完成一个简陋的内核。
简介
项目地址:https://github.com/wangzq0807/smash
smash是一个类Unix的内核,实现了基于分段和分页的内存管理,单个进程最大4GB虚拟地址空间,支持minix-v2l文件系统,实现了写实复制(fork),管道等机制。
项目演示(请忽略我蹩脚的英语...):
具体的编译安装方法请参照README
编写应用程序
目前已开发的API一共18个:
// 进程退出
extern int exit(int code);
// fork一个进程,父进程返回子进程的id,子进程返回0
extern int fork(void);
// 读文件
extern int read(int fd, char *buf, int count);
// 写文件
extern int write(int fd, const char *buf, int count);
// 打开文件
extern int open(const char *pathname, int flags, int mode);
// 关闭文件
extern int close(int fd);
// 等待指定进程结束
extern int waitpid(int pid, int *status, int options);
// 创建文件
extern int creat(const char *pathname, int mode);
// 创建硬链接
extern int link(const char *oldpath, const char *newpath);
// 删除硬链接或删除文件
extern int unlink(const char *pathname);
// 执行一个可执行程序
extern int execve(const char *pathname, char *const argv[], char *const envp[]);
// 变更当前路径
extern int chdir(const char *pathname);
// 创建目录
extern int mkdir(const char *pathname, int mode);
// 删除目录
extern int rmdir(const char *pathname);
// 切换到其他进程执行
extern int pause(void);
// 获取当前进程id
extern int getpid(void);
// 创建管道
extern int pipe(int fd[]);
// 复制文件描述符
extern int dup(int fd);
以 helloworld 为例,要编写一个应用程序首先要在usr/CMakeLists.txt文件中追加一行:
add_executable (helloworld helloworld.c ${CORE_SRCS})
括号内第一项 helloworld 指的是可执行文件名称
后面的项 helloworld.c 和 ${CORE_SRCS} 是编译所需的源文件
所有应用程序都应该包含 ${CORE_SRCS},因为这里面定义了系统API。
然后就可以打开helloworld.c进行编辑。
跟在linux环境编写c语言代码类似:
#include "stdio.h" int
main(int argc, const char **argv)
{
printf("Hello,World!\n");return ;
}
然后就可以编译了。
注:printf()本身不是一个系统调用,而是通过write()系统调用实现的一个函数。
感谢
最后,感谢赵炯博士的宝书:《Linux内核完全剖析-基于0.12内核》
前五章对我帮助很大,尤其是第四章,
如果没有这本书,以我蹩脚的英语,不可能看懂x86的保护模式。
ps:有对内核感兴趣的可以一起交流,我的微信wangzq0807
smash:一个类unix内核的更多相关文章
- Linux与其它类Unix内核的比较
单块结构的内核:由几个逻辑上独立的成分构成,单块结构,大多数据商用Unix变体也是单块结构: 编译并静态连接的传统Unix内核:Linux能自动按需动态地装载和卸载部分内核代码(模块),而传统Unix ...
- linux入门--类UNIX系统详解
有人说,这个世界上只有两种操作系统: UNIX 和类 UNIX 操作系统: 其它操作系统. 类 UNIX 系统(英文 Unix-like)既包括各种传统的 UNIX 系统,比如 FreeBSD.Ope ...
- 1.4 类UNIX系统是什么鬼?
上节<UNIX和Linux的区别>中讲到了 UNIX 系统的历史,UNIX 是操作系统的开山鼻祖,是操作系统的发源地,后来的 Windows 和 Linux 都参考了 UNIX. 有人说, ...
- 一个Unix内核级别漏洞(一)
翻译原创稿件,prison整理翻译,首发ichunqiu,原地址:http://lsd-pl.net/kernelvuln.pdf 这是一篇关于Unix内核级别漏洞的paper,由某团队发布在一次黑客 ...
- Cygwin 是一个用于 Windows 的类 UNIX shell 环境
cygwin的安装使用 Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
- [转]自己写PHP扩展之创建一个类
原文:http://www.imsiren.com/archives/572 比如我们要创建一个类..PHP代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Vi (Unix及Linux系统下标准的编辑器)VIM (Unix及类Unix系统文本编辑器)
Vi是Unix及Linux系统下标准的编辑器.学会它后,您将在Linux的世界里畅行无阻.基本上vi可以分为三种状态,分别是命令模式.插入模式,和底行模式. vi编辑器是所有Unix及Linux系统下 ...
- Unix内核中打开文件的表示
Unix内核中已经打开文件,通过三种数据结构表示: 每个进程的进程表中的记录项,包含打开的文件的文件描述符表,与之关联的是: 文件描述符标识 指向一个文件表项的指针 内核为所有打开文件维持一张文件表, ...
随机推荐
- PHP获取视频的第一帧与时长
//获得视频文件的缩略图 function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $s ...
- shell基础--shell特殊变量
一.变量列表 二.实验 系统:centos 7 1.特殊变量 [root@~_~ day2]# cat p.sh #!/bin/bashecho '$0:'$0echo '$*:'$*echo '$@ ...
- [luogu1600] 天天爱跑步
题面 直接写正解吧, 不想再写部分分了, 对于\(u\)和\(v\), 我们可以将它拆成两条路径, \(u\)到\(lca(u, v)\)和\(lca(u, v)\)到v, 在这里只分析从\(u\ ...
- Docker删除/停止容器
应用场景:某个相关的业务需要重启,容器太多了,一个一个通过命令行来关闭太麻烦了,直接一条命令直接搞定. 命令如下: $ docker ps // 查看所有正在运行容器 $ docker stop co ...
- 论文笔记 Pose-driven Deep Convolutional Model for Person Re-identification_tianqi_2017_ICCV
1. 摘要 为解决姿态变化的问题,作者提出Pose-driven-deep convolutional model(PDC),结合了global feature跟local feature, 而loc ...
- HDU 2298(纯物理加解一元二次方程)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- mysql/mariadb学习记录——创建删除数据库、表的基本命令
查看已有的数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...
- Java基础——类加载机制
什么叫类加载 JVM把 .class 字节码文件加载到内存,并进行相关的校验.解析.初始化,最终转换为虚拟机可用的JAVA类型的过程,称为JVM类加载机制. (当然,JVM并不关心class文件的来源 ...
- shiro配置说明
Shiro主要是通过URL过滤来进行安全管理,这里的配置便是指定具体授权规则定义. Xml代码 <bean id="shiroFilter" class="or ...
- Gitlab+Jenkins学习之路(六)之Jenkins部署、升级和备份
一.什么是持续集成? (1)Continuous integration(CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集 ...