linux-0.11内核文件结构图
Linux 0.1.1文件系统的源码阅读

Linux 0.11文件系统的源码阅读总结1.minix文件系统对于linux 0.11内核的文件系统的开发,Linus主要参考了Andrew S.Tanenbaum 所写的《MINIX操作系统设计与实现》,使用的是其中的1.0版本的MINIX文件系统。
而高速缓冲区的工作原理参见M.J.Bach的《UNIX操作系统设计》第三章内容。
通过对源代码的分析,我们可以将minix文件系统分为四个部分,如下如1-1。
●高速缓冲区的管理程序。
主要实现了对硬盘等块设备进行数据高速存取的函数。
●文件系统的底层通用函数。
包括文件索引节点的管理、磁盘数据块的分配和释放以及文件名与i节点的转换算法。
●有关对文件中的数据进行读写操作的函数。
包括字符设备、块设备、管道、常规文件的读写操作,由read_write.c函数进行总调度。
●涉及到文件的系统调用接口的实现,这里主要涉及文件的打开、关闭、创建以及文件目录等系统调用,分布在namei和inode等文件中。
图1-1 文件系统四部分之间关系图1.1超级块首先我们了解一下MINIX文件系统的组成,主要包括六部分。
对于一个360K软盘,其各部分的分布如下图1-2所示:图 1-2 建有MINIX文件系统的一个360K软盘中文件系统各部分的布局示意图注释1:硬盘的一个扇区是512B,而文件系统的数据块正好是两个扇区。
注释2:引导块是计算机自动加电启动时可由ROM BIOS自动读入得执行代码和数据。
注释3:逻辑块一般是数据块的2幂次方倍数。
MINIX文件系统的逻辑块和数据块同等大小对于硬盘块设备,通常会划分几个分区,每个分区所存放的不同的文件系统。
硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。
分区表中得信息指明了硬盘上每个分区的类型、在硬盘中其实位置参数和结束位置参数以及占用的扇区总数。
其结构如下图1-3所示。
图1-3 硬盘设备上的分区和文件系统对于可以建立不同的多个文件系统的硬盘设备来说,minix文件系统引入超级块进行管理硬盘的文件系统结构信息。
linux操作系统目录结构详解

linux操作系统目录结构详解linux操作系统目录结构详解为了帮助广大考试新手们更加顺利地复习备考,店铺整理了关于Linux目录结构的备考资料,希望能够对大家有所帮助。
linux 目录结构/: 根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
/boot: 放置linux系统启动时用到的一些文件。
/boot/vmlinuz为linux的内核文件,以及/boot/gurb.建议单独分区,分区大小100M 即可/dev: 存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount /dev/cdrom /mnt./etc: 系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。
注:/etc/X11存放与x windows有关的设置。
/home: 系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,~test表示用户test的家目录。
建议单独分区,并设置较大的磁盘空间,方便用户存放数据/lib:/usr/lib:/usr/local/lib: 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules./lost+fount: 系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。
如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found/mnt:/media: 光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。
Linux内核目录文件简介

Linux V0.11目录文件简介●Makefile文件:该文件是编译辅助工具软件make的参数配置文件。
●boot目录:功能是当计算机加电时引导内核启动,将内核代码加载到内存中,并做一些进入入32位保护运行方式前的系统初始化工作。
①Bootsect.s:磁盘引导块程序,驻留磁盘第一个扇区。
0x7C00②Setup.s:读取机器的硬件配置参数,并把内核模块system移动到适当的内存位置处。
③Head.s:被编译连接在system模块的最前部分,主要进行硬件设备的探测设置和内存管理页面的初始设置工作。
●fs目录:文件系统实现程序的目录。
1、file_table.c文件中,目前仅定义了一个文件句柄(描述符)结构数组。
2、ioctl.c文件将引用kernel/chr_dev/tty.c中的函数,实现字符设备的io控制功能。
3、exec.c程序主要包含一个执行程序函数do_execve(),它是所有exec()函数簇中的主要函数。
4、fcntl.c程序用于实现文件i/o控制的系统调用函数。
5、read_write.c程序用于实现文件读/写和定位三个系统调用函数。
6、stat.c程序中实现了两个获取文件状态的系统调用函数。
7、open.c程序主要包含实现修改文件属性和创建与关闭文件的系统调用函数。
8、char_dev.c主要包含字符设备读写函数rw_char()。
9、pipe.c程序中包含管道读写函数和创建管道的系统调用。
10、file_dev.c程序中包含基于i节点和描述符结构的文件读写函数。
11、namei.c程序主要包括文件系统中目录名和文件名的操作函数和系统调用函数。
12、block_dev.c程序包含块数据读和写函数。
13、inode.c程序中包含针对文件系统i节点操作的函数。
14、truncate.c程序用于在删除文件时释放文件所占用的设备数据空间。
15、bitmap.c程序用于处理文件系统中i节点和逻辑数据块的位图。
电子科技大学 UNIX_Linux操作系统内核结构6章

