smash是一个类Unix的内核,实现了基于分段和分页的内存管理,单个进程最大4GB虚拟地址空间,支持minix-v2l文件系统,实现了写实复制(fork)、管道等机制。
项目演示:
编写应用程序目前已开发的API一共18个:
// 进程退出extern int exit(int code);// fork一个进程,父进程返回子进程的id,子进程返回0extern 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);// 获取当前进程idextern 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;}然后就可以编译了,编译方法请参照项目README
注:printf()本身不是一个系统调用,而是通过write()系统调用实现的一个函数。
感谢最后,感谢赵炯博士的宝书:《Linux内核完全剖析-基于0.12内核》
前五章对我帮助很大,尤其是第四章,
如果没有这本书,以我蹩脚的英语,不可能看懂x86的保护模式。
评论