zoukankan      html  css  js  c++  java
  • smash:一个类unix内核

    前言

    每一个蹩脚的C++程序员都有一颗做操作系统内核的心。我从大学毕业开始就对操作系统内核感兴趣,将其看作是术之尽头,可惜那时候一直在无忧无虑的忙着玩网游,也就搁置了。随着时间的推移,逐渐就将其淡忘了,但无忧无虑的日子终有到头的时候,在这个寒冬,不情愿的放了个假,也终于有时间来完成一个简陋的内核。

    简介

    项目地址:https://github.com/wangzq0807/smash

    smash是一个类Unix的内核,实现了基于分段和分页的内存管理,单个进程最大4GB虚拟地址空间,支持minix-v2l文件系统,实现了写实复制(fork),管道等机制。

    项目演示(请忽略我蹩脚的英语...):

    smash

    具体的编译安装方法请参照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!
    ");return 0;
    }

    然后就可以编译了。

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

    感谢

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

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

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

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

  • 相关阅读:
    02HTML和CSS知识点总结(二)
    个人对stm32ADC编程关键点的理解
    stm32_ADC定时器采样(DMA均值处理数据)
    使用AD画PCB的技能总结(纯属个人笔记,请大神多多指导)
    STM32_DAC之软件触发(Trigger)
    对stm32寄存器的理解(个人理解,大神轻喷)
    3.13考研长难句分析
    3.14考研长难句分析
    用stm32f10x建立新的工程或移植工程重要步骤
    mac air 上的Linux命令训练(1)
  • 原文地址:https://www.cnblogs.com/SuperFlanky/p/10092140.html
Copyright © 2011-2022 走看看