-
中文注释的Linux 0.11源码
资源介绍
/*
* linux/init/main.c
*
* (C) 1991 Linus Torvalds
*/
#define __LIBRARY__ // 定义该变量是为了包括定义在unistd.h 中的内嵌汇编代码等信息。
#include // *.h 头文件所在的默认目录是include/,则在代码中就不用明确指明位置。
// 如果不是UNIX 的标准头文件,则需要指明所在的目录,并用双引号括住。
// 标准符号常数与类型文件。定义了各种符号常数和类型,并申明了各种函数。
// 如果定义了__LIBRARY__,则还包括系统调用号和内嵌汇编代码_syscall0()等。
#include // 时间类型头文件。其中最主要定义了tm 结构和一些有关时间的函数原形。
/*
* we need this inline - forking from kernel space will result
* in NO COPY ON WRITE (!!!), until an execve is executed. This
* is no problem, but for the stack. This is handled by not letting
* main() use the stack at all after fork(). Thus, no function
* calls - which means inline code for fork too, as otherwise we
* would use the stack upon exit from 'fork()'.
*
* Actually only pause and fork are needed inline, so that there
* won't be any messing with the stack from main(), but we define
* some others too.
*/
/*
* 我们需要下面这些内嵌语句 - 从内核空间创建进程(forking)将导致没有写时复制(COPY ON WRITE)!!!
* 直到一个执行execve 调用。这对堆栈可能带来问题。处理的方法是在fork()调用之后不让main()使用
* 任何堆栈。因此就不能有函数调用 - 这意味着fork 也要使用内嵌的代码,否则我们在从fork()退出
* 时就要使用堆栈了。
* 实际上只有pause 和fork 需要使用内嵌方式,以保证从main()中不会弄乱堆栈,但是我们同时还
* 定义了其它一些函数。
*/
static inline
_syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用
// Linux 的系统调用中断0x80。该中断是所有系统调用的
// 入口。该条语句实际上是int fork()创建进程系统调用。
// syscall0 名称中最后的0 表示无参数,1 表示1 个参数。
static inline _syscall0 (int, pause) // int pause()系统调用:暂停进程的执行,直到
// 收到一个信号。
static inline _syscall1 (int, setup, void *, BIOS) // int setup(void * BIOS)系统调用,仅用于
// linux 初始化(仅在这个程序中被调用)。
static inline _syscall0 (int, sync) // int sync()系统调用:更新文件系统。
#include // tty 头文件,定义了有关tty_io,串行通信方面的参数、常数。
#include // 调度程序头文件,定义了任务结构task_struct、第1 个初始任务
// 的数据。还有一些以宏的形式定义的有关描述符参数设置和获取的
// 嵌入式汇编函数程序。
#include // head 头文件,定义了段描述符的简单结构,和几个选择符常量。
#include // 系统头文件。以宏的形式定义了许多有关设置或修改
// 描述符/中断门等的嵌入式汇编子程序。
#include // io 头文件。以宏的嵌入汇编程序形式定义对io 端口操作的函数。
#include // 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)。
#include // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个
// 类型(va_list)和三个宏(va_start, va_arg 和va_end),vsprintf、
// vprintf、vfprintf。
#include
#include // 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义。
#include // 类型头文件。定义了基本的系统数据类型。
#include // 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)。
static char printbuf[1024]; // 静态字符串数组。
extern int vsprintf (); // 送格式化输出到一字符串中(在kernel/vsprintf.c,92 行)。
extern void init (void); // 函数原形,初始化(在168 行)。
extern void blk_dev_init (void); // 块设备初始化子程序(kernel/blk_drv/ll_rw_blk.c,157 行)
extern void chr_dev_init (void); // 字符设备初始化(kernel/chr_drv/tty_io.c, 347 行)
extern void hd_init (void); // 硬盘初始化程序(kernel/blk_drv/hd.c, 343 行)
extern void floppy_init (void); // 软驱初始化程序(kernel/blk_drv/floppy.c, 457 行)
extern void mem_init (long start, long end); // 内存管理初始化(mm/memory.c, 399 行)
extern long rd_init (long mem_start, int length); //虚拟盘初始化(kernel/blk_drv/ramdisk.c,52)
extern long kernel_mktime (struct tm *tm); // 建立内核时间(秒)。
extern long startup_time; // 内核启动时间(开机时间)(秒)。
- 上一篇: Linux必学的60个命令
- 下一篇: linux c