Linux内核介绍历史

  • 幻灯片:47
下载演示文稿
Linux内核:简介

Linux内核:简介

UNIX的历史:1969年汤普森和里奇AT&T贝尔实验室。

历史n UNIX:1969汤普森和里奇AT&T贝尔实验室。BSD:1978伯克利软件发行。商业供应商:Sun,HP,IBM,SGI,DEC.GNU:1984理查德·斯泰尔曼,FSF。POSIX:1986 IEEE便携式操作系统联合国。IX。Minix:1987安迪·坦南鲍姆。SVR 4:1989 AT&T和Sun。Linux:1991莱纳斯·托瓦尔兹英特尔386(i 386).开源:GPL。

Linux具有与UNIX类似的操作系统。特点:n抢占式多任务处理。虚拟内存

Linux具有n n类UNIX操作系统的功能。功能:n抢占式多任务处理。n虚拟内存(受保护内存,分页)。n共享库。n按需加载,动态内核模块。n共享写时拷贝可执行文件。n TCP/IP网络。n SMP支持。n开源。

什么是内核?又名:执行,系统监控。控制和调解

什么是内核?又名:执行,系统监控。控制和调解access to hardware. Implements and supports fundamental abstractions: n Processes, files, devices etc. Schedules / allocates system resources: n Memory, CPU, disk, descriptors, etc. Enforces security and protection. Responds to user requests for service (system calls). Etc…etc…

内核设计目标和性能:效率、速度。n利用资源提高能力

内核设计目标和性能:效率、速度。n以较低的开销利用资源提高容量。稳定性:健壮性、弹性。正常运行时间,优雅降级。功能:功能、灵活性、兼容性。安全、保护。n保护用户彼此不受影响,保护系统不受坏用户影响。便携性。可扩展性。

示例“核心”内核应用程序系统库(libc)模块系统调用接口I/O相关文件

示例“核心”内核应用程序系统库(libc)模块系统调用接口I/O相关文件系统进程相关调度器网络内存管理设备驱动程序IPC体系结构相关代码硬件

体系结构方法n n n单片。分层。模块化。微内核。虚拟机。

体系结构方法n n n单片。分层。模块化。微内核。虚拟机。

Linux源代码树布局文档脚本ipc net init arch驱动程序alpha arm i

Linux源代码树布局文档脚本ipc net init arch驱动程序alpha arm i 386 ia 64 m 68 k mips 64 ppc s 390 sh sparc 64/usr/src/Linux acorn atm块cdrom字符集fc 4 i 2 c 2 o ide ieee 1394 isdn macintosh misc net…fs内核库mm包括adfs affs autofs 4 bfs代码cramfs devpts efs ext 2 fat hfs hpfs…asm alpha asm armasm通用asm-i 386 asm ia 64 asm-m 68 k asm mips 64 linux数学emu网络pcmcia scsi视频…adfs affs autofs 4 bfs代码cramfs devpts efs ext 2 fat hfs hpfs…802 appletalk atm ax 25桥核decnet以太网ipv 4 ipv 6 ipx irda KHTPD lapb…

每个当前端口的linux/arch n子目录。每个包含内核、lib、mm和boot

每个当前端口的linux/arch n子目录。每个目录都包含内核、lib、mm、boot和其他目录,其内容覆盖独立于体系结构的代码中的代码存根。lib包含高度优化的公共实用程序例程,如memcpy、校验和等。4:nAlpha,arm,I386,ia 64,m 68K,mips 64。北太平洋,南390,上海,斯巴克64。

linux/驱动程序内核树中代码量最大

linux/drivers在内核树中的代码量最大(~1.5m)。设备、总线、平台和通用目录。驱动程序/字符–n_tty。c是默认的行规程。司机/街区-电梯。c、 genhd。c、 线性的。c、 好的。c、 突袭。北卡罗来纳州。drivers/net–特定驱动程序和常规例程空间。c和net_init。C驱动程序/scsi–scsi*。c文件是通用的;sd。c(磁盘)、sr.c(CDROM)、st.c(磁带)、sg。c(通用)。概述:n cdrom、ide、isdn、端口、pcmcia、pnp、声音、电话、视频。总线–fc 4、i 2 c、nubus、pci、SBU、tc、usb。平台–acorn、macintosh、s 390、sgi。