一个进程的上下文包括五个方面: ①、被进程正文所定义的进程状态 ②、进程所使用的全局变量和数据结构的值 ③、机器寄存器的值 ④、进程表项proc结构和user结构中的值 ⑤、用户堆栈和核心堆栈中的值
“执行一个进程”——指系统在该进程的上下文中执行, 也就是进程的上下文确定和限制了进程的运行环境和空间。
可以随进程状态的变化而在内外存之间交换的进程控制信 息中的其余部分。
为了方便进程映像在内外之间交换,UNIX系统中把进程非 常驻内存部分作为一个整体,占用连续的存贮区,其顺序是: 首先是user结构(进程扩充控制块)和核心栈,然后是数据段 和用户栈。
16
进程user结构和核心栈合并构成进程的“本进程数据区— —ppda区(per process data area)。
15
在进程映像占用的内存被分配给其他进程之前,不但该进 程的程序和数据需要调出内存,该进程的控制信息也被调出内 存。但为了该进程能够再次被调入内存,内存中需要保留一部 分必要的信息,这就把进程控制信息也分成了常驻内存和非常 驻内存两部分: 常驻内存控制信息块
是系统需要经常查询以及恢复整个进程映象时所不可缺少 的信息。 非常驻内存控制信息块
7
3、进程的解释
在UNIX系统中进程的概念包含什么意义?
在较高级的方面 进程是一个重要的组织概念。可以把计算机系统看作是若
干进程组合的活动。进程是系统中活动的实体,它可以生成和 消灭,申请和释放资源,可以相互合作和竞争,而真正活动的 部件如处理机和外部设备则是看不见的。
在较低级方面 进程是不活动的实体,而处理机则是活动的,处理机的任
核心从一个进程转到另一个进程执行时,叫做“上下文切
换”,也就是系统从一个进程上下文确定的环境换到另一个进
进程管理_linux0.11

Linux0.11的地址有3类地址需要区分清楚:1.程序(进程)的虚拟地址和逻辑地址虚拟地址(virtual address)指程序产生的有段选择符和段内偏移两部分组成的地址。
一个程序的虚拟地址空间有GDT映射的全地址空间和LDT映射的局部地址空间组成。
逻辑地址(logical address)指程序产生的段内偏移地址。
应用程序只与逻辑地址打交道,分段分页对应用程序来说是透明的。
也就是说C语言中的&,汇编语言中的符号地址,C中嵌入式汇编的”m”对应的都是逻辑地址。
2.CPU的线性地址线性地址(linear address)是逻辑地址到物理地址变换的中间层,是处理器可寻址空间的地址。
程序代码产生的逻辑地址加上段基地址就产生了线性地址。
3.实际物理内存地址物理地址(physical address)是CPU外部地址总线上的寻址信号,是地址变换的最终结果,一个物理地址始终对应实际内存中的一个存储单元。
对80386保护模式来说,如果开启分页机制,线性地址经过页变换产生物理地址。
如果没有开启分页机制,线性地址直接对应物理地址。
页目录表项、页表项对应都是物理地址。
Linux 0.11的内核数据段,内核代码段基地址都是0,所以对内核来说,逻辑地址就是线性地址。
又因为1个页目录表和4个页表完全映射16M物理内存,所以线性地址也就是物理地址。
故对linux0.11内核来说,逻辑地址,线性地址,物理地址重合。
个人总结:分段和分页的区别:分段可以给每个进程提供不同的线性地址分页可以把同一线性地址空间映射到不同的物理地址逻辑地址:线性地址:物理地址:逻辑地址-》分段单元-》线性地址-》分页单元-》物理地址Linux在使用的时候避开了Intel原先的设计意图,只是对段基址设置了0,这样逻辑地址和线性地址就一样了,再经过分页机制,就最后变成了物理地址了。
Linux2.4内核使用的空间中,虚拟地址和物理地址只是简单的相差了3G与80386段相关的宏定义set_seg_desc3123715/*****************************************************************************/ /* 功能: 设置存储段描述符,把指定属性的段描述符放入gate_addr 处 */ /* 参数: gate_addr 段描述符的目的地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* dpl 描述符中特权级 */ /* base 段基地址,这是线性地址 */ /* limit 段限长 */ /* 返回: (无) */ /*****************************************************************************/ #define _set_seg_desc(gate_addr,type,dpl,base,limit) {\ // 把段描述符的第4-7字节放入gate_addr 处 *((gate_addr)+1) = ((base) & 0xff000000) | \ // base 的31..24位放入gate_addr 的31..24位 (((base) & 0x00ff0000)>>16) | \ //base 的23..16位放入gate_addr 的7..0位 ((limit) & 0xf0000) | \ //limit 的19..16位放入gate_addr 的19..16位 ((dpl)<<13) | \ // dpl 放入gate_addr 的14..13位 (0x00408000) | \ // 把P 位和D 位设置位1,G 置为 0 ((type)<<8); \ // type 放入gate_addr 的11..8位 // 把段描述符的第0-3字节放入gate_addr+1处 *(gate_addr)= (((base) & 0x0000ffff)<<16) | \ //base 的15..0放入gate+1的31..15位 ((limit) & 0x0ffff); } //limit 的15..0位放入gate+1的15..0位set_tssldt_desc/*****************************************************************************/ /* 功能: 设置系统段描述符,把指定属性的段描述符放入GDT 中 */ /* 表项n 对应的地址处, */ /* 参数: n GDT 中表项n 对应的地址 */ /* addr 系统段的基地址,这是一个线性地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* 0x89表示386TSS 段描述符,0x82表示LDT 段 */ /* 这里8是为了设置P 位为1 */0 7 15 23 31/* 返回: (无) */ /*****************************************************************************/ // %0 寄存器eax addr// %1-%6 物理地址符号项n地址-n+7的地址#define _set_tssldt_desc(n,addr,type) \__asm__ ("movw $104,%1\n\t" \ // 把TSS的限长104字节放入n地址处,// 这样ldt的限长也定为104,这没有关系,因为linux0.11// 中一个任务的ldt只有3个表项"movw %%ax,%2\n\t" \ // 把addr的15..0位(在ax中)放入n+2处"rorl $16,%%eax\n\t" \ // 把addr的高16位(eax中)放入ax中"movb %%al,%3\n\t" \ //addr的23..16位放入n+4中"movb $" type ",%4\n\t" \ // 把type字段放入n+5中"movb $0x00,%5\n\t" \ // 把G置为0,说明粒度是字节。
什么是Linux内核Linux内核体系结构

