您的位置:首页 > 运维架构 > Linux

1.概述

2016-02-23 17:05 281 查看
此博客为博主在学习,2011年人民邮电出版社出版,作者是Claudia
Salzberg、Rodriguez、Gordon Fischer、Steven Smolski的图书《Linux内核编程》时,依照每章的课后习题从网上搜集整理的相关知识。大家可以参考阅读,序号为题号,链接为网络来源!

------------------------------------------------------------------------------------------------


2.PowerLinux,为IT行业术语。PowerLinux是一种运行在Power架构技术上的基于
Linux的操作系统,通常指运行在基于IBMPower系统上的Linux。

 
来自 <http://baike.baidu.com/link?url=Of2QUTnRm5dn_qD9fBx8M7snBlSmSQz5ea7FyqTMV7pRP0cuhIElzkA3aeZ461DtxUPhvg0fKDfQxn-XD8d6fK>
3.Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。

相对地,应用程序则是在“用户空间”中运行。运行在用户空间的应用程序只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。

用户空间和内核空间置于这种非对称访问机制下有很好的安全性,能有效抵御恶意用户的窥探,也能防止质量低劣的用户程序的侵害,从而使系统运行得更稳定可靠。

 
来自 <http://baike.baidu.com/view/4271323.htm>
4.内核通过不同的接口将信息输出到用户空间,除了用于请求特定信息的系统调用(system
call)外,还有三个特殊接口:

procfs(/proc文件系统):这是一个虚拟文件系统,挂载在/proc目录下。允许内核以文件的形式向用户空间输出内部信息。这些文件并不实际存在于磁盘上,但可以通过cat或more以及‘>’shell重定向字符写入。也可以设置文件的访问权限。目录不能被写入,即用户不能把文件或目录添加到/proc中的任何目录或删除文件和目录。 

procfs不能编译成为一个模块。配置菜单中的相关内核选项为“Filesystems->pseudo filesystems->/proc file system support”
sysctl(/proc/sys目录): 此接口允许用户读取或修改内核变量的值。不能用此接口对每个内核变量进行操作:内核应明确指出哪些变量从此接口是可见的。从用户空间可以用两种方式访问sysctl输出的变量,一是sysctl系统调用,另一种是procfs。当内核支持procfs时,会在/proc中添加一个特殊目录(/proc/sys),为每个由sysctl所输出的内核变量引入一个文件。procfs包随附的sysctl命令可用于配置由sysctl接口输出的变量,此命令通过写入/proc/sys与内核通信。sysctl不能编译成为一个模块。内核配置选项为“General
setup –>sysctl support”。
sysfs:以非常干净而有组织的方式输出很多信息。由sysctl所输出的部分信息可以移植到sysfs上。配置菜单中的内核选项为“Filesystem->pseudo filesystems->sysfs filesystem support(NEW)”,只有想开启“General setup->Configure
standard kernel features(for small system)”选项后,才能看见上述选项。
ioctl系统调用:ioctl系统调用操作的对象时一个文件,通常用于实现特殊设备需要而标准文件系统没有提供的操作。
Netlink套接字:这是网络应用程序和内核通信时最新的首选机制。多数的网络内核功能都可以用Netlink或ioctl接口进行配置。

 
来自 <http://blog.chinaunix.net/uid-14518381-id-3408521.html>
7.普通文件、目录、字符设备文件、块设备文件、符号链接文件

 
来自 <http://zhidao.baidu.com/question/369379571149564084.html>
8.Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
一.Linux内核
内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等。
二.Linuxshell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。
三.Linux文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660。
四.Linux应用程序
标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、XWindow、办公套件、Internet工具和数据库等。

 
来自 <http://zhidao.baidu.com/link?url=NSoD5OrpywAYfNj24eMRP8oRprXvffvuMugeG56Nt0wA2coDTR2wuEInSyiOUkDQcl2bw8IB2VznpnhFSfXFzq>
11.Linux中I/O设备分为两类:块设备和字符设备。两种设备本身没有严格限制,但是,基于不同的功能进行了分类。

