os内核入门-linux0.11运行环境搭建

原创 thatway 那路谈OS与SoC嵌入式软件 2022-01-04 22:52

1. 为什么要学习linux内核?

   程序员基本做的软件都会运行在一个os上,当然也有没有os的系统,比如单片机,但是这个群体很少。基于这一点,不论是上层软件开发人员还是底层软件开发了解内核是有好处的:一是搞清楚程序继续往下运行的原理是什么,可以反馈于上层开发进行优化;二是内核里面有很多程序设计的技巧可以在上层软件中借鉴使用。至少让你讨论问题的时候,可以说出来或者听懂些高大上的词汇![][0]  

   所有的os底层逻辑或者说提供的功能是相同的,选择一种内核进行学习就有助于理解所有os的运行,linux是目前应用很广泛的,并且开源的os,很值得学习。  

2. 为什么选择linux0.11进行学习?

  最新的linux内核版本5.x,代码级别在千万行,要整体进行学习几乎是不可能的,我们关注的更多的其精华的、原理性的东西。linux0.11是1991.12.8日发布的,代码约有2万行,是一个可以基本正常运行的内核版本,可以进行  

系统性、整体性的学习内核。

  linux0.11算是一个古董级别的内核,30年前发布,但是它具有os最基本的属性:支持实时多任务,有进程的概念。后续版本在其基础上演化。  

3. linux0.11运行环境搭建

下面进入正题:

  写代码做项目的都知道,环境搭建是个力气活,经常耗费了大量时间,撸代码反而阻力较小。"  

Talk is cheap. Show me the code"
,借用Linux 的创始人Linus Torvalds的话,那就让我们直接上干货。
这里我从网上找到一个可以快速搭建环境进行学习的一站式资料:

https://github.com/Wangzhike/HIT-Linux-0.11.git

   里面包括源码、编译环境搭建、运行os的虚拟机等。下面我们按照:  

源码-》编译-》运行的顺序进行。

3.1 准备工作

  研究linux当然要先用一下linux系统,这里推荐使用linux应用最广泛的发行版ubuntu。有一些程序员甚至不用windows做任何工作,必须要用windows的app时,用wine在linux下运行。闲话少说,这里先安装  

vituralbox+ubuntu环境,自行百度查询安装方法。

3.2 代码

执行如下命令进行代码工具下载:**

```

git clone https://github.com/Wangzhike/HIT-Linux-0.11.git ~/hit-oslab cd ~/hit-oslab/HIT-Linux-0.11-master/0-prepEnv/hit-oslab-qiuyu tar -zxvf hit-oslab-linux-qiuyu.tar.gz cd oslab/linux-0.11 ls



oslab/linux-0.11就是linux-0.11的源码,我们先了解下,目录结构如下:

boot/ 目录下包括三个汇编程序,其中包括磁盘引导程序 bootsects.s、获取BIOS中参数的 setup.s汇编程序和32位运行启动代码head.s汇编程序。这三个汇编程序完成了把内 核从快射别上引导加载到内存的工作,并对系统配置参数进行探测,完成了进入32为 保护模式运行之前的所有工作,为内核系统执行进一步初始化做准备工作。 fs/ 文件系统。 include/ 头文件信息,定义常量和数据结构。 init/ 内核系统的初始化程序 main.c。它是内核完成所有初始化工作进入正常运行的关键。 在完成系统所有的初始化工作后,创建了用于shell的进程。 kernel/ 最重要的部分是进程调度函数 schedule(),sleep_on()函数和有关系统调用的程序。 kernel/dev_blk/ 对快设备程序进行了注释说明。含有硬盘,软盘等快设备的驱动程序,主要用来与文件系统和高速缓冲区打交道,含有较都的与硬件相关的内容。 kernel/dev_chr/ 字符设备驱动做说明。主要涉及串行设备驱动,键盘驱动,显示器驱动等。 kernel/math/ 数学协处理器的方针程序。 lib/ 库函数文件,主要向编译系统提供接口。 mm/ 内存管理,主要介绍Intel 80X86 为处理的内存的保护模式的运行方式。 tools/ build.c 程序,用于将内核的磁盘引导程序块与其他主要内核模块连接成一个完整的内核映像(kernel image)文件。 Makefile 依赖关系文件。




**3.3 编译**  

首先要安装编译工具,确保ubuntu可以连上网。

cd 0-prepEnv/hit-oslab-qiuyu/ ./setup.sh


安装成功后,下面就是编译

cd 0-prepEnv/hit-oslab-qiuyu/oslab/linux-0.11 make


出现

tools/build boot/bootsect boot/setuptools/kernel > Image


表示编译成功。  



**3.4 运行**

cd 0-prepEnv/hit-oslab-qiuyu/oslab ./run


运行成功会出现如下图:  

![][2]  


下面我们来修改下代码,验证下是否可以生效

vim linux-0.11/init/main.c


搜索找到Free的打印,在后面加上

printf("This my hello world!\n\r");


保存退出后,进行make,run如下图:  

![][3]  


**3.5 其他**  

      进行run之后会弹出一个运行的窗口,这个窗口就是虚拟机  
bochs,跟上面vitualbox一样的功能。怎么使用bochs,可以查看  
run这个脚本

vim run


可以看到

$OSLAB_PATH/bochs/bochs-gdb -q -f$OSLAB_PATH/bochs/bochsrc.bxrc

```
vim bochs/bochsrc.bxrc

可以看到

floppya:1_44="$OSLAB_PATH/linux-0.11/Image", status=inserted

运行了我们编译出来的内核。具体bochs的用法,调试的时候再进行说明。

后记:

  是不是很有成就感,自己运行起来了一个linux系统,内核学习已经为你敞开,推荐两本书辅助学习:  
《Linux内核设计的艺术》新设计团队
《Linux内核0.11完全注释》赵炯
  linux0.11学习系列,后续会陆续更新,纯干货分享,无广告,不打赏。欢迎  

转载,欢迎
评论交流!

results matching ""

    No results matching ""