技术问题Linux系统内核的32个模块,是做什么用的??
Code maturity level options 代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 General setup 常规设置 Local version - append to kernel release 在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到 Automatically append version information to the version string 自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持 Support for paging of anonymous memory (swap) 使用交换分区或者交换文件来做为虚拟内存 System V IPC System V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么 IPC Namespaces IPC命名空间支持,不确定可以不选 POSIX Message Queues POSIX消息队列,这是POSIX IPC中的一部分 BSD Process Accounting 将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息 BSD Process Accounting version 3 file format 使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式 Export task/process statistics through netlink 通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的 Enable per-task delay accounting 在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间 UTS Namespaces UTS名字空间支持,不确定可以不选 Auditing support 审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计 Enable system-call auditing support 支持对系统调用的审计 Kernel .config support 把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息 Enable access to .config through /proc/config.gz 允许通过/proc/config.gz访问内核的配置信息 Cpuset support 只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它 Kernel->user space relay support (formerly relayfs) 在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口 Initramfs source file(s) initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白 Optimize for size (Look out for broken compilers!) 编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码 Enable extended accounting over taskstats 收集额外的进程统计信息并通过taskstats接口发送到用户空间 Configure standard kernel features (for small systems) 配置标准的内核特性(为小型系统) Enable 16-bit UID system calls 允许对UID系统调用进行过时的16-bit包装 Sysctl syscall support 不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量 Load all symbols for debugging/kksymoops 装载所有的调试符号表信息,仅供调试时选择 Include all symbols in kallsyms 在kallsyms中包含内核知道的所有符号,内核将会增大300K Do an extra kallsyms pass 除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项 Support for hot-pluggable devices 支持热插拔设备,如usb与pc卡等,Udev也需要它 Enable support for printk 允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择 BUG() support 显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略 Enable ELF core dumps 内存转储支持,可以帮助调试ELF格式的程序 Enable full-sized data structures for core 在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能 Enable futex support 快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序 Enable eventpoll support 支持事件轮循的系统调用 Use full shmem filesystem 启用shmem支持.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多 Use full SLAB allocator 使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用 Enable VM event counters for /proc/vmstat 允许在/proc/vmstat中包含虚拟内存事件记数器 Loadable module support 可加载模块支持 Enable loadable module support 打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中 Module unloading 允许卸载已经加载的模块 Forced module unloading 允许强制卸载正在使用中的模块(比较危险) Module versioning support 允许使用其他内核版本的模块(可能会出问题) Source checksum for all modules 为所有的模块校验源码,如果你不是自己编写内核模块就不需要它 Automatic kernel module loading 让内核通过...
关于Linux操作系统内核有什么问题?
在内核的代码和驱动程序中经常见到ERR_PTR, IS_ERR, PTR_ERR这三个内联函数。
许多的内核函数需要返回一个指针,但是函数的调用可能失败,一般我们处理这样的情形都是返回一个NULL指针,就像malloc或kmalloc在没有获得指定的空间申请时的返回值一样。
但是有时我们想知道导致函数失败的原因,但是返回NULL就显得信息不够。
因此有些函数返回一个实际的错误编码以便对引起错误的原因做一些处理。
很多内核接口通过把错误值编码到一个指针值中来返回错误信息。
当处理这样的函数时,判断是否成功调用就不能是简单的和NULL进行比较。
为了方便使用这样的类型接口,2.6的内核在linuxe.h中实现了三个内联函数: inline void *ERR_PTR(long eo){etun (void *) eo;} 返回指针类型的函数可以通过这个函数来返回一个错误值。
这里的eo是通常的负的错误编码。
调用者可以使用IS_ERR来检查所返回的指针是否是一个错误编码。
inline long IS_ERR(const void *pt){etun (unsigned long)pt (unsigned long)-1000L;} 如果需要实际的错误编码,可以通过PTR_ERR函数提取inline long PTR_ERR(const void *pt){etun (long) pt;} 只有在IS_ERR返回真的时候才能使用PTR_ERR。
拿到了linux的内核 应该用什么软件 怎么去编译?
1、你可以把linux内核代码放到你的ubuntu或redhat之类的具有linux内核的操作系统里面,然后在你指定的目录里面解压你的内核源码;2、在主目录里面找到Makefile文件,修改里面的“ARCH = ”和“CROSS_COMPILE”,也就是你的编辑器路径,保存退出;3、输入make menuconfig配置你的内核参数,保存退出;4、执行make zImage,你会看见屏幕哗啦哗啦的在运行,这是在生成内核zImage文件;5、进入你的arch/(cpu型号)/root/里面,你会看到zImage文件,这个就是你要的。
以上是最简单的步骤,若想详细了解,在百度里面搜索“linux内核编译”,会得到一大堆结果,记得一般只看文库或者博客里面的文章,因为质量比较好。
若需帮助,请追问!
解读Linux操作系统内核源码有什么好方法?
针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制; 一.核心源程序的文件组织: 1.Linux核心源程序通常都安装在ussclinux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。
本文基于稳定的2.2.5源代码,第二部分的实现平台为 Redhat Linux 6.0。
2.核心源程序的文件按树形结构进行组织,在源程序树的最上层你会看到这样一些目录: ◆Ach :ach子目录包括了所有和体系结构相关的核心代码。
它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。
PC机一般都基于此目录; ◆Include: include子目录包括编译核心所需要的大部分头文件。
与平台无关的头文件在 includelinux子目录下,与 intel cpu相关的头文件在includeasm-i386子目录下,而includescsi目录则是有关scsi设备的头文件目录; ◆Init: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Vesion.c,这是研究核心如何工作的一个非常好的起点。
◆Mm :这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于ach*mm,例如achi386mmFault.c ◆Kenel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在ach*kenel中; ◆Dives: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,lock 下为块设备驱动程序,比如ide(ide.c)。
如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看 diveslockgenhd.c中的device_setup()。
它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络其他: 如, Li放置核心的库代码; Net,核心与网络相关的代码; Ipc,这个目录包含核心的进程间通讯的代码; Fs ,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2; Scipts, 此目录包含用于配置核心的脚本文件等。
一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解; 二.解读实战:为你的内核增加一个系统调用 虽然,Linux 的内核源码用树形结构组织得非常合理、科学,把功能相关联的文件都放在同一个子目录下,这样使得程序更具可读性。
然而,Linux 的内核源码实在是太大而且非常复杂,即便采用了很合理的文件组织方法,在不同目录下的文件之间还是有很多的关联,分析核心的一部分代码通常会要查看其它的几个相关的文件,而且可能这些文件还不在同一个子目录下。
体系的庞大复杂和文件之间关联的错综复杂,可能就是很多人对其望而生畏的主要原因。
当然,这种令人生畏的劳动所带来的回报也是非常令人着迷的:你不仅可以从中学到很多的计算机的底层的知识(如下面将讲到的系统的引导),体会到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙; 而且更重要的是:在源码的分析过程中,你就会被一点一点地、潜移默化地专业化;甚至,只要分析十分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。
为了使读者能更好的体会到这一特点,下面举了一个具体的内核分析实例,希望能通过这个实例,使读者对Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的分析方法。
如何在linux内核中操作文件?
#include #include #include #include #include #include #include #include #define MY_FILE "ootLogFile" chauf[128]; stuct file *file = NULL; static int __init init(void) { mm_segment_t old_fs; pintk("Hello, I'm the module that intends to wite messages to file.\n"); if(file == NULL) file = filp_open(MY_FILE, O_RDWR | O_APPEND | O_CREAT, 0644); if (IS_ERR(file)) { pintk("eo occued while opening file %s, exiting...\n", MY_FILE); etun 0; } spintf(uf,"%s", "The Messages."); old_fs = get_fs(); set_fs(KERNEL_DS); file-f_op-wite(file, (cha *)uf, sizeof(uf), &file-f_pos); set_fs(old_fs); etun 0; }
linux到底是内核还是操作系统
本身是内核,但是很多人又把这东西称作系统。
因为 Linux 内核和 GNU 项目的软件都是成套出现的。
所以作为经常一起出现的 GNU/Linux 发行版,就被人简称叫做了 Linux 。
但实际上是三步分:1、Linux 内核2、GNU 项目及其他项目的软件3、发行版制作者进行集成后发布的工作。
你光有 Linux 内核,是没办法使用的,没有软件也没有交互。
GNU 软件加进来还是不能用,因为这些软件都是按照源代码方式发布的,你需要把他们编译成计算机可以运行的二进制程序,而且还需要很多软件之间要做调配以及选择。
进行这些工作就是发行版制作者的工作。
至于异类,最常见的就是 Android ,他是 Linux 内核的,但是除了内核,其他运行的软件,基本都是 Google 自己的,而不是 GNU 项目的。
还有另一种异类就是如 Debian 的 GNU/Hurd 。
其实 Hurd 才是 GNU 项目自己的内核,但是太“先进”导致现在也没做出来,弄得 GNU 项目的人只好让自己的软件运行在 Linux 内核之上。
顺便吐槽一下 MAC OS 的内核和 GNU 的这个内核有点关联,但是 apple 弄出来了,GNU 项目自己反而永远搞不定一样。
linux内核是什么,有啥作用 ,
Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等,如果内核不认识某个最新的硬件,那么硬件也就无法被驱动,你也就无法使用该硬件。
计算机真正工作的东西其实是硬件,例如数值运算要使用到CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、连接Internet 可能需要网络卡等等。
内核就是控制这些芯片如何工作。
当然内核内部结构也是十分复杂的,下面这张图是内核各个模块之间的映射:
几个重要的linux内核文件
Linux是一个一体化内核(monolithic kernel)系统。
“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。
一个内核不是一套完整的操作系统。
一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
设备驱动程序可以完全访问硬件。
Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。
Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
版本号Linux内核使用三种不同的版本编号方式。
第一种方式用于1.0版本之前(包括1.0)。
第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。
第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。
只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。
可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。
C代表一些bug修复,安全更新,新特性和驱动的次数。
以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。
在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5,而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。
这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。
第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。
3.0版本之前,是一种“A.B.C.D”的格式。
七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。
3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。
第三种方式中不再使用偶数代表稳定版,奇数代表开发版这样的命名方式。
举个例子:3.7.0代表的不是开发版,而是稳定版!
Linux系统内核有待提高的领域有哪些呢?
1、虚拟化 认识到虚拟化在这十年里日益成为“大趋势”,Linux内核维护者把它作为优先考虑的功能,加快了虚拟化技术添加到内核的进程。
由初创公司Qumranet的Avi Kivity提供的KVM虚拟管理程序,就包含在2006年末发布的内核中并在上个月的发布中继续升级。
这个例子很好地展现了快速内核发布和缓慢企业版进展之间矛盾。
Novell公司的副总裁霍尔格?杜尔夫(Holger Dryoff)表示“我们认为KVM还不适合企业使用。
”他补充说,在KVM能被加到SUSE Linux之前,它需要在内核子系统包括调度器的交互上经过更多的测试。
最近被Citrix Systems耗费5千万美元收购的商业开源虚拟化公司XenSource,一直在游说想把自己架构的Xen虚拟机管理程序(Hypervisor)加入到内核里。
内核维护人员认为添加这种虚拟化功能会大大增加维护工作量。
最终XenSource的工程师放弃了,但仍继续调整Xen以配合内核的运行。
它暂时还进不了内核,只能先增加了一些支持,使Linux在运行虚拟环境时可以识别它。
其他的虚拟化功能发展迅速,包括KVM和Lguest。
Lguest是由IBM工程师Rusty Russell开发的一个只有5000行代码的精简hypervisor(虚拟机管理程序),它已经包括在最近版本的内核里了。
和KVM相似,它支持Intel和AMD芯片的最新虚拟化技术。
但又与VMware公司的ESX Server不同,在Lguest创建的虚拟机里的操作系统知道自己是被虚拟出来的。
所以在调用CPU周期时它可以直接向真正的硬件发出请求,而不是作为中间媒介而降低了效率,因此这种架构大大提高了效率。
2、实时操作 Linux在实时操作上获得了长足的提升,因为现在它常常被用作手机和其它设备上的嵌入式系统。
但最近发布的2.6.23内核显示它在实时操作上“稍有退步”,商业嵌入式Linux厂商MontaVista 的首席技术长官(CTO)和创始人吉姆?瑞尔迪(Jim Ready)抱怨说。
这个新的进程调度器更强调“公平”——这意味着要由最终用户告诉处理器哪些待处理的任务可以获得更高的优先级。
“实时用户不需要公平,”瑞尔迪认为,因为实时要求无论CPU在做什么,都可以插入一个新的优先级以中断操作。
一个简单的例子是,在医疗设备里监控病人呼吸的软件在发现病人呼吸停顿时,能发送一个即时警告,软件无论在处理什么任务都要先中断停下来。
瑞尔迪表示,除非实时性能有改善,否则MontaVista不会把新的内核整合到自己的产品中来。
Gartner分析师乔治?维斯(George Weiss)预测标准版的Linux要到2008年才能成为有竞争力的实时系统。
3、中断处理 维斯那样说其中一个原因是因为内核开发人员正致力于使进程调度器具有实时功能。
操作系统的关键环节是中断的管理——它决定了哪些任务能获得CPU的处理权,如何排列不同行为之间的优先级。
如果所有的中断处理器都可以被结合到自己的线程中去,那个线程就可以被调度并设置优先级,而不是无法预知地运行和延迟的实时响应。
过去三年来这样的努力一直没有停歇过。
MontaVista的斯文?托斯滕?迪特里奇(Sven-Thorsten Dietrich)在2004年就提交了代码,希望防止中断处理程序为了常规任务而中断内核,因为它们干扰了实时响应。
但这些代码的破坏性太大,以致无法获得内核调度领域的专家Ingo Molnar的认可。
这些代码影响了一个关键内核功能自旋锁(spinlock),当进程在等待需要的数据或事件时,它可以锁定CPU。
许多进程依赖于自旋锁。
Dietrich的代码把几百个自旋锁减少到30个;Molnar的修订保留了90个自旋锁,比前者破坏性要来得少些。
把中断处理器集合到一个统一的独立线程的想法看来已开始成熟并准备进入内核了。
“Ingo替换了我们的做法,但他做得很棒,” 瑞尔迪说道。
MontaVista并不在乎自己的努力是否能获得更多的荣誉,瑞尔迪理解这就是开源合作的方式,因此他接受正在进入内核的实时功能的修改。
4、安 全 人人都希望有个更安全的系统。
Novell在发布SUSE Linux Enterprise Server 10的同时一起发布了AppArmor,它是一个限定应用程序可以访问操作系统哪些资源的软件,这样可以限制应用因非法授权访问而造成的危害。
然而在近期内它还不太可能会被加进内核。
Linux安全的权威专家、另一套安全机制SELinux 的开发人员斯蒂芬?斯玛莱(Stephen Smalley)则认为AppArmor不能被加进内核是因为它的保护机制是基于“路径名称”的方式,它本质上就是一个白名单设置,AppArmor只允许应用程序访问在名单上的文件,所有其他的文件都不能访问了。
根据去年乔纳森?科贝特(Jonathan Corbet)的一份报告,斯玛莱认为一个狡猾的入侵者可以利用合法路径名称而猜出其他的名字,制造不必要的暴露。
内核维护人员安德鲁?莫顿同意是因为这种路径名机造成AppArmor不能进入内核的根本原因。
“我不是个安全程序员,”他说。
“我不知道可以怎样解决这个问题。
” 5、系统诊断 Solaris可以使用DTrace工具检测操作系统核心的运行状况,但Linux缺乏用户界面友好的检测工具。
目前仅有的几个工具之一是ptrace,该程序可以让一个进程跟踪另一个进程的行为。
但ptrace使用起来非常笨拙并容易发生错误,...
linux的内核版本表示是怎样的
1:什么是LINUX内核:Linux是一个一体化内核(monolithic kernel)系统。
“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。
一个内核不是一套完整的操作系统。
一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
设备驱动程序可以完全访问硬件。
Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载2:内核版本表示:Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字第一个组数字:目前发布的内核主版本。
第二个组数字:偶数表示稳定版本;奇数表示开发中版本。
第三个组数字:错误修补的次数
一年两次每次半年