最近有空闲的时间,打算阅读下Linux的源码,并记录下自己的成长过程。计划的学习方式,下载kernel 0.11代码,并网上找下相关视频进行学习,学习Linux最初的设计思路;调试4.19的内核代码,对实际的工程代码的关键部分进行解读。
分两步学习的原因,因为最新的Linux代码已经非常的庞大了,如果直接从几万行代码开始看起,工作量很大,并且只能看到全貌,很难看清楚整体,而Linux代码是从最初的0.11演进而来,虽然变化巨大,但是总体的设计思路变化不大,通过阅读kernel 0.11对整体设计思路理解以后,具体涉及到各领域再分析实际的工程代码。因为我最近是做性能相关的,会先阅读调度器相关代码,其他部分看情况再进行阅读和调试。
首先,我们看下kernel 0.11的代码结构:
.
├── boot
│ ├── bootsect.s
│ ├── head.s
│ └── setup.s
├── cscope.files
├── fs
│ ├── bitmap.c
│ ├── block_dev.c
│ ├── buffer.c
│ ├── char_dev.c
│ ├── exec.c
│ ├── fcntl.c
│ ├── file_dev.c
│ ├── file_table.c
│ ├── inode.c
│ ├── ioctl.c
│ ├── Makefile
│ ├── namei.c
│ ├── open.c
│ ├── pipe.c
│ ├── read_write.c
│ ├── stat.c
│ ├── super.c
│ └── truncate.c
├── include
│ ├── a.out.h
│ ├── asm
│ │ ├── io.h
│ │ ├── memory.h
│ │ ├── segment.h
│ │ └── system.h
│ ├── const.h
│ ├── ctype.h
│ ├── errno.h
│ ├── fcntl.h
│ ├── linux
│ │ ├── config.h
│ │ ├── fdreg.h
│ │ ├── fs.h
│ │ ├── hdreg.h
│ │ ├── head.h
│ │ ├── kernel.h
│ │ ├── mm.h
│ │ ├── sched.h
│ │ ├── sched.h.cur1
│ │ ├── sched.h.old
│ │ ├── sys.h
│ │ └── tty.h
│ ├── signal.h
│ ├── stdarg.h
│ ├── stddef.h
│ ├── string.h
│ ├── sys
│ │ ├── stat.h
│ │ ├── times.h
│ │ ├── types.h
│ │ ├── utsname.h
│ │ └── wait.h
│ ├── termios.h
│ ├── time.h
│ ├── unistd.h
│ └── utime.h
├── init
│ └── main.c
├── kernel
│ ├── asm.s
│ ├── blk_drv
│ │ ├── blk.h
│ │ ├── floppy.c
│ │ ├── hd.c
│ │ ├── ll_rw_blk.c
│ │ ├── Makefile
│ │ └── ramdisk.c
│ ├── chr_drv
│ │ ├── console.c
│ │ ├── keyboard.S
│ │ ├── Makefile
│ │ ├── rs_io.s
│ │ ├── serial.c
│ │ ├── tty_io.c
│ │ └── tty_ioctl.c
│ ├── exit.c
│ ├── fork.c
│ ├── Makefile
│ ├── math
│ │ ├── Makefile
│ │ └── math_emulate.c
│ ├── mktime.c
│ ├── panic.c
│ ├── printk.c
│ ├── sched.c
│ ├── signal.c
│ ├── sys.c
│ ├── system_call.s
│ ├── traps.c
│ └── vsprintf.c
├── lib
│ ├── close.c
│ ├── ctype.c
│ ├── dup.c
│ ├── errno.c
│ ├── execve.c
│ ├── _exit.c
│ ├── Makefile
│ ├── malloc.c
│ ├── open.c
│ ├── setsid.c
│ ├── string.c
│ ├── wait.c
│ └── write.c
├── Makefile
├── mm
│ ├── Makefile
│ ├── memory.c
│ └── page.s
├── README.md
├── tools
│ └── build.c
└── tree.txt
14 directories, 105 files
Linux内核的体系结构可以简单用下面几个层次进行描述
后面我们从分成几个部分进行分析:
- 内核引导程序
- 进程管理
- 内存管理
- 文件系统
- 内核驱动开发
- 调度器分析