什么是Linux内核 Linux内核体系结构前言本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。
拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核是什么,它用于什么?02什么是内核内核是与计算机硬件接口的易替换软件的最低级别。
它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。
03内核还要分种类?是的,没错。
3.1 微内核微内核只管理它必须管理的东西:CPU、内存和IPC。
计算机中几乎所有的东西都可以被看作是一个附件,并且可以在用户模式下处理。
微内核具有可移植性的优势,因为只要操作系统仍然试图以相同的方式访问硬件,就不必担心您是否更改了视频卡,甚至是操作系统。
微内核对内存和安装空间的占用也非常小,而且它们往往更安全,因为只有特定的进程在用户模式下运行,而用户模式不具有管理员模式的高权限。
3.1.1 Pros可移植性安装占用空间小小内存占用安全3.1.2 Cons通过驱动程序,硬件更加抽象硬件可能反应较慢,因为驱动程序处于用户模式进程必须在队列中等待才能获得信息进程不能在不等待的情况下访问其他进程3.2 单内核单内核与微内核相反,因为它们不仅包含CPU、内存和IPC,而且还包含设备驱动程序、文件系统管理和系统服务器调用等内容。
单内核更擅长于访问硬件和多任务处理,因为如果一个程序需要从内存或运行中的其他进程中获取信息,那么它就有一条更直接的线路来访问信息,而不需要在队列中等待来完成任务。
但是,这可能会导致问题,因为在管理模式下运行的东西越多,如果行为不正常,就会有越多的东西导致系统崩溃。
3.2.1 Pros更直接地访问程序的硬件流程之间更容易通信如果支持您的设备,它应该不需要额外安装就可以工作进程反应更快,因为没有等待处理器时间的队列3.2.2 Cons较大安装体积较大内存占用不太安全,因为所有操作都在管理模式下运行04混合的内核混合内核能够选择在用户模式下运行什么,以及在管理模式下运行什么。
linux内核简介.ppt

–API只是一个函数定义 –系统调用通过“软中断”向内核发出一个明确
的请求
2020年2月10日
东华大学计算机科学与技术学院 by XinLuo
10
系统调用图解 用户态
内核态
系统调用 1
系统调用 返回
2
trap 0
2020年2月10日
东华大学计算机科学与技术学院 by XinLuo
中断的概念,终端 控制台设备驱动
Shell程序分析输入参 数,确定这是ls命令
什么是shell?
终端解释程序
什么是系统调用?
内核态用户态相关问 题,内存保护
调用系统调用fork生成 一个shell本身的拷贝
调用exec系统调用将ls 的可执行文件装入内存
从系统调用返回
Shell和ls都得以执行
系统调用是怎 么实现的?
3
Linux 基本概念
• 系统调用 • 内存管理 • 进程管理 • 虚拟文件系统(VFS) • 信号机制 • 内核初始化过程
2020年2月10日
东华大学计算机科学与技术学院 by XinLuo
4
➢ 提纲
• 用户态和内核态 • 系统调用意义 • 系统调用方法
2020年2月10日
东华大学计算机科学与技术学院 by XinLuo
Memory manager Signal 。。。
File systems Process management Device drivers Net work
Kernel interface to the hardware
Terminal controllers Terminals
Device controllers Memory controllers
a.out目标文件格式

2.1 Linux 0.11 支持的目标文件为了生成内核代码文件,Linux 0.11 使用了两种编译器。
第一种是汇编编译器 as86 和相应的链接程 序 ld86。
它们专门用于编译和链接运行在实地址模式下的 16 位内核引导扇区程序 bootsect.s 和设置程序 setup.s。
第二种是 GNU 的汇编器 gas 和 C 语言编译器 gcc 以及相应的链接程序 gld。
编译器用于为源程 序文件产生含有生成的二进制代码和数据的目标文件。
链接程序用于对相关的所有目标文件进行组合处 理,形成一个可被内核加载执行的目标文件,即可执行文件。
下面我们首先简单说明编译器产生的目标文件结构,然后描述链接器如何把需要链接在一起的目标文 件模块组合在一起,以生成二进制可执行映像文件或一个大的模块文件。
最后说明 Linux 0.11 内核二进 制代码文件 Image 的生成原理和过程。
有关目标文件和链接程序的基本工作原理可参见 John R. Levine 著的《Linkers & Loaders》一书,这里仅给出了能够理解编译链接所生成的 Linux 0.11 内核代码文件的 信息以及 Linux 0.11 内核所支持的 a.out 目标文件格式。
as86 和 ld86 生成的是 MINIX 专门的目标文件格 式,因为其结构与 a.out 目标文件格式类似,因此这里就不再说明。
为便于描述,这里把编译器生成的目标文件称为目标模块文件(简称模块文件) ,而把链接程序输出 产生的可执行目标文件称为可执行文件。
并且把它们都统称为目标文件。
2.1.1 目标文件格式C 语言编译器 gcc 和汇编器 gas 编译生成的 a.out 格式的目标模块文件或链接生成的可执行文件含有 7 个部分: a) 执行头部分(exec header)。
执行文件头部分。
该部分中含有一些参数(exec 结构) ,是有关目标 文件的整体结构信息。
Linux从头学:16张结构图,彻底理解「代码重定位」的底层原理

