前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux内核V0.01,仅 8670 行代码

Linux内核V0.01,仅 8670 行代码

作者头像
C语言与CPP编程
发布2024-03-02 09:32:56
930
发布2024-03-02 09:32:56
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程

作者 | strongerHuang

微信公众号 | 嵌入式专栏

Linux的诞生和早期发展

1983年,理查德·斯托曼(Richard Stallman)在MIT人工智能实验室(AI Lab)创立了GNU计划,目标是创建一个完全自由的Unix类操作系统。在这个计划中,斯托曼和其他志愿者开发了GNU工具链(GCC、GDB、GNU Make等),但操作系统内核一直没有完成。

1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)开始编写一个新的操作系统内核,这个内核最初被称为“Freax”。他最初的目标只是想学习操作系统内核的开发,并为自己的个人计算机编写一个操作系统。他将这个内核发布在Internet上,并开放源代码。随着全球各地的程序员参与开发,内核变得更加完善和稳定。这个内核最终被命名为Linux(Linus和Unix的组合)。

Linux V0.01上热门

最近,一篇名为《Exploring the internals of Linux v0.01》的博文,在 Reddit 和 Hacker News 都冲上了热门。

该博文主要是一篇解读 Linux 内核第一版开源代码的文章。

地址: https://seiya.me/blog/reading-linux-v0.01

解读Linux内核第一版(V0.01)仅 8670 行代码

截止发文,最新版Linux内核是 v6.5-rc7,它由 36M 行代码组成。

然而,在1991年的第一版(V0.01)Linux内核只有8670行代码,包含注释才10239 行,可以说非常的“小巧”。

v0.01系统调用是什么样的?

v0.01 有 66 个系统调用:

代码语言:javascript
复制
access acct alarm break brk chdir chmod
chown chroot close creat dup dup2 execve
exit fcntl fork fstat ftime getegid geteuid
getgid getpgrp setsid getpid getppid
getuid gtty ioctl kill link lock lseek
mkdir mknod mount mpx nice open pause
phys pipe prof ptrace read rename rmdir
setgid setpgid setuid setup signal stat
stime stty sync time times ulimit umask
umount uname unlink ustat utime waitpid write

它支持读取、写入、创建和删除文件和目录。此外,还支持其他基本概念,如(权限)、(所有者)和(进程间通信)。chmod(2)chown(2)pipe(2)

fork(2)并在那里。仅支持可执行格式。execve(2)a.out

套接字的概念没有实现。因此,没有网络支持。

某些功能未实现。他们只是返回:mount(2)ENOSYS

代码语言:javascript
复制
int sys_mount()
{
    return -ENOSYS;
}

针对 i386 进行了深度硬编码

Linus与MINIX的作者Andrew S. Tanenbaum就操作系统的设计进行了一场非常著名的辩论:单片与微内核,哪个设计更好?

Tanenbaum指出Linux是(或曾经)不便携的,因为它是针对Intel 386(i386)进行深度硬编码的:

MINIX被设计为相当便携,并已从英特尔系列移植到680x0(Atari,Amiga,Macintosh),SPARC和NS32016。LINUX与80x86紧密相连。不是要走的路。

确实如此。Linux v0.01 针对 i386 进行了深度硬编码。以下是 中的实现:strcpyinclude/string.h

代码语言:javascript
复制
extern inline char * strcpy(char * dest,const char *src)
{
__asm__("cld\n"
  "1:\tlodsb\n\t"
  "stosb\n\t"
  "testb %%al,%%al\n\t"
  "jne 1b"
  ::"S" (src),"D" (dest):"si","di","ax");
return dest;
}

Linux 内核最初的名字为 "FREAX"

Linus最初将他的内核命名为“FREAX”。Linux v0.01 中的 Makefile 仍然有以下注释:

代码语言:javascript
复制
# Makefile for the FREAX-kernel.

v0.01 支持哪些文件系统?

今天,Linux 支持各种文件系统,如 ext4、Btrfs 和 XFS等。

而v0.01支持的是 MINIX 文件系统。

有趣的是:ext(“扩展文件系统”)、ext2、 ext3、 ext4的前身,是受到MINIX文件系统的启发。

Linux v0.01 的调度程序

代码语言:javascript
复制
while (1) {
  c = -1;
  next = 0;
  i = NR_TASKS;
  p = &task[NR_TASKS];
  while (--i) {
    if (!*--p)
      continue;
    if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
      c = (*p)->counter, next = i;
  }
  if (c) break;
  for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
    if (*p)
      (*p)->counter = ((*p)->counter >> 1) +
          (*p)->priority;
}
switch_to(next);

5 行代码实现 Kernel panic

代码语言:javascript
复制
volatile void panic(const char * s)
{
  printk("Kernel panic: %s\n\r",s);
  for(;;);
}

Linus 当时没有 8MB RAM 的机器

代码语言:javascript
复制
 * For those with more memory than 8 Mb - tough luck. I've
 * not got it, why should you :-) The source is here. Change
 * it. (Seriously - it shouldn't be too difficult. ...

Linus 当时没有 8MB RAM 的机器

代码语言:javascript
复制
# If you don't have '-mstring-insns' in your gcc (and nobody but me has :-)
# remove them from the CFLAGS defines.

好了,主要内容就解读到这里,感兴趣的老铁,可以下载Linux V0.01版本源码了解一下:

https://cdn.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言与CPP编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档