kernel第10讲 内核源代码目录树
- 格式:pdf
- 大小:117.19 KB
- 文档页数:2
Linux最新的Kernel源码是3.12,让我们来看看它的目录结构:
[linc@localhost linux-3.12]$ tree -L 1
.
|-- arch :硬件体系结构相关,每个平台一个目录,如arm,mips |-- block :块设备驱动IO调度
|-- COPYING
|-- CREDITS
|-- crypto :加密算法等
|-- Documentation:数量众多的内核文档
|-- drivers :设备驱动程序啦
|-- firmware :固件?
|-- fs :各种文件系统
|-- include :各种头文件来这里找
|-- init :内核初始化相关
|-- ipc :进程通信
|-- Kbuild
|-- Kconfig
|-- kernel :内核最kernel(核心)的代码了
|-- lib :库文件
|-- MAINTAINERS
|-- Makefile
|-- mm :内存管理
|-- net :网络相关
|-- README
|-- REPORTING-BUGS
|-- samples :示例程序
|-- scripts :配置内核的脚本
|-- security :安全方面
|-- sound :音频相关驱动
|-- tools :内核常用工具
|-- usr :cpio
`-- virt :内核虚拟化相关。
Linux内核架构和工作原理详解作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
Linux 进程采用层次结构,每个进程都依赖于一个父进程。
内核启动init程序作为第一个进程。
该进程负责进一步的系统初始化操作。
init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
virt/ ---- 提供虚拟机技术的支持。
Linux内核预备工作理解Linux内核最好预备的知识点:懂C语言懂一点操作系统的知识熟悉少量相关算法懂计算机体系结构Linux内核的特点:结合了unix操作系统的一些基础概念Linux内核的任务:1.从技术层面讲,内核是硬件与软件之间的一个中间层。
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。
在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。
负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4.内核就像一个库,提供了一组面向系统的命令。
系统调用对于应用程序来说,就像调用普通函数一样。
内核实现策略:1.微内核。
最基本的功能由中央内核(微内核)实现。
所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
2.宏内核。
内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。
内核中的每一个函数都可以访问到内核中所有其他部分。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
哪些地方用到了内核机制?1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。
Kernel Locking 中文版Unreliable Guide To LockingRusty Russell<******************.au>翻译:albcamus <****************>©Copyright 2003 Rusty RussellThis documentation is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAFor more details see the file COPYING in the sourcedistribution of Linux.第1章. 介绍欢迎进入Rusty优秀的《Unreliable Guide to Kernel Locking》细节。
LINUX内核源文件介绍以及头文件介绍.txt两人之间的感情就像织毛衣,建立的时候一针一线,小心而漫长,拆除的时候只要轻轻一拉。
*******************LINUX内核(0.11)源文件介绍******************1、内核源文件放置目录:||————boot 系统引导汇编程序目录||————fs 文件系统目录||————includ e 头文件目录||————init 内核初始化程序目录||————kernel内存进程调度、信号处理、系统调用等程序的目录||————lib 内核库函数目录||————mm 内存管理程序目录||————tools生成内核Im age文件的工具程序目录||————Makefi le文件|2、引导启动程序目录boo t包含3个汇编语言文件,是内核源文件中最先被编译的程序。
功能:当计算机家电时引导内核启动,将内核代码加载到内存中,并完成系统初始化工作。
boot||————bootse ct.s 磁盘引导块程序,编译后会驻留在磁盘的第一个扇区中||————setup.s 读取机器的硬件配置参数,并把内核模式s yste m移动到适当的内存位置处||————head.s 会被编译连接在syst em模块的最前部分,主要进行硬件设备的探测配置和内存管理页面的配置工作|3、文件系统目录f s包含17个C语言程序fs||——buffer.c 管理高速缓冲区||——file_t able.c 在0.11仅定义了一个文件句柄(描述符)结构数组||——ioctl.c 将引用ker nel/chr_de v/tty.c中的函数,实现字符设备的IO控制功能||——exec.c 主要包含一个执行程序函数do_e xecve()||——fcntl.c 实现文件I/O控制的系统调用函数||——read_w rite.c 实现文件读/写和定位的三个系统调用函数||——stat.c 实现了两个获取文件状态的系统调用函数||——open.c 主要包含实现修改文件属性和创建与关闭文件的系统调用函数||——char_d ev.c 主要包含字符设备读写函数rw_c har()||——pipe.c 包含管道读写函数和创建管道的系统调用函数||——file_d ev.c 包含基于i节点和描述符结构的文件读写函数。
Linux源代码目录树结构Linux-电脑资料Linux 用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间,。
源代码所有在目录:/usr/src/linux (大部分linux发行版本中) ( by Allen) Linux用来支持各种体系结构Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。
源代码所有在目录:/usr/src/linux (大部分linux发行版本中)(by Allen)Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。
源代码所有在目录:/usr/src/linux (大部分linux发行版本中)init 内核初始化代码kernel 内核核心部分:进程、定时、程序执行、信号、模块。
mm 内存处理arch 平台相关代码i386 IBM的PC体系结构kernel 内核核心部分mm 内存管理math-emu 浮点单元软件仿真lib 硬件相关工具函数boot 引导程序compressed 压缩内核处理tools 生成压缩内核映像的程序alpha 康柏的Alpha体系结构s390 IBM的System/390体系结构sparc Sun的SPARC体系结构sparc64 Sun的Ultra-SPARC体系结构mips SGI的MI PS体系结构ppc Motorola-IBM的基于PowerPC的体系结构m68k Motorola的基于MC680x0的体系结构arm 基于ARM处理器的体系结构fs 文件系统proc /proc虚拟文件系统devpts /dev/pts虚拟文件系统ext2 Linux本地的Ext2文件系统isofs ISO9660文件系统(CD-ROM)nfs网络文件系统(NFS)nfsd 集成的网络文件系统服务器fat 基于FAT的文件系统的通用代码msdos 微软的MS-DOS文件系统vfat 微软的Windows文件系统(VFAT)nls 本地语言支持ntfs 微软的Windows NT文件系统smbfs 微软的Windows服务器消息块(SMB)文件系统umsdos UMSDOS文件系统minix MINIX文件系统hpfs IBM的OS/2文件系统sysv SystemV、SCO、Xenix、Coherent和Version7文件系统ncpfs Novell的Netware核心协议(NCP0ufs Unix BSD、SunOs、FreeBSD、NetBSD、OpenBSD和NeXTStep文件系统affs Amiga的快速文件系统(FFS)coda Coda网络文件系统hfs 苹果的Macintosh文件系统adfs Acorn磁盘填充文件系统efs SGI IRIX的EFS文件系统qnx4 QNX4 OS使用不的文件系统romfs 只读小文件系统autofs 目录自动装载程序的支持lockd 远程文件锁定的支持Net 网络代码Ipc System V的进程间通信Drivers 设备驱动程序block 块设备驱动程序paride 从并口访问IDE设备的支持scsi SCSI设备驱动程序char 字符设备驱动程序joystick游戏杆ftape 磁带流设备hfmodem 无线电设备ip2 IntelliPort的多端口串行控制器net 网卡设备sound 音频卡设备video视频卡设备cdrom 专用CD-ROM设备(除ATAPI和SCSI之外)isd0n ISDN设备apl000 富士的AP1000设备macintosh 苹果的Macintosh设备sgi SGI的设备fc4 光纤设备acorn Acorn的设备misc 杂项设备pnp 即插即用的支持usb 通用串行总线(USB)的支持pci PCI总线的支持sbus Sun的SPARC SBus的支持nubus 苹果的Macintosh Nubus的支持zorro Amiga的Zorro总线的支持dio 惠普的HP300 DIO总线的支持tc Sun的TurboChannel支持(尚未完成)Lib 通用内核函数Include 头文件(.h)linux 内核核心部分lockd 远程文件加锁nfsd 集成的网络文件服务器sunrpc Sun的远程过程调用byteorder 字节交换函数modules 模块支持asm-generic 平台无关低级头文件asm-i386 IBM的PC体系结构asm-alpha 康柏的Alpha体系结构asm-mips SGI的MIPS体系结构asm-m68k Motorola-IBM的基于PowerPC的体系结构asm-ppc Motorola-IBM的PowerPC体系结构asm-s390 IBM的System/390体系结构asm-sparc Sun的SPARC体系结构asm-sparc64 Sun的Ultra-SPARC体系结构asm-arm 基于ARM处理器的体系结构net 网络scsi SCSI支持video 视频卡支持config 定义内核配置的宏所在的头文件scripts 生成内核映像的外部程序Documentation有关内核各个部分的通用解释和注释的文本文件参考资料:《UNDERSTANDING THE LINUX KERNEL》DANIEL P.BOVET & MARCO CESATI 著。
Linux内核0.11体系结构——《Linux内核完全注释》笔记打卡0 总体介绍⼀个完整的操作系统主要由4部分组成:硬件、操作系统内核、操作系统服务和⽤户应⽤程序,如图0.1所⽰。
操作系统内核程序主要⽤于对硬件资源的抽象和访问调度。
图0.1 操作系统组成部分内核的主要作⽤是为了与计算机硬件进⾏交互,实现对硬件部件的编程控制和接⼝操作,调度对硬件资源的访问,并为计算机上的⽤户程序提供⼀个⾼级的执⾏环境和对硬件的虚拟接⼝。
1 Linux内核模式操作系统内核的结构模式主要可分为整体式的单内核模式和层次是的微内核模式。
Linux 0.11采⽤了单内核模式。
如图1.2所⽰,单内核操作系统所提供的服务流程为:应⽤主程序使⽤指定的参数值执⾏系统调⽤指令(int x80),使CPU从⽤户态切换到核⼼态,然后操作系统根据具体的参数值调⽤特定的系统调⽤服务程序,这些服务程序根据需要再调⽤底层的⼀些⽀持函数以完成特定的功能。
完成服务后,系统使CPU从核⼼态回到⽤户态,执⾏后续的指令。
图1.1 单内核模式的简单模型结构2 Linux内核系统体系结构Linux内核主要由5个模块构成,分别为:进程调度模块、内存管理模块、⽂件系统模块、进程间通信模块和⽹络接⼝模块。
模块之间的依赖关系如图2.1所⽰,虚线部分表⽰0.11版本内核中未实现部分(所有的模块都与进程调度模块存在依赖关系)。
图2.1 Linux内核系统模块结构及相互依赖关系从单内核模式结构模型出发,Linux 0.11内核源代码的结构将内核主要模块分配如图2.2所⽰。
(除了硬件控制⽅框,其他粗线分别对应内核源代码的⽬录组织结构)图2.2 内核结构框图3 Linux内核对内存的管理和使⽤对于机器中的物理内存,Linux 0.11内核中,系统初始化阶段将其划分的功能区域如图3.1所⽰。
图3.1 物理内存使⽤的功能分布图虚拟地址:(virtual address)由程序产⽣的由段选择符合段内偏移地址两个部分组成的地址。
Linux内核启动流程----设备树的识别曹忠明ARM Linux内核在Linux-3.x内核有了很大的变化,对一些新的平台的支持取消了传统的设备文件而用设备树取代,这里以FS4412设备树识别为例说明Linux是如何识别设备树的。
1、设备树文件FS4412设备树文件(exynos4412-fs4412.dts)部分内容:1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031 /** Insignal's Exynos4412 based Origen board device tree source** Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.* ** Device tree source file for Insignal's Origen board which is based on* Samsung's Exynos4412 SoC.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation.*// dts - v1 /;#include"exynos4412.dtsi"/{model = "Insignal Origen evaluation board based on Exynos4412";compatible = "insignal,origen4412", "samsung,exynos4412";memory {reg = <0x40000000 0x40000000>;};chosen {bootargs = "root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs init=/linuxrc console=ttySA };firmware@0203F000 {compatible = "samsung,secure-firmware";3233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 reg = <0x0203F000 0x1000>;};srom - cs1@5000000 {compatible = "simple-bus";#address-cells = <1>;#size-cells = <1>;reg = <0x5000000 0x1000000>;ranges;ethernet@5000000 {compatible = "davicom,dm9000";reg = <0x5000000 0x2 0x5000004 0x2>;interrupt - parent = <&gpx0>;interrupts = <64>;davicom, no - eeprom;mac - address = [00 0a 2d a6 55 a2];};};regulators {compatible = "simple-bus";#address-cells = <1>;#size-cells = <0>;mmc_reg:regulator@0 {compatible = "regulator-fixed";reg = <0>;regulator - name = "VMEM_VDD_2.8V";regulator - min - microvolt = <2800000>; regulator - max - microvolt = <2800000>; gpio = <&gpx1 10>;enable - active - high;};};g2d@10800000 {status = "okay";};sdhci@12530000 {7677787980818283 bus - width = <4>;pinctrl - 0 = <&sd2_clk &sd2_cmd &sd2_bus4 &sd2_cd>;pinctrl - names = "default";vmmc - supply = <&mmc_reg>;status = "okay";};......};编译设备树文件,内核顶层目录下执行如下命令可以编译设备树文件:$ make dtbs编译后生成文件为exynos4412-fs4412.dtb,dtb文件是使用大端字节序存储,显示其内容如下:$ hexdump exynos4412-fs4412.dtb内容如下:0000000 0dd0 edfe 0000 a588 0000 3800 0000 0c820000010 0000 2800 0000 1100 0000 1000 0000 00000000020 0000 9906 0000 d481 0000 0000 0000 00000000030 0000 0000 0000 0000 0000 0100 0000 00000000040 0000 0300 0000 0400 0000 0000 0000 01000000050 0000 0300 0000 0400 0000 0f00 0000 01000000060 0000 0300 0000 0400 0000 1b00 0000 01000000070 0000 0300 0000 2700 0000 2c00 6e69 69730000080 6e67 6c61 6f2c 6972 6567 346e 3134 00320000090 6173 736d 6e75 2c67 7865 6e79 736f 3434.....0008880 006e 6276 6361 2d6b 6f70 6372 0068 66760008890 6f72 746e 702d 726f 6863 7600 7973 636e00088a0 6c2d 6e65 000000088a5在uboot引导内核之前,会将设备树文件加载到内存中,以备Linux内核使用,这里就不详细说明了2、Linux内核启动Linux内核启动分几个阶段:1)Linux内核自解压2)Linux内核初始化----汇编3)Linux内核初始化----C这里从第三阶段开始说明,分析这个阶段,主要是查看函数start_kernel,在start_kernel中有几个函数这里重点分析:2.1setup_archsetup_arch(&command_line);void __init setup_arch(char **cmdline_p){conststructmachine_desc *mdesc;…mdesc = setup_machine_fdt(__atags_pointer);if (!mdesc)mdesc = setup_machine_tags(__atags__pointer, __machine_arch_type);…}setup_machine_fdt:structmachine_desc *setup_machine_fdt(unsigned int dt_phys)函数是用来识别设备树,Linux内核中是这样描述这个函数的:/** Machine setup when an dtb was passed to the kernel,dt_phys* @dt_phys: physical address of dt blob** If a dtb was passed to the kernel in r2, then use it to choose the correct machine_desc * and to setup the system*/也就是说bootloader如果将一个设备树文件加载到内存中,其通过r2寄存器将设备树的物理地址传递到Linux内核中,Linux内核来选择正确的机器且对其进行设置setup_machine_tags:这函数是在Linux内核不使用设备树的情况是使用,这里就不分析了。
文件系统的目录结构在Linux下,用户所见到的文件空间是基于树状结构的,树的根在顶部。
在这个空间中的各种目录和文件从树根向下分支,顶层目录(/)被称为根目录。
Linux操作系统由一些目录和许多文件组成。
根据用户选择的安装不同,这些目录可能是不同的文件系统。
通常,大多数操作系统都驻存在两个文件系统上:即称为/的根文件系统和安装在/usr下的文件系统。
如果你用cd /命令将当前目录改变到根目录,并用ls命令列出目录清单,你就会看到一些目录。
这些目录组成了根文件系统的内容,它们也为其他文件系统提供了安装点。
/bin目录包含称为二进制(binary)文件的可执行程序(事实上,名为/bin的目录是binary的缩写)。
这些程序是必需的系统文件,许多Linux命令(如ls)放在该目录中。
/sbin目录也用于存储系统二进制文件。
这个目录中的大多数文件用于管理系统。
/etc目录非常重要,它包含许多Linux系统配置文件。
从本质上说,这些文件使你的Linux系统具有自己的个性。
口令文件(口令)就放在这里,在启动时安装的文件系统列表(fstab)也放在这里。
另外,这个目录还包括Linux的启动脚本、你想要永久记录的、带IP地址的主机列表和许多其他类型的配置信息。
/lib目录中存储着程序运行时使用的共享库被存储在此。
通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。
/dev目录包含称为设备文件的特殊文件,这些文件用于访问系统上所有不同类型的硬件。
例如,/dev/mouse文件是用于读取鼠标输入的。
通过用这种方法组织对硬件设备的访问,Linux有效地使硬件设备的接口看起来就象一个文件。
这意味着在许多情况下,你可以用对软件使用的相同语法来对计算机的硬设备进行操作。
例如,为了在软盘驱动器上建立你的起始目录的磁盘档案,你可以使用下面的命令:tar -cdf /dev/fd0 tackett/dev目录中的许多设备都放在逻辑组中,下表列出了/dev目录中一些最常用/proc目录实际上是一个虚拟文件系统,它被用于从内存中读取处理信息。
第10讲内核源代码目录树
内核代码安装在/usr/src/linux下,该目录下的各子目录都代表一个特定的内核功能性子集,下面针对kernel-devel-2.6描述。
所有与体系结构相关的代码,每个体系结构特有的子目录arch
下又至少包含3个子目录:kernel、lib、mm、boot include 编译内核所需要的头文件。
init 内核的初始化代码,但不是系统的引导代码,其中main.c
和Version.c是研究Linux内核的起点。
mm 体系结构无关部分的内存管理代码,另:arch/*/mm
drivers 驱动目录,是内核中最庞大的目录
ipc 进程间通信。
它包含了共享内存、信号量以等代码。
modules 存放了已建好的、可动态加载的模块。
fs VFS和各个不同文件系统的代码都在这个目录中。
firmware 使用某个驱动需要的设备固件
kernel 主要内核代码实现大多数内核函数:进程调度sched.c、进程创建fork.c、撤销exit.c等,另arch/*/kernel。
net 各种网络协议相关代码
lib 内核的库代码,实现了一个标准C库的通用子集,包括字符串和内存操作的函数以及有关sprintf和atoi的系列函数。
tools 辅助Linux开发的工具 security 不同的Linux安全模型的代码 block 块I/O层,block层的实现。
crypto 内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。
sound 声卡驱动等相关代码
usr 用于打包和压缩的的cpio等用户空间程序的代码
scripts 无内核代码,子目录下多有depend和makefile文件。
运行make menuconfig或make xconfig时,就与这些脚本交互。
scripts 用于生成内核的脚本 Documentation 内核源代码文档 samples 示例,示范代码 crypto 加密API。