Linux内核-0x1 源码索引

我们时常在说的Linux,广义上是说的像Ubuntu、Redhat、Deepin之类的发行版操作系统,狭义上(或者更准确的说)Linux只是一个操作系统内核,具备如进程调度、内存管理、设备控制等功能。

Linux学习从类似《深入Linux内核架构》《Linux内核设计与实现》等书籍入手,配合源码一起。这是我想象的,网上看起来也有这么说的。

内核源码就很重要了,如果自己改动过,源码还要能编译,并且能把某个发行版本的内核替换掉(我这里使用的是Ubuntu 18.04),这样就能在本地看到自己的改动了。另外是,Mac我用起来比Ubuntu顺手,我们还需要能在Mac上方便的进行Linux源码阅读、搜索、变更、编译等。

内核源码下载 & 编译 & 更换

我这边下载的是5.3.0的内核版本(当时下载时是最新Stable版本),在 www.kernel.org 上找找,就能找到archive下载,或者git clone。

附 清华的镜像
https://mirror.tuna.tsinghua.edu.cn/help/linux-stable.git/

编译与更换内核,网上相关资料就太多了,先列出我参考过的那篇,非常详细,Linux入门之内核编译与替换

源码索引

要能顺利的阅读Linux内核源码(非常非常巨量的源码),需要对源码进行索引,以支持搜索、跳转等。

在Windows上有SourceInsight,被推荐得非常多,但是在Mac和Ubuntu上,这家伙似乎不得劲儿了。Mac上压根没有,通过Parallel Desktop在Windows上运行显得非常辣鸡,Ubuntu上通过Wine运行也是一样的,会索引到一定文件,然后就挂了,或许我的打开方式不对。

但是没有关系,我找到更好的方法,就是 GNU Global,这简直就是一个神器,原理我目前是不清楚的,但是这家伙可以把所有的tag(类、方法、变量等)索引出来。

参考 Ubuntu 安裝 GNU Global(gtags) 阅读Linux内核源码 进行安装,非常方便。

附 安装脚本
$ sudo apt install global
$ sudo gtags -v # 源码根目录下
$ htags -DfFnva -t ‘主页title’
$ htags-server # 默认http://127.0.0.1:8000

远程作业

我用的是Mac,但是上面的工作都是在Ubuntu上做的,至少我明显可以感受到,Mac的使用体验比Ubuntu要好上很多,所以后面学习的工作我希望能在Mac上进行。

我们对源码进行变更、编译等工作,可以使用ssh+vim完成,目前我只做了ssh的工作,vim后面有编辑源码的需求时再说。ssh的配置,网上资料也是非常非常多的,可以参考 Ubuntu环境下SSH服务安装、SSH远程登录以及SSH数据传输

附 Ubuntu开启sshd
$ sudo /etc/init.d/ssh start

Global搭建起来的源码索引,在Ubuntu上可以通过 http://127.0.0.1:8000 去访问,Mac上无法直接通过 http://ubuntu-ip:8000 去访问,具体原因我不清楚。我使用的方法是通过nginx去做反向代理映射出来,nginx搭建的方法和反向代理的方法网上也是非常多的,参考都不用举出了。

附 Ubuntu安装的nginx位置
/etc/nginx

我的nginx配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 略
http {
# 略
server {
listen 8080;
server_name localhost;
location /linux/ {
proxy_pass http://127.0.0.1:8000/;
}
}
}
# 略

如此配置之后,Mac还是无法访问到主页,这是因为Ubuntu UFW的墙,所以还需要对8080端口放开,操作如下

1
2
$ sudo ufw status   # 查看状态
$ sudo ufw allow 8080

这样,我可以通过 http://ubuntu-ip:8080/linux/ 去访问Global搭建起的源码索引主页了。

后记

这是我开始进行Linux等操作系统相关学习的记录,后面会对一些类似系统进行比较,如MacOS、Android等。

相信操作系统,尤其是移动端操作系统,在未来几年内,会逐渐在国内形成技术战场,世界操作系统史上,应该会有中国一笔的。所以,更多的学习操作系统相关的知识,未来才能更好的跟大家一起好好的玩耍。

在阅读《Linux内核设计与实现》时发现,我使用的内核源码版本是5.3,和书上使用的2.x版本相差太大了,极不方便学习使用,故git clone了2.6.39.y的版本,并且Global也切换掉了。

在htags-server切换过程中直接kill掉进程,结果端口占用,使用如下方法可以查询端口占用进程并完全kill掉:

1
2
3
netstat -tln | grep 8000    # 查看端口是否占用
lsof -i:8000 # 查看占用端口的进程
# kill xxx 就行了