Linux从头学:16张结构图,彻底理解「代码重定位」的底层原理目录•程序的结构o 1. 程序头(Header)的描述信息o 2. 关于汇编地址•bootloader 把程序从硬盘读取到内存o 1. 读取到内存中的什么位置?o 2. bootloader 设置数据段基地址o 3. bootloader 读取所有扇区o 4. 如果程序文件超过 64 KB 怎么办?•代码重定位o程序入口点重定位o段表重定位•跳转到程序的入口地址•操作系统程序的执行在上一篇文章中Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?,我们以几个重要的内存地址为线索,介绍了x86 系统在上电开机之后:CPU 如何执行第一条指令;BIOS 中的程序如何被执行;操作系统的引导代码(bootloader) 被读取到物理内存中被执行;下一个环节,就应该是引导程序(bootloader)把操作系统程序,读取到内存中,然后跳入到操作系统的第一条指令处开始执行。
这篇文章,我们继续以8086 这个简单的处理器为原型,把程序的加载过程描述一下。
其中的重点部分就是代码重定位,我们用画图的方式,尽我所能,把程序加载、地址重定位的计算过程描述清楚。
PS: 文中所说的程序、操作系统文件,都是指同一个东西。
程序的结构为了便于下面的理解,我们有必要把待加载的操作系统程序的文件结构先介绍一下。
当然了,这里介绍的文件结构,是一个非常简化版本的操作系统程序,本质上与我们平常所写的应用程序没有什么差别,因此我们也可以把它看做一个普通的程序文件。
操作系统程序静静地躺在硬盘中,等待 bootloader 来读取,此时bootloader 可以看做一个加载器。
它俩毕竟是属于两个不同的东西,为了让 bootloader 知道程序的长度,需要某种“协议”来进行沟通,这个“协议”就是程序文件的头信息(Header)。
也就是说,在程序的开头部分,会详细的介绍自己,包括:程序的总长度是多少字节,一共有多少个段,入口地址在什么位置等等。
Linux Kernel 0.11学习

(第一章)att汇编语法格式的笔记1寄存器引用寄存器引用要在寄存器号前加% 例如:mov %eax,%ebx2操作数顺序操作数排列是从源(左)到目的的(右) 例如:mov % eax(源),%ebx(目的)3 常数/立即数的格式使用立即数。
要在数前面加$,例如:mov $4,%ebx (变量前加$则表示该变量数值对应的地址);符号常数直接引用,如mov value,% ebx,引用符号地址在符号齐前加$,如mov $value,%ebx4 操作数长度操作数长度用加在指令后面的符号表示,b=byte(8bit) w=word(16bit) l=long(32bit),如movw %ax,%bx5跳转在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上'*'作为前缀,而在 Intel 格式中则不需要。
6远跳转远程转移指令和远程子调用指令的操作码,在AT&T 汇编格式中为"ljump" 和"lcall",7远程返回指令8内存操作数的寻址方式计算方法是:base + index(索引)*scale(比例因子) + disp(偏移地址)例子:9 内嵌汇编9.1 内嵌汇编格式:_asm_("asm statements":outputs:intput:registers-modified);这四个字段的含义是:asm statements -是汇编语句表达式,AT&T 的结构, 每新行都是分开的。
outputs - 修饰符一定要用引号引起来, 用逗号分隔,输出的寄存器inputs - 修饰符一定要用引号引起来, 用逗号分隔,输入的寄存器registers-modified - 名字用逗号分隔,汇编代码会修改的寄存器outputs,inputs,register-modified都是可选参数,以冒号隔开,且一次以0~9编号,如outputs 的寄存器是0号,inputs寄存器是1号,往后依次类推。
Linux中的文件和目录结构详解

