Linux内核介绍历史

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

Linux内核:简介

历史n n n n UNIX: 1969 Thompson & Ritchie AT&T Bell Labs。

历史n n n n UNIX: 1969 Thompson & Ritchie AT&T Bell Labs。1978年伯克利软件发行版。商业供应商:Sun, HP, IBM, SGI, DEC. GNU: 1984 Richard Stallman, FSF。IEEE可移植操作系统91987年,安迪·坦南鲍姆。SVR 4: 1989 AT&T和Sun。Linux: 1991 Linus Torvalds Intel 386 (i386)。开源:GPL。

Linux特性—类unix操作系统。特点:n抢占式多任务处理。n虚拟内存

Linux特性—类unix操作系统。特点:n抢占式多任务处理。n虚拟内存(保护内存、分页)。n共享库。n需求加载,动态内核模块。n共享写时拷贝可执行文件。n TCP / IP网络。n SMP支持。n开源。

内核是什么?n n n n AKA:执行、系统监控。控制和协调

内核是什么?n n n n AKA:执行、系统监控。控制和调节对硬件的访问。实现和支持基本抽象:n过程,文件,设备等。n内存、CPU、磁盘、描述符等。加强安全和保护。响应用户对服务的请求(系统调用)。等等等……

内核设计目标性能:效率,速度。n充分利用资源

内核设计目标性能:效率,速度。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净init拱司机α的手臂我386 64 64 68 k mips ppc年代ia 390 sh sparc 64 /usr/src/linux橡子atm块cdrom char戴奥fc 4我2 c 2 o ide ieee 1394 isdn macintosh misc净……fs内核自由毫米包括adfs非洲黑人autofs 4 bfs代码cramfs开发efs ext 2脂肪hfs hpfs分区…asm-alpha asm-armasm-generic asm-i 386 asm-ia 64 asm-m 68 k asm-mips 64 linux math-emu净pcmcia scsi视频…adfs非洲黑人autofs 4 bfs代码cramfs开发efs ext 2脂肪hfs hpfs分区…802可路由协议组atm ax 25桥核心数据全国以太网ipv 4 ipv 6 ipx irda khttpd lapb……

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

linux/arch n n当前端口的子目录。每个目录都包含kernel, lib, mm, boot和其他目录,这些目录的内容覆盖了体系结构独立代码中的代码存根。Lib包含高度优化的通用实用程序例程,如memcpy、校验和等。4: n alpha,臂,i386, ia 64, m 68 k, MIPS 64。nppc, s390, sh, sparc64。

linux/drivers n n n n n内核树中代码的最大数量

linux/drivers n n n n n内核树中最大的代码量(~1。5 M).设备、总线、平台和通用目录。司机/字符- n_tty。C是默认的行纪律。司机/块-电梯。c, genhd。c,线性的。c, ll_rw_blk。c,突袭。net -特定的驱动程序和通用例程 c and net_init. c. drivers/scsi – scsi_*. c files are generic; sd. c (disk), sr. c (CDROM), st. c (tape), sg. c (generic). General: n cdrom, ide, isdn, parport, pcmcia, pnp, sound, telephony, video. Buses – fc 4, i 2 c, nubus, pci, sbus, tc, usb. Platforms – acorn, macintosh, s 390, sgi.

linux/fs n n包含:n个VFS框架。N个子目录用于实际的文件系统。

linux/fs n n包含: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 n n n include/asm-*: n与架构相关的include子目录。include/linux: n需要Header信息

linux/include n n n include/asm-*: n与架构相关的include子目录。include/linux: n内核和用户应用程序都需要Header信息。n通常链接到/usr/include/linuxn #ifdefs n #ifdef __KERNEL__ n /* kernel stuff */ n #endif其他目录:n math-emu, net, pcmcia, scsi, video。

linux/init n n只需要两个文件:version. init。c,主要。c版本。c -包含

linux/init n n只需要两个文件:version. init。c,主要。c版本。包含在启动时打印的版本旗帜。主要。独立于C体系结构的引导代码。Start_kernel是主入口点。

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 n n n核心内核代码。固定播送时间。“主内核文件”:n个调度程序,等待队列,定时器,警报,任务队列。过程控制:n叉。c,执行。c信号。c,退出。内核模块支持:n kmod。c, ksyms。c模块。 c. Other operations: n time. c, resource. c, dma. c, softirq. c, itimer. c. n printk. c, info. c, panic. c, sysctl. c, sys. c.

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

linux/lib内核代码不能调用标准C库例程。文件:n brlock。c -“大读者”(Big Reader)自旋。n cmdline。内核命令行解析例程。n errno。errno的全局定义。n膨胀。“gunzip”是gzip的一部分。引导期间使用的C。 n string. c – portable string code. n Usually replaced by optimized, architecturedependent routines. n vsprintf. c – libc replacement.

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中。

启动和内核初始化

启动和内核初始化

系统生命周期:上下电上电下电Boot Kernel Init OS Init

系统生命周期:Ups & Downs Power on Power off Boot Kernel Init OS Init RUN!关闭