(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。

(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。

两种设备本身并没用严格的区分,主要是字符设备和块设备驱动程序提供的访问接口(fileI/O API)是不一样的。本文主要就数据接口、访问接口和设备注册方法对两种设备进行比较。

1、数据结构

1.1字符设备数据结构

structfile; 

        structinode;

file定义于<linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 文件结构代表一个打开的文件. 它由内核在 open 时创建,并传递给在文件上操作的任何函数, 直到最后的关闭. 在文件的所有实例都关闭后, 内核释放这个数据结构。

inode结构由内核在内部用来表示文件.inode 结构包含大量关于文件的信息其中dev_t i_rdev成员包含实际的设备编号.struct cdev*i_cdev中struct cdev 是内核的内部结构, 代表字符设备。

1.2块设备数据结构

struct gendisk(定义于 <linux/genhd.h>) 是单独一个磁盘驱动器的内核表示. 事实上, 内核还使用 gendisk 来表示分区。

2、设备访问接口

2.1字符设备访问接口

structfile_operations 其中file_operation 结构中的每个成员必须指向驱动中的函数, 这些函数实现一个特别的操作,或者对于不支持的操作留置为 NULL. 当指定为 NULL 指针时内核的确切的行为是每个函数不同的,该结构中主要函数如下:

ssize_tread(struct file *filp, char __user *buff, size_t count, loff_t *offp);

        ssize_twrite(struct file *filp, const char __user *buff, size_t count, loff_t *offp);

filp 是文件指针,count 是请求的传输数据大小. buff 参数指向持有被写入数据的缓存, 或者放入新数据的空缓存. 最后, offp是一个指针指向一个"long offset type"对象, 它指出用户正在存取的文件位置. 返回值是一个"signedsize type"。

2.2块设备访问接口

字符设备通过 file_操作结构使它们的操作对系统可用. 一个类似的结构用在块设备上; 它是 struct block_device_operations, 定义在<linux/fs.h>,其主要操作方法如下:

int(*open)(struct inode *inode, struct file *filp); 

        int(*release)(struct inode *inode, struct file *filp);

就像它们的字符驱动对等体一样工作的函数;无论何时设备被打开和关闭都调用它们. 一个字符驱动可能通过启动设备或者锁住门(为可移出的介质)来响应一个 open 调用. 如果你将介质锁入设备,你当然应当在 release 方法中解锁。

int(*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsignedlong arg);

实现 ioctl系统调用的方法. 但是, 块层首先解释大量的标准请求; 因此大部分的块驱动 ioctl 方法相当短。

3、设备注册

3.1字符设备注册

intregister_chrdev_region(dev_t first, unsigned int count, char *name) 

        intalloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count,char *name) 

        voidunregister_chrdev_region(dev_t first, unsigned int count);

允许驱动分配和释放设备编号的范围的函数.register_chrdev_region 应当用在事先知道需要的主编号时; 对于动态分配, 使用 alloc_chrdev_region 代替.

3.2块设备注册

intregister_blkdev(unsigned int major, const char *name); 

        intunregister_blkdev(unsigned int major, const char *name);

register_blkdev注册一个块驱动到内核, 并且, 可选地, 获得一个主编号. 一个驱动可被注销, 使用 unregister_blkdev。

 
来自 <http://blog.csdn.net/bonnshore/article/details/7860997>
12.一个完整的Linux内核一般由5部分组成,它们分别是内存管理、进程管理、进程间通信、虚拟文件系统和网络接口。
1、内存管理
内存管理主要完成的是如何合理有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配的请求。Linux内存管理支持虚拟内存,而多余出的这部分内存就是通过磁盘申请得到的,平时系统只把当前运行的程序块保留在内存中,其他程序块则保留在磁盘中。在内存紧缺时,内存管理负责在磁盘和内存间交换程序块。
2、进程管理
进程管理主要控制系统进程对CPU的访问。当需要某个进程运行时,由进程调度器根据基于优先级的调度算法启动新的进程。:Linux支持多任务运行,那么如何在一个单CPU上支持多任务呢?这个工作就是由进程调度管理来实现的。在系统运行时,每个进程都会分得一定的时间片,然后进程调度器根据时间片的不同,选择每个进程依次运行,例如当某个进程的时间片用完后,调度器会选择一个新的进程继续运行。由于切换的时间和频率都非常的快,由此用户感觉是多个程序在同时运行,而实际上,CPU在同一时间内只有一个进程在运行,这一切都是进程调度管理的结果。
3、进程间通信
进程间通信主要用于控制不同进程之间在用户空间的同步、数据共享和交换。由于不用的用户进程拥有不同的进程空间,因此进程间的通信要借助于内核的中转来实现。一般情况下,当一个进程等待硬件操作完成时,会被挂起。当硬件操作完成,进程被恢复执行,而协调这个过程的就是进程间的通信机制。
4、虚拟文件系统
Linux内核中的虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统,这个文件系统可以分为逻辑文件系统和设备驱动程序:逻辑文件系统指Linux所支持的文件系统,例如ext2、ext3和fat等;设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
5、网络接口
网络接口提供了对各种网络标准的实现和各种网络硬件的支持。网络接口一般分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序则主要负责与硬件设备进行通信,每一种可能的网络硬件设备都有相应的设备驱动程序。

 
来自 <http://zhidao.baidu.com/link?url=qdTpz5PaSOCEBSTYMCH3YQrjXP0msxdlOsdWG0Uwz-Lgexjz3gxkS4p1J9v5D9tw7p0jjhaoENtLSdQNHKU4Xt_lDQo1o1Psj8n7-GCAU9G
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息