Linux中的⽂件和⽬录结构详解 对于每⼀个Linux学习者来说,了解Linux⽂件系统的⽬录结构,是学好Linux的⾄关重要的⼀步.,深⼊了解linux⽂件⽬录结构的标准和每个⽬录的详细功能,对于我们⽤好linux系统只管重要,下⾯我们就开始了解⼀下linux⽬录结构的相关知识。
当在使⽤Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的⽬录,⽐如etc、usr、var、bin ... ... 等⽬录,⽽在这些⽬录中,我们进去看看,发现也有很多的⽬录或⽂件。
⽂件系统在Linux下看上去就象树形结构,所以我们可以把⽂件系统的结构形象的称为树形结构。
⽂件系统的是⽤来组织和排列⽂件存取的,所以它是可见的,在Linux中,我们可以通过ls等⼯具来查看其结构,在Linux系统中,我们见到的都是树形结构;⽐如操作系统安装在⼀个⽂件系统中,它表现为由/ 起始的树形结构。
linux⽂件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的⽂件系统。
Linux的⽂件系统的⼊⼝就是/,所有的⽬录、⽂件、设备都在/之下,/就是Linux⽂件系统的组织者,也是最上级的领导者。
由于linux是开放源代码,各⼤公司和团体根据linux的核⼼代码做各⾃的操作,编程。
这样就造成在根下的⽬录的不同。
这样就造成个⼈不能使⽤他⼈的linux系统的PC。
因为你根本不知道⼀些基本的配置,⽂件在哪⾥。
这就造成了混乱。
这就是FHS(Filesystem Hierarchy Standard )机构诞⽣的原因。
该机构是linux爱好者⾃发的组成的⼀个团体,主要是是对linux做⼀些基本的要求,不⾄于是操作者换⼀台主机就成了linux的‘⽂盲’。
事实上,FHS是根据过去的经验⼀直再持续的改版的,FHS依据⽂件系统使⽤的频繁与否与是否允许使⽤者随意更动,⽽将⽬录定义成为四种交互作⽤的形态,⽤表格来说有点像底下这样:可分享的(shareable)不可分享的(unshareable)不变的(static)/usr (软件放置处)/etc (配置⽂件)/opt (第三⽅协⼒软件)/boot (开机与核⼼档)可变动的(variable)/var/mail (使⽤者邮件信箱)/var/run (程序相关) /var/spool/news (新闻组)/var/lock (程序相关)四中类型:1.可分享的: 可以分享给其他系统挂载使⽤的⽬录,所以包括执⾏⽂件与⽤户的邮件等数据,是能够分享给⽹络上其他主机挂载⽤的⽬录;2.不可分享的: ⾃⼰机器上⾯运作的装置⽂件或者是与程序有关的socket⽂件等,由于仅与⾃⾝机器有关,所以当然就不适合分享给其他主机了。
Linux内核0.11体系结构——《Linux内核完全注释》笔记打卡

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文件系统PPT

在Linux系统中主要根据文件头信息来判断文件类型,Linux系统的文件类型
有:
•普通文件
文本文件内容可以直接读取,一般都是字母、 数字以及一些符号等。可以使用cat、vi命令直
•纯文本文件
接查看文件内容。
•目录文件
通常访问的文件,由ls –l命令显示出
•设备文件
来的属性中,第一个属性为 “-”
2.3 文件操作命令 显示文件内容命令 显示目录内容及更改目录命令 建立、删除文件命令 建立、删除目录命令 复制、移动命令 压缩备份命令 权限管理命令 Linux文件查找命令
Linux文件结构
•文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和 目录的组织上。目录提供了管理文件的一个方便而有效的途径。 •Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录 出发而生成的。无论操作系统管理几个磁盘分区,这样的目录树只有一个。
Linux主要文件类型
选项:cat命令中的常用选项如下
选项 -n 或 – number
-b
-s
作用
由1开始对所有输出的行数编号
和-n 相似,只不过对于空白行不编号 当遇到有连续两行以上的空白行,就代换为
一行的空白行
显示文件内容命令
2. cat命令
例:查看/etc/network/interfaces文件内容,并对 所有输出行编号
建立、删除文件命令 例:在工作目录下,建立一个名为c-language的子目录
建立、删除文件命令
2. rmdir 命令
功能描述:删除空目录 语法:rmdir [选项] [目录名] 选项: -p :当子目录被删除后其父目录为空目录时,
也一同被删除
UNIX_Linux操作系统内核结构

1.3.1 文件系统
/
bin
usr
etc
home
tmp
dev
who
ls
bin
lib
rc
ttys
st
teach
tty0
hd02
admin
hwconf
liu
wang
chen
aa
dir2 save
UNIX文件系统树示例
UNIX文件系统的特征: 1、树状层次结构 树根、树枝、树叶、路径 2、对文件数据的一致对待 文件为有序无格式的字节流,逻辑意义由使用者解释 3、文件管理 建立、删除、修改、备份、移动、替换 存储空间的分配和释放 4、文件的访问和保护 索引节点(inode)、文件描述符(fd) 用户分组、权限划分 5、设备文件管理 统一各外部设备的访问模式
1.3.3 构件原语
“软件复用”和“模块组装”理念
程序内部: 简单功能划分;纯代码设计 程序外部: 使用构件原语进行功能重叠和组装 UNIX包含两种构件原语: ① 输入输出重定向 ② 管道
I/O重定向(I/O redirect): 一个进程通常(default)打开三个文件: 标准输入文件(fd=0) 标准输出文件(fd=1) 标准错误输出文件(fd=2)
例如: grep grep grep grep
abc abc < file1 abc < file1 > file2 abc < file1 > file2 2> file3
管道(pipe):
A进程的输出 B进程的输入
A进程将标准输出重新定向到管道中去; B进程将标准输入重新定向从管道中来。 例如: ps -e | grep student3 | wc -l 查看当前系统中与用户student3相关的进程有多少
Linux下各个文件夹的结构说明及用途介绍(超详细)

