前言

每一个蹩脚的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[2]);
// 复制文件描述符
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 0;
}

然后就可以编译了。

注:printf()本身不是一个系统调用,而是通过write()系统调用实现的一个函数。

感谢

最后,感谢赵炯博士的宝书:《Linux内核完全剖析-基于0.12内核》

前五章对我帮助很大,尤其是第四章,

如果没有这本书,以我蹩脚的英语,不可能看懂x86的保护模式。

ps:有对内核感兴趣的可以一起交流,我的微信wangzq0807

转载于:https://www.cnblogs.com/SuperFlanky/p/10092140.html

smash:一个类unix内核相关推荐

  1. Redox随笔(1)-用Rust语言编写的类UNIX操作系统

    Redox是一个用Rust语言编写的类UNIX操作系统 , 它的目标是把Rust语言的创新带入到一个现代的微内核和全系列的应用程序. https://www.redox-os.org/zh/docs/ ...

  2. UNIX家族及类UNIX系统

    UNIX家族及类UNIX系统 BSD FreeBSD NetBSD OpenBSD Sun Solaris SCO UNIX Darwin MINIX Linux DOS和它的接班人 DOS Wind ...

  3. Redox随笔(2)-用Rust语言编写的类UNIX操作系统

    与其他操作系统相比,Redox如何 我们与其他操作系统有很多共同之处. 由于 Redox syscall接口是Unix-y.例如,我们有open, pipe, pipe2, lseek, read, ...

  4. 又一位纯手工打造CPU的牛人,并且汇编语言实现类Unix系统,支持文件系统

    作者:安富莱电子,排版:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 硬件设计:     GR8CPU是在面包板上构建功能齐全的计算机.第一个版本GR8CPU Rev2拥有600多条电线 ...

  5. Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理

    文章目录 一.Linux 的启动过程 二.初始化程序 (一)System V init (二)Upstart init (三)systemd (四)Launchd (五)Epoch (六)Mudar ...

  6. 【转载】Linux等类Unix系统学习用书那点事儿!

    Linux并不是一个比windows更神秘的系统. 是的Linux没有MSDN,但Linux和相关软件的文档绝对不比MSDN要少记得,一个看官方网站的文档,一个google.我想,大多问题都会解决的. ...

  7. 对Windows和类Unix争论的观点] 谁是谁的躯壳,谁又是谁的灵魂

    虽然不一定是完全正确, 但还是有理有据的认真写的........ 我觉得有一定价值, 转来了 -----------------------------------------------原文---- ...

  8. 类Unix系统目录结构

    文件和目录 Windows和Linux文件系统区别 在 windows 平台下,打开"计算机",我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并 ...

  9. 类UNIX的 history……

    1 OS内核工作项目 存储器管理 进程管理 硬件管理 CPU的时间分配 IO管理      等--    具体了解:计算机组成原理,操作系统,数据结构,计算机网络 2. 要实现+.-.* 等功能,在底 ...

  10. SerenityOS 操作系统类 Unix 操作系统

    创建于2018年的SerenityOS是一个类似Unix的操作系统,但是带有图形化界面,适合X86台式计算机,,其界面类似90 年代的Win98/NT.几乎由一个人完成额操作系统.这几天其Web浏览器 ...

最新文章

  1. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)
  2. Win7启动显示无法加载用户配置文件
  3. windbg-.process切换进程
  4. 021Python路--单例设计模式
  5. pyqt5知识:如何接受密码输入?
  6. Kibana停止kibana的方法命令:找到5601端口对应的进程ID 把此进程进行kill即可
  7. j2me手机游戏结构分析和实际小例子系列一 游戏背景和游戏精灵
  8. php var_export与var_dump 输出的不同
  9. leetcode159. 至多包含两个不同字符的最长子串
  10. python 示例_Python日历类| yeardatescalendar()方法与示例
  11. CentOS7显卡驱动问题
  12. 云平台队列服务-Qbus实践
  13. Mybatis(2)——Mapper映射文件
  14. 极客大学架构师训练营 系统安全架构 系统稳定高可用 PBKDF2加密算法 第11次作业
  15. 修改MySQL的配置文件
  16. MYSQL Error:You must SET PASSWORD before execut...
  17. VUE2.X全教程--基础详解(二)
  18. 论文总结与展望怎么写?
  19. wince 百度地图懒人包_百度地图winCE版 V10.9.2 安卓版
  20. c语言进行数据统计分析的研究报告,【干货分享】CCTS:临床试验统计分析计划及统计分析报告...

热门文章

  1. Tuple Class
  2. 5-01表达基本概念
  3. 调用 WebService 请求因 HTTP 状态 407 失败
  4. Linux 文件类型
  5. word 的脚注横线和文字怎么调整为左对齐?
  6. 【征收SCI稿件】厦门大学信息学院主办!通讯技术与信息科技征稿中!
  7. 中文NER的正确打开方式: 词汇增强方法总结 (从Lattice LSTM到FLAT)
  8. 【一分钟论文】轻松解读Semi-supervised Sequence Learning半监督序列学习
  9. 20191202_k-中心聚类算法和k-mean算法Python实现
  10. 【每日算法Day 103】老题新做,几乎不会有人想到的解法,它来了