阅读:2678回复:5
带你走进linux(1)
Linux的开发模式和运作机制(转载)
自 由软件的出现,改变了传统的以公司为主体的封闭的软件开发模式。采用了开放和协作的开发模式,无偿提供源代码,允许任何人取得、修改和重新发布自由软件的源代码。这种开发模式激发了世界各地的软件开发人员的积极性和创造热情。大量软件开发人员投入到自由软件的开发中。软件开发人员的集体智慧得到充分发挥, 大大减少了不必要的重复劳动,并使自由软件的脆弱点能够及时发现和克服。任何一家公司都不可能投入如此强大的人力去开发和检验商品化软件。这种开发模式使自由软件具有强大的生命力。 商业Unix开 发过程中,整个系统的开发要有严格的质量保证措施、完整的文挡、完善的源代码、全面的测试报告及相应的解决方案。开发者不能随意增加程序的特性和修改代码的关键部分,如果要修改代码,他们得将其写入错误报告中才能使其有效,并随后接收源代码控制系统的检查,如果发现修改不合适,修改也可能作废。每个开发者 设计系统代码的一个或几个部分,开发者只有在程序检查过程中才能更改相应的代码。质量保证部门在内部对新的操作系统进行严格的回归测试,并报告发现的问题,开发者则有责任解决所报告的问题。质量保证部门采用复杂的统计分析系统以确保在下次发行时有百分之几的程序错误已修改。 总之,商业Unix开发过程使得其代码非常复杂,因此,公司为了保证下次操作系统的修订质量,因此得收集和统计分析操作系统的性能。开发商业Uinx是一个很大的工程,常常大到有数以百计的编程者、测试员、文挡员以及系统管理员参与。 对于Linux,你可将整个组织开发的概念、源代码控制系统、结构化的错误报告、统计分析等通通扔到一边去。 Linux最初是由一群来自世界各地的自愿者通过Internet共同进行开发的。通过互连网和其它途径,任何人都有机会辅助开发和调试Linux的内核、链接新的软件、编写文挡或帮助新用户。实际上,并没有单独的组织负责开发此系统,Linux团体大部分通过邮递清单和USENET的消息组通信。许多协定已跳过开发过程,如果你想将自己的代码包括进“正式”内核,只需给Linus Torvalds发一个邮件,他就会进行测试并将其包括进内核(只要代码不使内核崩溃并且不与整个系统设计相悖,Linus都很乐意将其包括进去)。 Linux系统本身采用彻底开放、注重特性的方法进行设计。一般规律是大约隔几个月就发行一个Linux内核的新版本。当然发行周期还依赖于其它一些因素,如排除的程序故障数、用户测试预发行版的返回数以及Linux的工作量等。 可以说在两次发行间,并不是每个故障都已排除,每个问题都已得到了解决。只要系统不出现很挑剔或明显的故障,就认为比较稳定,可以推出新版本。Linux开发的动力不在于追求完美、无故障,而是要开发Unix的免费实现。 如果你想把新的特性或应用软件增加到系统上,你就得经过一个“初始”阶段。所谓“初始”阶段,就是一个由一些想对新代码挑出问题的用户不断进行测试的阶段。由于Linux团体大多在Internet上,“初始”软件通常安装在一个或多个LinuxFTP上,并且在LinuxUSENET消息组上张贴一张如何获取和测试其代码的消息,从而使得下载和测试“初始”软件的用户可以将结果、故障或问题等邮件告之作者。 初始代码中的问题解决后,代码就进入“第二”阶段:工作稳定但还不完全(即能够工作,但可能还不具备所有特性)。当然,它也可能进入“最后”阶段,即软件已完备并且可以使用。对于内核代码,一旦它完备,开发者就可让Linus将其包括进标准内核内,或者作为内核的可增加选项。 注意,这些仅只达成协定,并未形成规则。很多人对他们的软件不必发行“初始”或测试版充满信心,因此发行哪个版本是根据开发者的决定而定的。 你可能对一群自愿者居然能编写、调试出完整的Unix系统惊讶不已。整个Linux内核通过拼凑凑而成,没有采用专利的源代码,大量工作都由自愿者完成,他们将GNU下的免费软件移植到Linux系统下,同时开发出库、文件系统以及通用的设备硬件驱动程序等。 实际上,Linus率领的分布在世界各地的Linux内核开发队伍仍然在高速向前推进。当前推出的稳定的Linux内核的2.4.x版本充分显示了Linux开发队伍的非凡的创造能力以及协作开发模式的价值。 cyliu注:这篇文章可能比较早了,目前linux内核2.6.27 |
|
|
沙发#
发布于:2008-10-27 23:15
Linux内核由5个 主要的子系统组成:
文件系统 网络系统 进程管理 内存管理 进程调度 1.进程调度(SCHED)控制着进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。 2.内存管理(MM)允许多个进程安全地共享主内存区域 。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。 内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。 3. 虚拟文件系统(Virtul File System VFS)隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS还支持多达数十种不同的文件系统,这也是Linux较有特色的一部分。 虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2, fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 4.网络接口(NET)提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。 5. 进程间通信(IPC) 支持进程间各种通信机制。 处于中心位置的是进程调度,所有其它的子系统都依赖于它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其它子系统(内存管理,虚拟文件系统及进程间通信)以相似的理由依赖于进程调度。 各个子系统之间的依赖关系如下: · 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将程序和数据装入内存。 · 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有内存,还可存取共同的内存区域。 ·虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK 设备。 · 内存管理与虚拟文件系统之间的关系: 内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。 内核中的所有子系统还要依赖一些共同的资源。这些资源包括所有子系统都用到的过程,例如,分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等等。 |
|
|
板凳#
发布于:2008-10-27 23:23
Linux内核源代码的结构
Linux内核源代码位于/usr/src/linux目录下。下面是对每一个目录的简单描述。 include/子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其它模块重建内核。 init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。 arch/子目录包含了所有硬件结构特定的内核代码,arch/ 子目录下有i386和alpha模块等等。 drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等等。 fs/ 目录包含了所有文件系统的代码,如:ext2, vfat模块的代码等等。 net/ 目录包含了内核的连网代码。 mm/ 目录包含了所有的内存管理代码。 ipc/ 目录包含了进程间通信的代码。 kernel/ 目录包含了主内核代码 init, kernel, mm, ipc, drivers, fs, arch 及 net 的包含文件都在"include/" 目录下。在Linux内核中包含了 drivers, fs, arch及 net 模块,这就使得Linux内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。 |
|
|
地板#
发布于:2008-10-27 23:26
从何处开始阅读源代码
1. 系统的启动和初始化 在基于Intel的系统上,当 loadlin.exe 或 LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看arch/i386/kernel/head.S ,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。 2. 内存管理 内存管理的代码主要在/mm,但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c 和 mm/swapfile.c中实现。 3. 内核 内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,task_struct 数据结构在 include/linux/sched.h中。 4. PCI PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码, Intel的在arch/alpha/kernel/bios32.c。 5. 进程间通信 所有System V IPC 对象权限都包含在 ipc_perm 数据结构中,这可以在 include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中实现, 共享内存在 ipc/shm.c中,信号量在 ipc/sem.c中,管道在 ipc/pipe.c中实现。 6. 中断处理 内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在 arch/i386/kernel/irq.c中,其定义子在 include/asm-i386/irq.h中。 7. 设备驱动程序 Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为: /block 块设备驱动程序如ide(在ide.c)。如果你想看包含文件系统的所有设备是如何被初始化的,你应当看drivers/block/genhd.c中的device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装nfs文件系统时,它也初始化网络。块设备包含了基于IDE和SCSI的设备。 /char 这是看字符设备(如tty,串口及鼠标等)驱动程序的地方。 /cdrom Linux的所有CDROM代码都在这儿,如在这儿可以找到Soundblaster CDROM的驱动程序。注意ide CD的驱动程序是 ide-cd.c,放在drivers/block,SCSI CD的驱动程序是scsi.c,放在drivers/scsi。 /pci 这是PCI伪驱动程序的源代码,在这里可以看到PCI子系统是如何被映射和初始化的。 /scsi 在这里可以找到所有的SCSI代码及Linux所支持的scsi设备的所有设备驱动程序。 /net 在这里可以找到网络设备驱动程序,如DECChip 21040 PCI 以太网驱动程序在tulip.c中。 /sound 这是所有声卡驱动程序的所在地。 8. 文件系统 EXT2 文件系统的源代码全部在 fs/ext2/ 目录下,而其数据结构的定义在 include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。 缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c中 。 8. 网络 网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP 第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff 处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下。 9. 模块 内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h 中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。 |
|
|
地下室#
发布于:2008-10-30 17:21
开源在中国就是免费copy的代名词.
大环境使然,一味看老外在那儿YY没什么意义 |
|
5楼#
发布于:2009-02-11 17:34
学习中。
|
|
|