Linux下各个⽂件夹的结构说明及⽤途介绍(超详细)linux下各⽂件夹的结构说明及⽤途介绍:下⾯给⼤家分享下 ——电⼦版/bin:⼆进制可执⾏命令。
/dev:设备特殊⽂件。
/etc:系统管理和配置⽂件。
/etc/rc.d:启动的配置⽂件和脚本。
/home:⽤户主⽬录的基点,⽐如⽤户user的主⽬录就是/home/user,可以⽤~user表⽰。
/lib:标准程序设计库,⼜叫动态链接共享库,作⽤类似windows⾥的.dll⽂件。
/sbin:系统管理命令,这⾥存放的是系统管理员使⽤的管理程序。
/tmp:公⽤的临时⽂件存储点。
/root:系统管理员的主⽬录。
/mnt:系统提供这个⽬录是让⽤户临时挂载其他的⽂件系统。
/lost+found:这个⽬录平时是空的,系统⾮正常关机⽽留下“⽆家可归”的⽂件就在这⾥。
/proc:虚拟的⽬录,是系统内存的映射。
可直接访问这个⽬录来获取系统信息。
/var:某些⼤⽂件的溢出区,⽐⽅说各种服务的⽇志⽂件。
/usr:最庞⼤的⽬录,要⽤到的应⽤程序和⽂件⼏乎都在这个⽬录。
其中包含:/usr/x11r6:存放x window的⽬录。
/usr/bin:众多的应⽤程序。
/usr/sbin:超级⽤户的⼀些管理程序。
/usr/doc:linux⽂档。
/usr/include:linux下开发和编译应⽤程序所需要的头⽂件。
/usr/lib:常⽤的动态链接库和软件包的配置⽂件。
/usr/man:帮助⽂档。
/usr/src:源代码,linux内核的源代码就放在/usr/src/linux ⾥。
/usr/local/bin:本地增加的命令。
/usr/local/lib:本地增加的库根⽂件系统。
通常情况下,根⽂件系统所占空间⼀般应该⽐较⼩,因为其中的绝⼤部分⽂件都不需要经常改动,⽽且包括严格的⽂件和⼀个⼩的不经常改变的⽂件系统不容易损坏。
除了可能的⼀个叫/vmlinuz标准的系统引导映像之外,根⽬录⼀般不含任何⽂件。
linux内核完全注释一PPT课件

Linux:开放的操作系统
是一个UNIX操作系统的克隆,可以免费使 用,遵循GPL声明,可以自由修改和传播。 Linux包含了人们希望操作系统拥有的所 有功能特性,这些功能包括真正的多任务、 虚拟内存、世界上最快的TCP/IP驱动程序、 共享库和多用户支持。
现在是个人计算机和工作站上的UNIX类操 作系统。它不仅继承了UNIX的特征,而且 在许多方面超过了UNIX。
单内核例子
Linux
微内核优点
内核简单 可移值性好
微内核缺点
开销大
微内核例x简介 Linux的历史与现状
Linux之父
Linus Torvalds(林纳 斯·托瓦兹,1969年12 月28日生 )
毕业与芬兰赫尔辛基大 学计算机科学系,大学 二年级时编写Linux
设备管理
内 核
行在内核模式中
模 式
应用程序与内核模块、
内核模块间的通信是通
过函数调用实现的
硬件
操作系统内核体系结构——微内核
应用程序 设备服务器 文件服务器 IPC、进程管理、内存管理 硬件
用 内核仅包含一些最
户 模
基本功能,运行在
式 内核模式下
其它操作系统功能
内 以服务器的形式提
核 模
批处理操作系统 串行,非交互
单任务单用户操作系统 串行,交互 Dos
多任务单用户操作系统 并行,交互 Windows 98
多任务多用户操作系统 并行,交互,分时共享 Unix、Linux、Windows XP
实时操作系统 并行,响应时间短,容错性 强 嵌入式Linux
供,运行在用户模
式 式下
Linux0.11版本的set_trap_gate宏分析