linux/fs包含:n个虚拟文件系统(VFS)框架。n个实际文件系统的子目录。

linux/fs包含:n个虚拟文件系统(VFS)框架。n个实际文件系统的子目录。vfs相关文件:n exec。c, binfmt_ *。用于映射新进程映像的C文件。n设备。c, blk_dev。设备注册,块设备支持。n超级。c文件系统。c . n inode。 c, dcache. c, namei. c, buffer. c, file_table. c. n open. c, read_write. c, select. c, pipe. c, fifo. c. n fcntl. c, ioctl. c, locks. c, dquot. c, stat. c.

linux/include/asm-*:n依赖于体系结构的include子目录。include/linux:n所需的头信息

linux/include/asm-*:n依赖于体系结构的include子目录。include/linux:n内核和用户应用程序都需要的头信息。n通常链接到/usr/include/linux。n仅内核部分由#ifdefs n#ifdef(uu Kernel)n/*Kernel stuff*/n#endif其他目录保护:n math emu、net、pcmcia、scsi、video。

linux/init只有两个文件:version。c、 梅因。C版本c–包含

linux/init只有两个文件:version。c、 梅因。C版本c–包含the version banner that prints at boot. main. c – architecture-independent boot code. start_kernel is the primary entry point.

linux/ipc n n n System V ipc设施。如果在编译时禁用,则util。c

linux/ipc n n n System V ipc设施。如果在编译时禁用,则util。c导出简单返回-ENOSYS的存根。每个设施一个文件:n sem。c -信号量。n单孔位微吹气扰动。C—共享内存。n味精。消息队列。

linux/kernel n n n核心内核代码。固定播送时间。“主内核”

linux/kernel是核心内核代码。附表。c–“主内核文件”:n调度程序、等待队列、计时器、警报、任务队列。过程控制:n fork。c、 执行官。c、 信号。c、 退出。内核模块支持:nkmod。c、 克西姆斯。c、 模块。C其他操作:n次。c、 资源。c、 dma。c、 softirq。c、 伊蒂默。Cn printk。c、 信息。c、 恐慌。c、 sysctl。c、 系统。C

linux/lib内核代码无法调用标准C库例程。文件:n brlock。

linux/lib内核代码无法调用标准C库例程。文件:n brlock。c-“大阅读器”自旋锁。n cmdline。c–内核命令行解析例程。嗯,不。c–errno的全球定义。充气。c–gzip的“gunzip”部分。c在引导期间使用。n字符串。c–可移植字符串代码。n通常由优化的、依赖于体系结构的例程代替。n vsprintf。c–libc替换。

linux/mm n n n分页和交换:n swap。c, swapfile。c(分页设备),

linux/mm n n n分页和交换:n swap。c, swapfile。C(分页设备),swap_state。c(缓存)。n vmscan。分页策略。n page_io。C -低级页面转移。分配和重新分配:n板。C板分配器。 n page_alloc. c – page-based allocator. n vmalloc. c – kernel virtual-memory allocator. Memory mapping: n memory. c – paging, fault-handling, page table code. n filemap. c – file mapping. n mmap. c, mremap. c, mlock. c, mprotect. c.

linux/scripts n内核菜单配置脚本。n内核打补丁。n生成内核

linux/scripts:n基于菜单的内核配置的脚本。n内核补丁。n生成内核文档。

Linux是一个模块化的、类似unix的单片内核。内核是心脏

Linux是一个模块化的、类似UNIX的单片内核。内核是具有特殊硬件权限(内核模式)的操作系统的核心。“核心内核”提供框架、数据结构、对驱动程序、模块和子系统的支持。依赖于体系结构的源子树位于/arch中。

引导和内核初始化

引导和内核初始化

系统生命周期:上下电开机关机开机内核初始化操作系统初始化

系统生命周期:上下电开机关机开机内核初始化操作系统初始化运行!关闭

引导术语n Loader:将位从磁盘(通常)移动到内存和内存的程序

引导术语n Loader:将位从磁盘(通常)移动到内存,然后将CPU控制转移到新“加载”位(可执行)的程序。n引导加载程序/Bootstrap:n引导PROM/PROM监视器/BIOS:n加载“第一个程序”(内核)的程序。开机时“已加载”的持久代码。引导管理器:n个程序,用于选择要加载的“第一个程序”。

