| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
24400:(正如代码中描述的一样)出于安全性考虑,丢弃所有挂起的信号和信号句柄(handl-ers)。这里最重要的部分是对flush_signal_handlers的调用(28041行),它使用内核默认的信号句柄代替所有用户定义的信号句柄。如果在此时有信号被传送到内核,它将获得默认响应—通常是忽略信号或杀死进程。但是不管怎样都不会引起安全风险。由于该函数从触发它的进程中分离出来(如前所述),所以,不管原始进程在此处是否改变其原来分配的信号,句柄都不会产生任何影响。
24405:关闭调用进程打开的所有文件。最重要的是,这意味着modprobe程序不再从调用进程中继承标准输入输出和标准错误。这很有可能会引起安全漏洞(这可能是在替代modprobe的程序中引起的问题,但是modprobe本身实际上并不关心这个差异)。
24413:modprobe程序作为root运行,它拥有root所拥有的所有权限。和整个内核中其他地方一样,请注意root使用用户ID号0的假定在这里已经被写入程序。用户ID号和权能系统(capability system,在接下来的几行中会用到)将在第7章中介绍。 网管u家u.bitsCN.com
24421:试图执行modprobe程序。如果尝试失败,内核将使用printk打印错误消息并返回错误代码。这里是可能产生printk的缓冲器过载的地点之一。module_name的长度并没有明确限制,就我们对该调用的看法而言,它可能长达一百万个字符。为防止printk缓冲器过载,你必需遍历所有对于该函数的调用(实际上是对request_module的调用),以保证每个调用者使用足够短的、不会为printk造成麻烦的模块名。 网管论坛bbs_bitsCN_com
24427:当execve成功执行时,它不会返回任何结果,因此本处是不可能执行到的。但是编译器却并不知道这一点,因此,此处使用了return语句以保证gcc不出错。 网管u家u.bitsCN.com
对于内核的进一步讨论将超出本章的既定范围,因此在这个问题上我们到此为止。然而本书中也包括了其他必需的内核代码。在读完第4章和第5章之后,也许你会希望再次仔细研读一下这部分内容。有关这个问题的两个文件是include/linux/module.h(从15529行开始)和/kernel/module.c(从24476行开始)。和sys_create_module(24586行)、sys_init_module(24637行)、sys_delete_module(24860行)和sys_query_module(25148行)四个函数需要特别注意一样,struct module(15581行)也要特别引起注意。这些函数实现了modprobe及insmod、lsmod和rmmod所使用的系统调用,以完成模块的装载、定位和卸载。
内核触发直接回调内核程序的现象看起来很令人奇怪。但是,实际上进行的工作不止于此。例如,modprobe必须实际访问磁盘以搜寻要装载的模块。而且更为重要的一点是,这种方法赋予root对内核模块系统更多的控制能力。这主要是因为root也可以运行modprobe及相关程序。因此,root既可以手工装载、查询、卸载模块,也可以由内核自动完成。 网管u家u.bitsCN.com
2.3 配置与编译内核 网管下载dl.bitscn.com
你可能仅仅研读、欣赏而并不修改Linux内核源代码。但是,更普遍的情况是,用户有强烈的愿望去改进内核代码并完成相应的测试,这样我们就需要知道如何重建内核。本节就是要告诉你如何实现这一点,而最终则归结于如何把你所做的修改发行给别人,以使得每个人都能从你的工作中受益。 网管网www.bitscn.com
2.3.1 配置内核 中国网管论坛bbs.bitsCN.com
编译内核的第一步就是配置内核,这是增加或者减少对内核特性的支持及修改内核的一些特性的必要步骤。例如,你可以要求内核为自己的声卡指定一个不同的DMA通道。如果内核配置和你的需要相同,那么你可以直接跳过本节,否则请继续阅读以下内容。
为了完成内核的配置,请先切换到root用户,然后转入如下内核源程序目录: 网管联盟bitsCN@com
|
接着敲入如下命令组:
中国网管联盟bitsCN.com
网管联盟bitsCN_com
|
这三条命令都可以用来配置内核,但它们发挥作用的方式各不相同:
网管网www.bitscn.com
* make config—三种方法中最简单也是最枯燥的一种。但是最基本的一点是,它可以适应任何情况。通过为每一个内核支持的特性向用户提问的方式来决定在内核中需要包含哪些特性。对于大多数问题,你只要回答y(yes,把该特性编译进内核中)、m(作为模块编译)或者n(no,根本不对该特性提供支持)。在决定之前用户应该考虑清楚,因为这个过程是不可逆的。如果你在该过程中犯了错误,就只能按Ctrl+C退出。你也可以敲入?以获取帮助。图2-1显示了这种方法在X终端上运行的情况。
中国网管论坛bbs.bitsCN.com
图2-1 运行中的make config 网管网www_bitscn_com
幸运的是,这种方法还有一些智能。例如,如果你对SCSI支持回答no,那么系统就不会再询问你有关SCSI的细节问题了。而且你可以只按回车键以接受默认的选择,也就是当前的设置(因此,如果当前内核将对于SCSI的支持编译进了内核,在这个问题上按回车键就意味着继续把对SCSI的支持编译进内核中)。即使是这样,大部分用户还是宁愿使用另外的两种方法。
* make menuconfig—一种基于终端的配置机制,用户拥有通过移动光标来进行浏览等功能。图2-2显示了在X终端上运行的make menuconfig。虽然在控制台上显示的是彩色,但是在终端上的显示仍然相当单调。使用menuconfig必须要有相应的ncurses类库。 网管联盟bitsCN@com
* make xconfig—这是我最喜欢的一种配置方式。只有你能够在X server上用root用户身份运行X应用程序时,这种配置方式才可以使用(有些偏执的用户就不愿意使用这种方式)。你还必须拥有Tcl窗口系统,这实际上还意味着你必须拥有Tcl、Tk以及一个正在运行的X安装程序。作为补偿,用户获得的是更漂亮的、基于X系统的以及和menuconfig功能相同的配置方法。图2-3显示了在这种方法运行过程中打开“可装载模块支持(Loadable module support)”子窗口的情况。
网管论坛bbs_bitsCN_com
如上所述,这三种方法都实现了相同的功能:它们都生成在构建内核时使用的.config文件。而唯一的区别在于创建这个文件时的难易程度不同。
|
1
|
评论加载中…