Linux0.11版本的set_trap_gate宏分析比较老的版本的linux,如linux0.11,在kernel/main.c中的main函数相当于新版本的linux start_kernel函数,从该函数开始则会开始linux的内核工作,其中看到trap_init函数中,其实是在设置异常(中断)程序初始化子程序,设置相应的中断调用门(中断调用),该函数定义如下:void trap_init(void){int i;set_trap_gate(0,÷_error);set_trap_gate(1,&debug);set_trap_gate(2,&nmi);set_system_gate(3,&int3); /* int3-5 can be called from all */set_system_gate(4,&overflow);set_system_gate(5,&bounds);set_trap_gate(6,&invalid_op);set_trap_gate(7,&device_not_available);set_trap_gate(8,&double_fault);set_trap_gate(9,&coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);set_trap_gate(14,&page_fault);set_trap_gate(15,&reserved);set_trap_gate(16,&coprocessor_error);for (i=17;i<48;i++)set_trap_gate(i,&reserved);set_trap_gate(45,&irq13);outb_p(inb_p(0x21)&0xfb,0x21);outb(inb_p(0xA1)&0xdf,0xA1);set_trap_gate(39,¶llel_interrupt);}在此仅就set_trap_gate函数进行分析,其实set_trap_gate是一个宏,其定义如下:#define set_trap_gate(n,addr) \_set_gate(&idt[n],15,0,addr)对应的_set_gate也是一个宏调用,定义如下:#define _set_gate(gate_addr,type,dpl,addr) \__asm__ ("movw %%dx,%%ax\n\t" \"movw %0,%%dx\n\t" \"movl %%eax,%1\n\t" \"movl %%edx,%2" \: \: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \"o" (*((char *) (gate_addr))), \"o" (*(4+(char *) (gate_addr))), \"d" ((char *) (addr)),"a" (0x00080000))首先,这里用到了gcc的内联汇编,在此进行下简要讲解,gcc的内联汇编的基本表示如下:__asm__ (汇编语句: 输出寄存器: 输入寄存器: 会被修改的寄存器)这里面除第一行外,后面带“:”的如果不用都是可以省掉的,其中“汇编语句”即为需要执行的汇编代码序列,“输出寄存器”指定需要使用哪些寄存器作为输出参数使用,一般对应于C语言的一个表达式值或者是内存地址,“输入寄存器”指明在执行汇编代码时,使用哪些寄存器来作为输入参数使用,也是对应的C语言的某数值或者内存地址,“会被修改的寄存器”指明这些寄存器是没有在输入输出寄存器中列出,但是在汇编语句中会被修改的寄存器的值,已告知gcc不能加载原先的值,需要重新加载。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux内核文件结构图Linux|-boot 系统引导汇编程序|-bootsect.s 磁盘引导程序,编译后会驻留在磁盘的第一扇区中。
|-setup.s 主要用于读取机器的硬件配置参数,并把内核模块system移动到适当的内存位置处。
|-head.s 程序会被编译连接在system模块的最前部分,主要进行硬件设备的探测设置和内存管理页面的初始设置工作。
|-fs 文件系统|-bitmap.c 用于处理文件系统中i节点和逻辑数据块的位图。
|-block_dev.c 包含块数据读和写函数。
|-buffer.c主要用于对内存高速缓冲区进行处理。
|-char_dev.c 主要包含字符设备读写函数re_char()。
|-exec.c 主要包含一个执行程序函数do_execve(),它是所有exec()函数簇中的主要函数。
|-fcntl.c 用于实现文件I/O控制的系统调用函数。
|-file_dev.c 包含基于i节点和描述符结构的文件读写函数。
|-file_table.c 定义了一个文件句柄(描述符)结构数组。
|-inode.c 包含针对文件系统i节点操作的函数。
|-ioctl.c 将引用kernel/chr_drv/tty.c中的函数,实现字符设备的io控制功能。
|-Makefile|-namei.c 主要包括文件系统中目录名和文件名的操作函数和系统调用函数。
|-open.c 主要包含实现修改文件属性和创建与关闭文件的系统调用函数。
|-pipe.c 包含管道读写函数和创建管道的系统调用。
|-read_write.c 用于实现文件读/写和定位三个系统调用函数。
|-stat.c 实现了两个获取文件状态的系统调用函数。
|-super.c 包含对文件系统超级块的处理函数。
|-truncate.c 用于在删除文件时释放文件所占用的设备数据空间。
|-include 头文件(*.h)对所有头文件进行了详细说明,基本上对每一个定义、每一个变量或数据结构都进行了详细注释。
(主目录下的头文件主要是供内核和用户程序使用)|-asm 与CPU体系结构相关的部分(主要用于存放于计算机硬件体系结构密切相关的头文件)。
|-io.h 文件中定义了对硬件IO端口访问的嵌入式汇编宏函数:outb(),inb()以及outb_p()和inb_p()。
|-memory.h 含有一个内存复制嵌入式汇编宏mencpy()。
|-segment.h文件中定义了一些访问Intel CPU中段寄存器或与段寄存器有关的内存操作函数。
|-system.h 文件中定义了设置或修改描述符/中断门等的嵌入式汇编宏。
|-linux Linux内核专用部分(用存放Linux内核专用的头文件)。
|-config.h 定义使用的键盘语言类型和硬盘类型可选项。
|-fdreg.h 用以说明软盘系统常用到的一些参数以及所使用的I/O端口。
|-fs.h 文件是文件系统头文件,主要描述了文件操作的一些常量、高速缓冲块结构以及MINIX 文件系统1.0版的结构。
|-hdreg.h主要定义了对硬盘控制器进行编程的一些命令常量符号。
其中包括控制器端口、硬盘状态寄存器各位的状态、控制器命令以及出错状态常量符号。
另外还给出了硬盘分区表数据结构。
|-head.h该文件定义了CPU描述符的简单结构和指定描述符的项号。
|-kernel.h该文件定义了一些内核常用的函数原型等。
|-mm.h是内存管理头文件,其中主要定义了内存页面的大小和几个页面释放函数原型。
|-sched.h 调度程序头文件,定义了任务结构task_strut、初始任务0的数据,还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。
|-sys.h 本文件列出了所有系统调用函数的原型以及系统调用函数指针表。
|-tty.h|-sys 系统数据结构部分(用于存放一些与文件状态、进程、系统数据类型等有关的头文件)。
|-stat.h 该头文件说明了函数stat()返回的数据及其结构类型,以及一些属性操作测试宏、函数原型。
|-times.h 该文件中定义了文件访问与修改时间结构tms。
|-types.h 该文件中定义了基本的数据类型。
|-utsname.h系统名称结构头文件,其中定义了结构utsname以及函数原型uname()。
|-wait.h 该文件描述了进程等待信息的一些宏,包括符号常数和wait()、waitpid()函数原型声明。
|-a.out.h 主要定义了二进制执行文件a.out(Assembley out)的格式。
其中包括三个数据结构和一些宏函数。
|-const.h 文件含有一些i节点标志的常数定义。
|-ctype.h 文件定义了一些有关字符类型判断和转换的宏,是使用数组(表)进行操作。
|-errno.h 文件定义了Linux系统中的一些出错码的常量符号。
|-fcntl.h 文件控制选项头文件,主要定义了函数fcntl()和open()中用到的一些选项和符号。
|-signal.h 文件中主要定义了信号符号常量和数据结构sigaction.|-stdarg.h 标准参数头文件。
它以宏的形式定义变量参数列表。
主要说明了一个类型(va_list)和三个宏(va_start,va_arg和va_end),用于vsprintf、vprintf、vfprintf函数。
|-stddef.h 文件是由C标准化组织(X3J11)创建的,其名称含义是标准(std)定义(def),主要用于存放一些“标准定义”。
|-string.h 文件中以内嵌函数的形式定义了所有字符串操作函数,为了提高执行速度使用了内嵌汇编程序。
|-termios.h 文件含有终端I/O接口定义,包括termios数据结构和一些对通用重点接口设置的函数原型,这些函数用来读取或设置终端的属性、线路控制,读取或设置波特率以及读取或设置终端前度进程的组id.|-time.h 用于涉及处理时间的函数。
|-unistd.h 定义了各种符号常数和类型,并申明了各种函数。
|-utime.h 定义了文件访问和修改时间结构utimbuf{}以及utime()函数原型。
|-init 内核初始化程序|-main.c 它是内核完成所有初始化工作并进入正常运行的关键。
在完成了系统所有的初始化工作后,创建了用于shell的进程。
|-kernel 内核进程调度、信号处理、系统调用等程序|-blk_drv 块设备驱动程序主要含有硬盘、软盘等块设备的驱动程序,主要与文件系统和高速换出去打交道。
|-blk.h 定义了3个C程序中共用的块设备结构和数据块请求结构。
|-floppy.c 主要实现了对软盘数据块的读/写驱动函数。
|-hd.c 主要实现对硬盘数据块进行读/写的底层驱动函数do_hd_request()等;|-ll_rw_blk.c实现了底层块设备数据读/写函数ll_rw_block(),内核中多有程序都是通过该函数对块设备进行数据读写操作。
|-Makefile|-ramdisk.c|-chr_drv 字符设备驱动程序主要涉及串行线路驱动程序,键盘驱动程序和显示器驱动程序,含有较多与硬件有关的内容。
|-console.c主要包含控制台初始化程序和控制台写函数con_write(),用于被tty设备调用,还包含对显示器和键盘中断的初始化设置函数con_init()。
|-keyboard.s主要实现了键盘中断处理过程keyboard_interrupt。
|-Makefile|-rs_os.s 用于实现两个串行接口的中断处理程序。
该中断处理程序会根据从中断标志寄存器(端口0x3fa或0xfa)中取得的4种中断类型分别进行处理,并在处理中断类型为读字符的代码中调用do_tty_interrupt()。
|-serial.c用于对异步串行通信芯片UART进行初始化操作,并设置两个通信端口的中断向量。
另外还包括tty用于往串口输出的rs_write()函数。
|-tty_io.c包含tty字符设备度函数tty_read()和写函数tty_write(),为文件系统提供了上层访问接口。
另外还包括在串行中断处理过程中调用的C函数do_tty_interrupt(),该函数将会在中断类型为读字符的处理中被调用。
|-tty_ioctl.c实现了tty的io控制接口函数tty_ioctl()以及对termio[s]终端io结构的读写函数,并会在实现系统调用sys_ioctl()的fs/ioctl.c程序中被调用。
|-math 数学协处理器仿真处理程序。
|-Makefile|-math_emulate.c 其中math_emulate()函数是中断int7的中断处理程序调用的C函数。
|-asm.s 用于处理系统硬件异常所引起的中断。
|-exit.c 主要包括用于处理进程终止的系统调用。
包含进程释放、会话(进程组)终止和程序退出处理函数以及杀死进程、终止进程、挂起进程等系统调用函数。
|-fork.c 给出了进程创建系统调用sys_fork()相关的两个C语言函数。
|-Makefile|-mktime.c 程序包含一个内核使用的时间函数mktime(),用于计算从1970年1月1日0时起到开机当日的时间。
作为开机时间(秒)。
仅在init/main.c中被调用一次。
|-panic.c 包含一个显示内核出错信息并停机的函数painc()|-printk.c 包含一个内核专用信息显示函数printk()。
|-sched.c包括有关调度的基本函数(sleep_on、wakeup、schedule等)以及一些简单的系统调用函数,及几个与定时相关的软盘操作韩式。
|-signal.c包括了有关信号处理的4个系统调用以及一个在对应的中断处理程序中处理信号的函数do_signal()。
|-sys.c包括很多系统调用函数。
其中有些还没有发现。
|-system_call.s 实现了系统调用(int 0x80)的接口处理过程,实际的处理过程则包含在各系统调用相应的C语言处理函数中,这些处理函数分布在整个Linux内核代码中。
|-traps.c 对各硬件异常的实际处理程序,在各个中断处理过程中,将分别调用traps.c中相应的C 语言处理函数。
|-vsprintf.c|-lib 内核库函数这些库函数文件主要向编译系统等系统程序提供接口函数,阅读这些文件对以后理解系统软件会有较大的帮助(内核库函数用于初始化程序init/main.c执行在用户态的进程提供调用支持)|-_exit.c 退出函数_exit()|-close.c 关闭文件函数close()|-ctype.c定义了字符类型,用于判断字符的所属类型,包括控制字符(_C)、大写字符(_U)、小写字符(_L)等。