启动术语加载程序:将位从磁盘(通常)移动到内存和

加载程序:将位从磁盘(通常)移动到内存,然后将CPU控制转移到新“加载”位(可执行)的程序。n n Bootloader / Bootstrap: n n Boot PROM / PROM Monitor / BIOS: n n加载“第一个程序”(内核)的程序。在启动时“已经加载”的持久代码。启动管理器:让你选择“第一个程序”加载的n个程序。

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

LILO: LInux LOader n n n一种通用的引导管理器,支持:n LInux内核的选择。n启动时内核参数。n引导非linux内核。n多种配置。特征:n位于MBR或分区引导扇区。n构建一个扇区“映射文件”(块映射)来查找内核。/sbin/lilo -“映射安装程序”。n /etc/lilo.Conf为lilo配置文件。

lilo的例子。/dev/hda . conf文件boot=/dev/hda map=/boot/map install=/boot. confB提示timeout=50 default=linux image=/boot/ vmlinux -2。2.12

lilo的例子。/dev/hda . conf文件boot=/dev/hda map=/boot/map install=/boot. confB提示timeout=50 default=linux image=/boot/ vmlinux -2。2.12 -20 label=linux initrd=/boot/initrd-2。2.-20年12。Img read-only root=/dev/hda

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

/sbin/init n n n所有进程的祖先(idle/swapper进程除外)。n 0: shutdown n 1: single-user n 2: multi-user(无NFS) n 3: full - multi-user n 5: X 11 n 6: reboot为每个运行级别执行开机/关机脚本。

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

Shutdown n n使用/bin/shutdown,避免数据丢失和文件系统损坏。关闭阻止登录,请求init发送SIGTERM到所有进程,然后发送SIGKILL。低级命令:暂停,重启,断电。n使用-h、-r或-p选项关闭。/etc/inittab中定义的命令行。N ca:: ctrlaltdel: /sbin/shutdown -t 3 -r now。

n初始ramdisk (initrd)—两阶段启动(灵活):n第一阶段

n初始ramdisk (initrd)—两阶段启动(灵活):n第一次以root用户挂载“Initial”ramdisk。n执行linuxrc进行额外的设置和配置。n最后挂载“real”root并继续。n / initrd见文档。txt详情。n参见“man initrd”。n Net boot: n Remote root (Diskless-root-HOWTO)。n无磁盘引导(Diskless- howto)。

引导一个系统是一个复杂的、依赖于设备的过程

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

系统调用

系统调用

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

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

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

n n API =应用程序接口。n函数定义获取服务的方式。相比之下,系统调用是通过软件中断向内核发出的显式请求。标准C库(libc)包含进行系统调用的包装器例程。例如,malloc, free是使用BRK系统调用的libc例程。posix兼容=拥有一组标准的api。如果非unix系统提供了所需的一组api,那么它们也可以是posix兼容的。

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

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

Linux系统调用(2)n系统调用调度表:n关联系统调用号

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

在内核初始化过程中调用trap_init()来设置IDT(中断)

在内核初始化过程中调用n个trap_init(),设置IDT(中断描述符表)条目,对应向量128:n系统门描述符被放置在IDT中,它是system_call例程的标识地址。n n不关闭可屏蔽中断。允许用户模式进程调用异常处理程序(即系统调用例程)。

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

n n保存堆栈上异常处理程序使用的系统调用号和CPU寄存器,控制单元自动保存的除外。检查有效的系统调用。n call *sys_call_table(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内核代码(例如,内核线程)不能使用

包装程序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。系统调用和低级故障处理例程。n包括/ asm-i 386 / unistd。h n系统呼叫号码和宏。n内核/ sys。c n系统调用服务例程。

我拱/ 386 /内核/条目。通过在sys_call_table中添加条目来添加系统调用。长

我拱/ 386 /内核/条目。通过在sys_call_table中添加条目来添加系统调用。长SYMBOL_NAME (sys_my_system_call)

包括/ asm-i 386 / unistd。h n每次系统呼叫都需要一个系统呼叫号码

包括/ asm-i 386 / unistd。h n每个系统调用都需要一个系统调用表中的数字:n例如,#define __NR_write 4 n #define __NR_my_system_call nnn,其中nnn是系统调用表中的下一个空闲项。

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

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

内核模块

内核模块

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

内核模块参见A. Rubini,“设备驱动程序”,第二章。(http: / / lwn。net/Kernel/LDD 3/)模块可以被编译并动态链接到内核地址空间。n用于设备驱动程序,不需要总是常驻,直到需要。保持核心内核“占用空间”小。n也可以用来“扩展”内核的功能!

例如:“Hello, world !”#define MODULE #include <linux/module. h> int init_module(void) { printk(“<1>Hello, world!n”); return

例如:“Hello, world !”#define MODULE #include int init_module(void) { printk(“<1>Hello, world!n”); return 0; } void cleanup_module(void) { printk(“<1>Goodbye cruel world n”); }

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

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

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

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

Baidu