LILO: LInux LOader n n n一种通用的引导管理器,支持:n Choice

LILO:LInux LOader是一个多功能的引导管理器,支持:n种LInux内核选择。n启动时内核参数。n引导非Linux内核。n各种配置。特性:n位于MBR或分区引导扇区中。n不知道文件系统结构,所以…n构建一个扇区“映射文件”(块映射)来查找内核/sbin/lilo—“地图安装程序”。n/etc/lilo。conf是lilo配置文件。

示例lilo.conf文件boot=/dev/hda map=/boot/map install=/boot.b prompt timeout=50 default=linux image=/boot/vmlinuz-2.2.12

示例lilo.conf文件boot=/dev/hda map=/boot/map install=/boot.b prompt timeout=50 default=linux image=/boot/vmlinuz-2.2.12-20 label=linux initrd=/boot/initrd-2.2.12-20.img只读根=/dev/hda 1

/sbin/init n n n所有进程的祖先(idle/swapper进程除外)。控制之间的转换

/所有进程的sbin/init祖先(空闲/交换进程除外)。控制“运行级别”之间的转换:n 0:关闭n 1:单用户n 2:多用户(无NFS)n 3:完全多用户n 5:X 11 n 6:重新启动为每个运行级别执行启动/关闭脚本。

Shutdown n使用/bin/Shutdown避免数据丢失和文件系统损坏。关机抑制

Shutdown n使用/bin/Shutdown避免数据丢失和文件系统损坏。关机禁止登录,要求init向所有进程发送SIGTERM,然后发送SIGKILL。低级命令:停止、重新启动、关机。n改用-h、-r或-p选项关闭。Ctrl-Alt删除“Vulcan颈部挤压”:n由/etc/inittab中的一行定义。n ca::ctrlaltdel:/sbin/shutdown-t3-r现在。

高级引导概念n初始ramdisk(initrd)–两阶段引导以实现灵活性:n优先

高级引导概念n Initial ramdisk(initrd)–两阶段引导以实现灵活性:n第一次将“Initial”ramdisk装载为根。n执行linuxrc以执行其他设置、配置。n最后挂载“real”root并继续。n见文件/initrd。详细信息请参阅。n另见“man initrd”。n网络引导:n远程根目录(无磁盘根目录HOWTO)。n无盘引导(无盘HOWTO)。

摘要:引导系统是一个复杂的、依赖于设备的过程,涉及

摘要:引导系统是一个复杂的、依赖于设备的过程,涉及从硬件到固件再到软件的转换。在英特尔体系结构的约束范围内引导特别复杂,通常涉及固件支持(BIOS)和引导管理器(LILO)/sbin/lilo是一个“映射安装程序”,它读取配置信息并写入引导期间使用的引导扇区和块映射文件。start_内核是Linux“main”,在生成进程0(空闲)和进程1(初始化)之前设置进程上下文。函数的作用是:在执行用户级初始化进程之前,先执行高级初始化。

系统调用

系统调用

系统调用用户级进程和硬件设备之间的接口。n CPU,内存,

系统调用n用户级进程和硬件设备之间的接口。n CPU、内存、磁盘等使编程更容易:n让内核处理硬件特定问题。提高系统安全性:n让内核通过系统调用检查请求的服务。提供可移植性:n维护接口但更改功能实现。

n n API =应用程序接口。n函数定义指定如何执行

POSIX API n API=应用程序编程接口。n函数defn指定如何获得服务。n相反,系统调用是通过软件中断向内核发出的显式请求。标准C库(libc)包含进行系统调用的包装例程。例如,malloc、free是使用brk系统调用的libc例程。POSIX兼容=具有标准的API集。非UNIX系统如果提供所需的API集,则可以兼容POSIX。

Linux系统调用(1)通过执行int $0 x 80调用。n程序异常

通过执行int$0 x 80调用Linux系统调用(1)。n编程异常向量号128。n CPU切换到内核模式并执行内核函数。n调用进程在eax寄存器(英特尔处理器上)中传递标识系统调用的系统调用号。n Syscall处理程序负责:n在内核模式堆栈上保存寄存器。n调用系统调用服务例程。n通过从_sys_call()调用ret_退出。

