Linux内核学习
前言
为什么要看从Unix看起呢?因为Linux之父是参考Unix写出Linux的,所以追根溯源我就找到这里,打算从Unix源码看起,加上自己学习操作系统的学得很烂,不知道是自己的学习问题?还是操作系统理论知识本身就很抽象?于是,我就找到了《Unix内核源码剖析》这本书,从看源码然后再回头翻操作系统理论的书,沿着Unix->Linux->Android这条路走下去,逐步地对操作系统有进一步地理解。
Unix源码阅读
前期环境搭建
资料下载
在网上找到书上学习Unix内核的材料,网盘地址如下:
链接:https://pan.baidu.com/s/1upOLt8h0U93spDuSEz4C4g
提取码:34cb
Simh 中配置安装 Unix V6
下载解压Unix V6
上面的网盘地址如果失效,请联系本人更新地址,然后下载Unix V6
解压里面的三个压缩文件到本地,应该看到这样的三个文件夹:
- simhv39-0-exe
- Unix-v6-Ken-Wellsch.tap
- v6src
重命名Unix-v6-Ken-Wellsch.tap
将Unix-v6-Ken-Wellsch.tap
这个文件夹中的Unix-v6-Ken-Wellsch.tap
这个文件首先重命名为dist.tap
,再复制黏贴到simhv39-0-exe
这个文件夹里。这里为什么要重命名呢?因为在后面加载boot这段代码中有这样一行代码sim> attach tm0 dist.tap
,这里的dist.tap
在我们下载到的三个文件夹中都没有,所以由此可以推断它是重命名来的,但是它有什么作用呢?暂时留下一个疑问。
查看simhv39-0-exe文件目录下的文件
为什么这里会有一步查看这个文件夹下的所有文件呢?因为我发现配置参数之后,会在这个文件夹目录下新生成一些文件,所以在这里先把原有的所有文件做一个记录,到时候方便分析生成的过程发生了什么。
cmd方式查看
考虑到有些同学没有在电脑里安装Git,就使用Windows最原始的方法去查看,快捷键win+R
,在这里win
一般表示的是在键盘左下方的微软图标,然后弹出来的运行窗口输入cmd
,一般一开始的路径是:
C:\Users\Administrator>
然后我们需要切换到simhv39-0-exe
这个文件夹的磁盘下,所以我们要光标处输入磁盘符,我这个文件夹在e盘,我的输入是这样的:
C:\Users\Administrator>e:
然后显示代码是这样的:
C:\Users\Administrator>e:
E:\>
这个就表示我们已经进入到e盘的路径下,接着切换到该文件夹路径下,Tab
键对文件夹的名字进行补全,由于我是在百度网盘下载的,所以我这里e盘的根目录下是BaiduNetdiskDownload
文件夹,使用cd 文件名
(注意这里有个空格)进入文件夹目录下,由于cmd窗口的代码不能复制黏贴,所以整个过程大致输入如下:
C:\Users\Administrator>e:
E:\>BaiduNetdiskDownload>cd "Unix V6"
E:\>BaiduNetdiskDownload\Unix V6>cd simhv39-0-exe>
E:\>BaiduNetdiskDownload\Unix V6\simhv39-0-exe>
最后,成功显示这样的路径***:\>***\Unix V6\simhv39-0-exe>
就表示已经进入simhv39-0-exe
文件夹中了,然后使用dir
命令查看这个文件夹中的所有文件,由于文件比较多,所以就截图了:
Git Bash Here方式
Git Bash Here方式就比较简单,这个要在电脑上事先安装Git软件,直接进入到simhv39-0-exe
文件夹下,右键点击该文件夹选择Git Bash Here
,然后使用ls -lt
命令进行查看:
Administrator@PC-20210109IEYU MINGW64 /d/simhv39-0-exe
$ ls -lt
total 13984
-rw-r--r-- 1 Administrator 197121 6291996 四月 19 14:54 dist.tap
-rwxr-xr-x 1 Administrator 197121 201223 五月 4 2012 swtp6800mp-a2.exe*
-rwxr-xr-x 1 Administrator 197121 198732 五月 4 2012 swtp6800mp-a.exe*
-rwxr-xr-x 1 Administrator 197121 192894 五月 4 2012 h316.exe*
-rwxr-xr-x 1 Administrator 197121 158566 五月 4 2012 lgp.exe*
-rwxr-xr-x 1 Administrator 197121 214245 五月 4 2012 sds.exe*
-rwxr-xr-x 1 Administrator 197121 244623 五月 4 2012 id32.exe*
-rwxr-xr-x 1 Administrator 197121 234367 五月 4 2012 id16.exe*
-rwxr-xr-x 1 Administrator 197121 233236 五月 4 2012 ibm1130.exe*
-rwxr-xr-x 1 Administrator 197121 293948 五月 4 2012 i7094.exe*
-rwxr-xr-x 1 Administrator 197121 161305 五月 4 2012 gri.exe*
-rwxr-xr-x 1 Administrator 197121 661949 五月 4 2012 altairz80.exe*
-rwxr-xr-x 1 Administrator 197121 161691 五月 4 2012 altair.exe*
-rwxr-xr-x 1 Administrator 197121 182294 五月 4 2012 s3.exe*
-rwxr-xr-x 1 Administrator 197121 193458 五月 4 2012 i1620.exe*
-rwxr-xr-x 1 Administrator 197121 188159 五月 4 2012 i1401.exe*
-rwxr-xr-x 1 Administrator 197121 437997 五月 4 2012 hp2100.exe*
-rwxr-xr-x 1 Administrator 197121 263665 五月 4 2012 eclipse.exe*
-rwxr-xr-x 1 Administrator 197121 199700 五月 4 2012 nova.exe*
-rwxr-xr-x 1 Administrator 197121 563019 五月 4 2012 vax780.exe*
-rwxr-xr-x 1 Administrator 197121 497421 五月 4 2012 vax.exe*
-rwxr-xr-x 1 Administrator 197121 341096 五月 4 2012 pdp10.exe*
-rwxr-xr-x 1 Administrator 197121 584150 五月 4 2012 pdp11.exe*
-rwxr-xr-x 1 Administrator 197121 241230 五月 4 2012 pdp15.exe*
-rwxr-xr-x 1 Administrator 197121 233454 五月 4 2012 pdp9.exe*
-rwxr-xr-x 1 Administrator 197121 262525 五月 4 2012 pdp8.exe*
-rwxr-xr-x 1 Administrator 197121 226422 五月 4 2012 pdp7.exe*
-rwxr-xr-x 1 Administrator 197121 224715 五月 4 2012 pdp4.exe*
-rwxr-xr-x 1 Administrator 197121 199295 五月 4 2012 pdp1.exe*
-rw-r--r-- 1 Administrator 197121 131072 四月 1 2008 ka655x.bin
-rwxr-xr-x 1 Administrator 197121 44544 五月 5 2005 vmb.exe*
配置 Unix V6 的系统启动参数
运行pdp11.exe可执行程序
打开simhv39-0-exe
这个文件夹,找到可执行程序pdp11.exe
,点击该程序,然后会弹出这个一个窗口,然后我们就可以配置 Unix V6 的系统启动参数。本来按照网上的教程应该是,复制下面这段代码,这里的复制是指一行一行地复制,而不是一整段复制,鼠标右键黏贴到弹出的窗口后的光标处,但是不知道是不是我是win7,教程博主用的是win10,所以我这里是黏贴不了的。
set cpu 11/40
set tm0 locked
attach tm0 dist.tap
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
d cpu 100000 012700
d cpu 100002 172526
d cpu 100004 010040
d cpu 100006 012740
d cpu 100010 060003
d cpu 100012 000777
g 100000
加载boot
于是,我就按照上面这段代码的顺序在弹出窗口的光标处依次输入,直到最后一行,我这里的窗口与显示的代码大致如下:
PDP-11 simulator V3.9-0
sim> set cpu 11/40
Disabling XQ
sim> set tm0 locked
sim> attach tm0 dist.tap
sim> attach rk0 rk0
RK:creating new file
sim> attach rk1 rk1
RK:creating new file
sim>attach rk2 rk2
RK:creating new file
sim>d cpu 100000 012700
sim>d cpu 100002 172526
sim>d cpu 100004 010040
sim>d cpu 100006 012740
sim>d cpu 100010 060003
sim>d cpu 100012 000777
sim>g 100000
- 加载引导块
- 将根分区加载到 rk 文件上去
这是网摘对这个过程的解释,先找照着做,以后再回来进行补充说明。
再次查看所有文件
到这里我们看到的是光标在那里闪,我们再用上面的两种方法去查看经过这次输入之后会生成那些文件,我这里用的是第二种方式,回到simhv39-0-exe
目录下右键选择Git Bash Here
Administrator@PC-20210109IEYU MINGW64 /e/BaiduNetdiskDownload/Unix V6/simhv39-0-
$ ls -lt
total 13984
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:43 rk2
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:42 rk1
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:41 rk0
-rw-r--r-- 1 Administrator 197121 6291996 四月 19 11:20 dist.tap
-rwxr-xr-x 1 Administrator 197121 201223 五月 4 2012 swtp6800mp-a2.exe*
-rwxr-xr-x 1 Administrator 197121 198732 五月 4 2012 swtp6800mp-a.exe*
-rwxr-xr-x 1 Administrator 197121 192894 五月 4 2012 h316.exe*
-rwxr-xr-x 1 Administrator 197121 158566 五月 4 2012 lgp.exe*
-rwxr-xr-x 1 Administrator 197121 214245 五月 4 2012 sds.exe*
-rwxr-xr-x 1 Administrator 197121 244623 五月 4 2012 id32.exe*
-rwxr-xr-x 1 Administrator 197121 234367 五月 4 2012 id16.exe*
-rwxr-xr-x 1 Administrator 197121 233236 五月 4 2012 ibm1130.exe*
-rwxr-xr-x 1 Administrator 197121 293948 五月 4 2012 i7094.exe*
-rwxr-xr-x 1 Administrator 197121 161305 五月 4 2012 gri.exe*
-rwxr-xr-x 1 Administrator 197121 661949 五月 4 2012 altairz80.exe*
-rwxr-xr-x 1 Administrator 197121 161691 五月 4 2012 altair.exe*
-rwxr-xr-x 1 Administrator 197121 182294 五月 4 2012 s3.exe*
-rwxr-xr-x 1 Administrator 197121 193458 五月 4 2012 i1620.exe*
-rwxr-xr-x 1 Administrator 197121 188159 五月 4 2012 i1401.exe*
-rwxr-xr-x 1 Administrator 197121 437997 五月 4 2012 hp2100.exe*
-rwxr-xr-x 1 Administrator 197121 263665 五月 4 2012 eclipse.exe*
-rwxr-xr-x 1 Administrator 197121 199700 五月 4 2012 nova.exe*
-rwxr-xr-x 1 Administrator 197121 563019 五月 4 2012 vax780.exe*
-rwxr-xr-x 1 Administrator 197121 497421 五月 4 2012 vax.exe*
-rwxr-xr-x 1 Administrator 197121 341096 五月 4 2012 pdp10.exe*
-rwxr-xr-x 1 Administrator 197121 584150 五月 4 2012 pdp11.exe*
-rwxr-xr-x 1 Administrator 197121 241230 五月 4 2012 pdp15.exe*
-rwxr-xr-x 1 Administrator 197121 233454 五月 4 2012 pdp9.exe*
-rwxr-xr-x 1 Administrator 197121 262525 五月 4 2012 pdp8.exe*
-rwxr-xr-x 1 Administrator 197121 226422 五月 4 2012 pdp7.exe*
-rwxr-xr-x 1 Administrator 197121 224715 五月 4 2012 pdp4.exe*
-rwxr-xr-x 1 Administrator 197121 199295 五月 4 2012 pdp1.exe*
-rw-r--r-- 1 Administrator 197121 131072 四月 1 2008 ka655x.bin
-rwxr-xr-x 1 Administrator 197121 44544 五月 5 2005 vmb.exe*
对比差异
对比上次的输出,我们会发现新生成三个文件分别是rk0
、rk1
、rk2
:
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:43 rk2
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:42 rk1
-rw-r--r-- 1 Administrator 197121 0 四月 19 14:41 rk0
其实,我们在PDP-11那个窗口输入时,所输出的这行代码RK:creating new file
,也可以知道这三个文件是新生成的。
退出加载,配置磁盘
我们接着这里的输出代码:
加载boot,快捷键Ctrl + E
退出加载过程,然后窗口会输出这样一段代码Simulation stopped,PC:100012<BR 100012>
,表示模拟器已经停止了,我们接着输入g 0
进行配置磁盘信息,然后窗口输出=
,在光标处接着输入以下代码:
sim> g 0
=tmrk
disk offset
0
tape offset
100
count
1
=tmrk
disk offset
1
tape offset
101
count
3999
= [## Hit CTRL-E here]
Simulation stopped, PC: 137300 (BGE 137274)
sim> q
就这一段代码
= [## Hit CTRL-E here]
有点坑,我还照着上面进行输入,结果不是,应该是在显示=
后,我们快捷键Ctrl + E
,退出配置过程,最后在光标处输入q
,到目前为止,窗口显示的情况如下:
安装磁盘
在上一步我们在光标处输入q
,再按下Enter
键就可以退出pdp11.exe
这个可执行程序,我们再重新点击这个可执行文件,输入以下代码进行:
set cpu 11/40
set tto 7b
set tm0 locked
attach tm0 dist.tap
attach rk0 rk0
attach rk1 rk1
attach rk2 rk2
dep system sr 173030
boot rk0
当我们输完上面的代码,新一行会显示一个@
,我们输入以下代码,告诉模拟器我们要加载 Unix 核心模块:
rkunix
到这里为止,PDP-11可执行程序窗口的运行情况如图所示:
修改大小写
为什么要修改大小写呢?因为无论我们在#
后面的光标处输入什么,它都输出大写,所以我们这里需要把它改为小写,输入以下代码修改为小写:
# STTY -LCASE
重新构建内核
在#
后的光标处接着输入以下代码进行重构内核,记得每输完一行按Enter
进行确认:
chdir /usr/sys/conf
cc mkconf.c
mv a.out mkconf
配置mkconf
输入以下代码配置mkconf:
# ./mkconf
rk
tm
tc
8dc
lp
done
#
编译配置,将其余的库文件进行链接,最后复制到unix目录下:
as m40.s
mv a.out m40.o
cc -c c.c
as l.s
ld -x a.out m40.o c.o ../lib1 ../lib2
mv a.out /unix