Linux系统调用(2)n系统调用调度表:n将系统调用号与

Linux系统调用(2)n系统调用调度表:n将系统调用号与相应的服务例程相关联。n存储在sys_call_表数组中,最多有NR_syscall项(通常最多256个)。n第n个条目包含syscall n的服务例程地址。

初始化系统调用在内核初始化期间调用的n trap_init()设置IDT(中断

初始化系统调用在内核初始化期间调用的n trap_init()设置与向量128相对应的IDT(中断描述符表)项:n set_System_gate(0 x 80,&System_调用);n系统门描述符放在IDT中,标识系统调用例程的地址。n n不禁用可屏蔽中断。将描述符特权级别(DPL)设置为3:n允许用户模式进程调用异常处理程序(即系统调用例程)。

函数n n保存异常使用的系统调用号和CPU寄存器

函数n n n将异常处理程序使用的系统调用号和CPU寄存器保存在堆栈上,控制单元自动保存的除外。检查有效的系统调用。调用与系统调用号(包含在eax中)关联的特定服务例程:n call*sys\u call\u表(0,%eax,4)系统调用的返回代码存储在eax中。

参数传递n 32位Intel 80 × 86: n 6个寄存器

参数传递n 32位Intel 80 x 86: n 6个寄存器用于存储系统调用参数。N eax(系统调用号)。N ebx, ecx, edx, esi, edi存储参数到系统调用服务例程,由系统调用号标识。

内核代码(例如,内核线程)的包装程序不能使用

包装程序nn n内核代码(例如,内核线程)不能使用库例程。_syscall 5宏用最多5个参数定义系统调用的包装器例程。例如,_syscall 3(int, write, int, fd, const char *, buf, unsigned int, count)

例如:“Hello, world !”

例如:“Hello, world !”

Linux系统调用相关文件n主要文件:n arch/i 386/kernel/entry。n系统

与系统调用相关的Linux文件n主文件:n arch/i 386/kernel/entry.S n系统调用和低级故障处理例程。n包括/asm-i 386/unistd.h n系统调用号和宏。n kernel/sys.c n系统调用服务例程。

arch/i 386/kernel/entry.sn通过在sys_call_表中追加条目来添加系统调用:.long

arch/i 386/kernel/entry.sn通过在sys_call_表中添加条目来添加系统调用:。长符号_名称(sys_my_system_call)

include/asm-i 386/unistd.h n每个系统调用都需要在系统调用中包含一个号码

include/asm-i 386/unistd.h n每个系统调用都需要在系统调用表中输入一个数字:n例如,“定义”NR“写入4 n”定义“定义”NR“我的系统”调用nnn,其中nnn是系统调用表中的下一个自由项。

内核/ sys。c n n服务程序主体在这里定义:例如,asmlinkage

内核/ sys。例如,asmlinkage retval sys_my_system_call (parameters){服务例程的主体;返回retval;}

内核模块

内核模块

内核模块参见A.Rubini,“设备驱动程序”,第2章(http://lwn.net/Kernel/LDD)

内核模块参见A.Rubini,“设备驱动程序”,第2章。(http://lwn.net/Kernel/ldd3/)也可从课程网站获得。模块可以被编译并动态链接到内核地址空间。n对于在需要之前不需要始终驻留的设备驱动程序非常有用。n保持核心内核的“足迹”很小。n也可以用来“扩展”内核的功能!

示例:“你好,世界!”#定义模块#包括<linux/MODULE。h> int init_模块(void){printk(<1>你好,world!n”);返回

示例:“你好,世界!”#定义模块#包括 int init_模块(void){printk(<1>你好,世界!n”);返回0;}void cleanup_模块(void){printk(<1>再见,世界n”);}

n使用insmod module_name在运行内核中安装模块对象文件。

使用Modules n模块对象文件安装在运行内核中,使用insmod Module_名称。n将模块加载到内核地址空间,并将模块中未解析的符号链接到运行内核的符号表。

内核符号表n可供内核加载模块访问的符号出现在/proc/ksyms.n中

内核符号表n内核可加载模块可访问的符号出现在/proc/ksyms中。n register\u symtab在内核的主表中注册一个符号表。n真正的黑客通过修改kernel/ksyms从内核导出符号。C

Baidu