添加系统调用(模块添加法2.6内核)
编译Linux2.6内核并添加一个系统调用
1. 0 让新 内核和 旧内核 都可 以加载 的配置 的步骤 :
my. r h i 8 / o t z ma e/ o t / c /3 6 b o / l g b o a b mv. y t m. p/ o t / s e ma b o S
mv/ o t zma e/o t mln z 261 ..5 3 b / l g b b / i u - ..510 0 v
2 1 年第 4期 0 1
福
建 电
脑
19 4
编 译 iu26内 并 添 加 一 个 系统调 用 Ln x . 核
张 伟 华 .王 海 英 。高 静
(河南 财经政 法 大学成 功 学院 河 南 郑 州 4 10 5 2 0)
【 摘 要 】 本 文 以实例 来详 细描 述 了从 准备 一直 到使 用新 内核 的 Lnx 。 : iu 26内核 编译过 程 , 然后介 绍 了
轻 易地 对它进 行修 改 .使 我们 能够 根据 自己的要 求 度 身 定制 一个更 高效 、 更稳 定 的 内核 。
系统调 用【 用户 进程 与 系统之 间 的接 口, 们在 2 ] 是 它 内核 中实 现 .其 主要 目的是 使得 用户 可 以使 用操 作 系 统提 供 的操作底 层设 备 的功 能 用 户 程序 肯定 要 操作
mv/ o t y tm. p/ o ' y t m. p 2 6 1 .. 5 b / se ma b oJ s e ma - .. 5 10 03 S , S mk n td/ o g n td 2.. 5 10 0 . 6.5 1 ii b r i i - 6 1 . . 5 3 i 2. 1 r mg v / o t rbgu e n ib / u / r b.o f g
北京邮电大学计算机学院 - 操作系统实验报告(含源代码)
1/58
10 年 12 月 19 日
内容目录
实验 1.3 Shell 编程...........................................................4 1、实验目的...............................................................4 2、实验内容...............................................................4 3、实验原理...............................................................4 4、实验步骤...............................................................4 5、实验结果:.............................................................4 6、人员任务分配...........................................................5
实验项目:
1. 实验 1.3 Shell 编程 2. 实验 2.3 内核模块 3. 实验 2.4 系统调用 4. 实验 3.3 Shell 编程实验(进程管理实验) 5. 实验 4.1 观察实验(存储管理实验) 6. 实验 5.1 观察实验(进程通信) 7. 实验 6.3 Io 系统编程实验 8. 实验 6.4 设备驱动程序 9. 实验 7.1 代码分析(文件系统管理实验)
实验 3.3 Shell 编程实验(进程管理实验)......................................18 1、实验目的..............................................................18 2、实验内容..............................................................18 3、实验原理..............................................................18 4、实验步骤..............................................................18 5、实验结果及分析........................................................19 6、人员任务分配..........................................................19 2、实验内容 2............................................................20 3、实验原理..............................................................20 4、实验步骤..............................................................20 5、实验结果及分析........................................................23 6、人员分配..............................................................24
内核复习提纲
⏹内核空间◆对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。
这种系统态和被保护起来的内存空间,统称为内核空间。
⏹用户空间◆应用程序在用户空间执行。
它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,还有其他一些使用限制。
当内核运行的时候,系统以内核态进入内核空间,相反,普通用户程序以用户态进入用户空间⏹进程上下文◆当一个应用程序请求执行一条系统调用,我们说内核正在代其执行。
进一步解释,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。
这种交互关系——应用程序通过系统调用陷入内核——是应用程序完成其工作的基本行为方式。
⏹中断上下文◆许多操作系统的中断服务程序都不在进程上下文中执行。
它们在一个与所有进程都无关的、专门的中断上下文中运行。
◆这些上下文代表着内核活动的范围。
概括为下列三者之一:☐运行于内核空间,处于进程上下文,代表某个特定的进程执行。
☐运行干内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。
☐运行于用户空间,执行用户进程。
配置编译内核:$ tar zxvf linux-4.4.19.tar.gz在编译内核之前,首先你必须配置它。
由于内核提供了数不胜数的功能,支持了难以计数的硬件,因而有许多东西需要配置。
这些配置项要么是二选一,要么是三选一。
配置选项也可以是字符串或整数。
⏹内核提供了各种不同的工具来简化内核配置。
◆最简单的一种是一个基于文本的命令行工具:$make config☐该工具会挨个遍历所有配置项,要求用户选择yes、no或是module(如果是三选一的话)。
◆用基于ncurse库的图形界面工具:$make menuconfig◆用基于x11的图形工具:$make xconfig◆用基于gtk+图形工具:$make gconfig编译内核:配置完成后保存$ make -j2 V=1编译完后得到linux内核: arch/arm/boot/zImage内核开发的特点:◆内核编程时不能访问C库。
linux module的用法
linux module的用法
Linux模块是一种可以动态加载到Linux内核中以扩展其功能的软件组件。
它们通常用于添加新的驱动程序、文件系统或其他内核功能。
下面我将从多个角度来介绍Linux模块的用法。
首先,要编写一个Linux模块,你需要具备一定的C语言编程知识。
一个基本的Linux模块包括初始化函数和清理函数。
初始化函数在模块加载时被调用,而清理函数在模块被卸载时被调用。
你需要使用特定的宏和数据结构来定义模块的初始化和清理函数,以及模块的许可证和作者信息。
其次,编译模块需要使用Linux内核源代码中的构建系统。
你需要确保已经安装了正确版本的内核头文件和构建工具。
然后,你可以编写一个Makefile来编译你的模块。
在Makefile中,你需要指定内核源代码的路径,并使用特定的命令来编译模块。
一旦你编译好了你的模块,你可以使用insmod命令将其加载到内核中。
加载模块后,你可以使用lsmod命令来查看已加载的模块列表。
你还可以使用modinfo命令来查看模块的信息,包括作者、描述和许可证等。
当你不再需要模块时,你可以使用rmmod命令将其从内核中卸载。
卸载模块后,你可以使用dmesg命令来查看内核日志,以确保
模块已经成功卸载。
总的来说,Linux模块的用法涉及到编写模块代码、编译模块、加载模块以及卸载模块等步骤。
掌握了这些基本的用法,你就可以
开始开发自己的Linux内核模块了。
希望这些信息能够帮助你更好
地理解Linux模块的用法。
Linux内核中系统调用详解
Linux内核中系统调用详解什么是系统调用?(Linux)内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。
用户可以通过系统调用命令在自己的应用程序中调用它们。
从某种角度来看,系统调用和普通的函数调用非常相似。
区别仅仅在于,系统调用由(操作系统)核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
随Linux核心还提供了一些(C语言)函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。
为什么要用系统调用?实际上,很多已经被我们习以为常的C语言标准函数,在Linux 平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。
进一步,若想成为一名Linux下(编程)高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。
即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。
系统调用是怎么工作的?一般的,进程是不能访问内核的。
它不能访问内核所占内存空间也不能调用内核函数。
(CPU)(硬件)决定了这些(这就是为什么它被称作"保护模式")。
系统调用是这些规则的一个例外。
其原理是进程先用适当的值填充(寄存器),然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。
在(Intel)CPU中,这个由中断0x80实现。
硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。
进程可以跳转到的内核位置叫做sysem_call。
这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。
然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。
计算机操作系统实验指导计算机系统调用
使用内核编译法添加系统调用
为了验证系统调用是否成功,编写验证代码如下。 #include <stdio.h> #include <linux/kernel.h> #include <sys/syscall.h> #include <unistd.h> int main() { long int a = syscall(三三三); printf("System call sys_helloworld reutrn %ld\n", a); return 0; }
如图地执行结果,我们得到sys_call_table地址:ffffffffabe00一a0 三. 编写Makefile文件,可参考实验指导书地内容。 四. 编译并装入模块 # sudo make //编译 # sudo insmod hello.ko //装入模块 # lsmod //该命令查看所有模块,用以检查hello是否被装入系统 # sudo rmmod hello.ko //卸载模块
三三三 六四 helloworld
sys_helloworld
使用内核编译法添加系统调用
六. 配置内核 # cd /usr/src/linux-四.一六.一0 # sudo make mrproper # sudo make clean # sudo make menuconfig 七. 编译与安装内核(与第七章类似) # sudo make -j八 # sudo make modules -j八 # sudo make modules_install # sudo make install 八. 重启系统 # uname -r 查看此时地内核版本
编译验证代码: # gcc hello.c
系统调用模块
系统调用模块
系统调用模块是指操作系统提供给应用程序调用的接口。
它允许应用程序直接访问操作系统的底层功能,如文件操作、进程管理、网络通信等。
在大多数操作系统中,系统调用由操作系统内核提供,并且通常以函数的形式提供给应用程序。
应用程序可以通过调用系统调用函数来请求操作系统执行特定的操作。
系统调用函数会将参数传递给操作系统内核,内核根据参数执行相应的操作,并将结果返回给应用程序。
系统调用模块通常包含以下几个方面的功能:
1. 进程管理:包括创建进程、销毁进程、进程间通信等。
2. 文件操作:包括打开文件、关闭文件、读写文件等。
3. 内存管理:包括分配内存、释放内存、内存共享等。
4. 网络通信:包括建立网络连接、发送和接收数据等。
5. 设备管理:包括打开设备、关闭设备、读写设备等。
系统调用模块是操作系统和应用程序之间的重要接口,它使应用程序能够利用操作系统提供的底层功能,实现更复杂的操作和功能。
对于开发者来说,熟悉系统调用模块的使用可以帮助
他们更好地管理和控制系统资源,提高应用程序的性能和稳定性。
linux2.6内核compat_ioctl函数
linux2.6内核compat_ioctl函数⼀、内核原型(linux2.6.28-7)long (*compat_ioctl)(struct tty_struct *tty, struct file * file,unsigned int cmd, unsigned long arg);implement ioctl processing for 32 bit process on 64 bit systemOptional⼆、What is compat_ioctlThere is one more method called as "compat_ioctl()" that a 64 bit driver has to implement. It gets called when 64 bit kernel gets ioctl() call from 32 bit user.Tasks to be done by compat_ioctl() :1. Acquire BKL, since kernel calls compat_ioctl without BKL.2. 32 to 64 bit conversion for long and pointer objects passed by user3. Process input data, get results.4. 64 to 32 bit conversion in order to pass the output data back to user5. Release BKL三、中⽂档案Linux 64Bit 下的 ioctl和compat_ioctl ioctl32 Unknown cmd fd前段时间将我们的程序移植到Mips64的 2.6环境下,做可⾏性试验。
由于⽤户态程程序规模太⼤,⽽且之前没有对64bit的情况做考虑,所以,⽤户态程序任然使⽤32位模式编译,内核运⾏在64bit。
ubuntu系统调用
首先在终端执行sudo apt-get install nautilus-open-terminalsudo apt-get install nautilus-gksu然后就可以右键在终端打开和右键以管理员打开文件了,如果习惯用终端打开文件的话也可以跳过这一步同时建议使用VMWare的童鞋安装VMWare tools以便在宿主机与虚拟机之间复制数据中途如果出现以下错误greb: /boot/config-XX.XX.XX : no such file or directory请无视,没什么影响进行下面的操作前可以先执行sudo su获取权限1、下载内核apt-get install linux-source我下载到的内核文件是linux-source-2.6.35.tar.bz2,在/usr/src下2、解压内核cd /usr/srctar -jxvf linux-source-2.6.35.tar.bz2将内核解压到/usr/src3、修改文件a)/usr/src/linux-source-2.6.35/kernel/sys.c可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/kernel/sys.c然后简单起见按照第一篇文章的函数修改sys.c文件在文件最后添加asmlinkage int sys_mycall(int number){printk("这是我添加的第一个系统调用");return number;}asmlinkage int sys_addtotal(int number){int i=0,enddate=0;printk("这是我添加的第二个系统调用");while(i<=number)enddate+=i++;return enddate;}asmlinkage int sys_three(){printk("这是我添加的第三个系统调用");return 0;}b)/usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/arch/x86/kernel/syscall_table_32.S然后在一列.long sys_XXXX的下一行添加.long sys_mycall.long sys_addtotal.long sys_three并记住他们分别是第几个.long sys_XXXXc)/usr/src/linux-source-2.6.35/arch/x86/include/asm/unistd_32.h可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/arch/x86/include/asm/unistd_32.h在一列#define __NR_XXXX NNN后添加几行#define __NR_mycall 338#define __NR_addtotal 339#define __NR_three 340注意后面那个数字是接着上面那几行下来的d)/usr/src/linux-source-2.6.35/ubuntu/omnibook/Makefile这个是教程里面没有的,不一定要改,如果在后面编译模块时出现ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory make[2]: *** [ubuntu/omnibook/omnibook.o] Error 1make[1]: *** [ubuntu/omnibook] Error 2make: *** [ubuntu] Error 2以上错误,则需要修改,不过我建议还是先改了再说可以用右键管理员打开或者gedit /usr/src/linux-source-2.6.35/ubuntu/omnibook/Makefile找到下面两行#EXTRA_LDFLAGS += $(src)/sections.ldsEXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds调换一下‘#’的位置,如下EXTRA_LDFLAGS += $(src)/sections.lds#EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds4、编译内核这里也是按照教程,首先进入解压目录cd /usr/src/linux-source-2.6.35a)make mrproper //清除内核中不稳定的目标文件,附属文件及内核配置文件b)make clean //清除以前生成的目标文件和其他文件c)make oldconfig// 采用默认的内核配置,如果这里出现选项,选择默认的选项,就是方括号内的第一个字母,不过我这里没出现选项d)make bzImage //编译内核,大概需要半小时e)make modules //编译模块,大概需要两小时,如果出现错误,看看是不是因为上面的第3步的d)没做f)make modules_install// 安装模块,比较快5、复制内核首先查看一下编译好的内核版本,以便命名打开/lib/modules里面应该多了一个纯数字不带"generic"的文件夹,那就是新内核版本号,我的是2.6.35.11 然后复制内核cp /usr/src/linux-source-2.6.35/arch/i386/boot/bzImage /boot/vmlinuz-2.6.35.11-mykernel6、创建initrd文件在创建之前先安装必要的程序apt-get install bootcd-mkinitramfsmkinitramfs -o /boot/initrd.img-2.6.35.11耐心等待创建完成7、更新配置GRUB引导列表可以用右键管理员打开/boot/grub/grub.cfg或者gedit /boot/grub/grub.cfg找到下面这种结构menuentry 'Ubuntu, with Linux 2.6.35-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2linux /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splashinitrd /boot/initrd.img-2.6.35-27-generic}menuentry 'Ubuntu, with Linux 2.6.35-27-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2echo 'Loading Linux 2.6.35-27-generic ...'linux /boot/vmlinuz-2.6.35-27-generic root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro singleecho 'Loading initial ramdisk ...'initrd /boot/initrd.img-2.6.35-27-generic}复制一份在这些结构前粘贴,注意必须贴在### BEGIN /etc/grub.d/10_linux ###……### END /etc/grub.d/10_linux ###里面,并将粘贴出来的结构中的linux /boot/vmlinuz-2.6.35-27-genericinitrd /boot/initrd.img-2.6.35-27-generic改成你的内核文件地址和initrd文件地址linux /boot/vmlinuz-2.6.35.11-mykernelinitrd /boot/initrd.img-2.6.35.11最好把其他所有版本相关信息号改成2.6.35.11(新编译的版本号),以便在Grub菜单选择比如改成menuentry 'Ubuntu, with Linux 2.6.35.11' --class ubuntu --class gnu-linux --class gnu --class os { recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2linux /boot/vmlinuz-2.6.35.11-mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro quiet splashinitrd /boot/initrd.img-2.6.35.11}menuentry 'Ubuntu, with Linux 2.6.35.11 (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd1,msdos1)'search --no-floppy --fs-uuid --set 71a50d19-caef-4dff-9a7a-57cb1bbfe0c2echo 'Loading Linux 2.6.35.11 ...'linux /boot/vmlinuz-2.6.35.11-mykernel root=UUID=71a50d19-caef-4dff-9a7a-57cb1bbfe0c2 ro singleecho 'Loading initial ramdisk ...'initrd /boot/initrd.img-2.6.35.11}注意检查一下/boot/目录下是否存在上面这两个文件,如果没有,证明上面的几部还没成功还有就是这些menuentry的顺序,有些系统启动引导时会直接进入第一个menuentry,如果第一个menuentry不是你想进的内核,则需要在开机时按Shift进入GRUB引导菜单选择内核。
2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义
BUG报告,切磋与探讨由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。
如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。
如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。
联系方式:MSN: csfrank122@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 IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是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 NamespacesUTS名字空间支持,不确定可以不选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中包含内核知道的所有符号,内核将会增大300KDo 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来代替ramfs.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让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)Deadline I/O scheduler使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占Voluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APM AC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备) PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSI PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain 中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos"MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NAT子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support。
Linux+26内核O1调度算法剖析
.8.韶关学院学报·自然科学2009年if(unlikely(next一>pfio!=new_prio)){dequeue_task(next,array);next一>pfio=new_pfio;enqueuetask(next,array);)elserequeue_task(next,array);.首先,要在活动数组中的索引位图里找到第一个被设置的优先级位,这里通过sched_find_first_bit函数来实现.如前所述.该函数通过汇编指令从进程优先级由高到低的方向找到第一个为1的位置idx.因为优先级的个数是个定值,所以查找时间恒定,并不受系统到底有多少可执行进程的影响.这是Linux2.6内核实现O(1)调度算法的关键之一【21.此外,Linux对它支持的每一种体系结构都提供了对应的快速查找算法,以保证对位图的快速查找[3].很多体系结构提供了find—first—set指令,这条指令对指定的字操作(在Intelx86体系结构上,这条指令叫做bsfl.在IBMPPC上。
cntlzw用于此目的).在这些系统上,找到第一个要设置的位所花的时间至多是执行这条指令的两倍,这也在很大程度上提高了调度算法的效率.sched_find_first_bit函数找到第一个被设置的优先级位后,再找到该优先级对应的可运行进程队列,接着找到该队列中的第一个进程,最后把找到的进程插入运行队列中.整个过程如下图2所示.图20【1)调度算法找到候选进程的过程图2中的网格为140位索引位图,queue[7]为优先级为7的就绪进程链表.if(1ikely(1:Irev!=next))fprey=context_switch(rq,prey,next);)elsespin_unlockjrq(&rq->lock);.如果候选进程不是当前运行进程,则需要进行进程切换.反之,仅仅释放之前对运行队列所加的锁.2.5.2时间片的计算方法与时机Linux2.4内核在所有就绪进程的时间片都耗完后再在调度器中~次性重算.重算是用for循环实现的,相当耗时.新的Unux调度程序减少了对循环的依赖。
嵌入式系统中Linux2.6内核的应用
许昌
4 10 ) 6 0 0
要】 在分析 Ln x . iu26内核新特性的基 础上, ¥ C 4 0开发板上移植 了 26内核和新 的文件 系统, 在 3 21 . 并成功地对 H.6 24编解码 多媒体 系
统提 供 了 支持 。
【 关键词】iu Ln x内核; 嵌入 式系统 ¥C2 1 3 40
随 着 多 媒 体 技 术 与 通 讯 技 术 相 结 合 的 信 息 技 术 的 快 速 发 展 和 互 ( 个 内 核 线 程 对 应 一 个 用 户 线 程 ) 一 ,包 括 内 核 对 新 的 N T (aie PLNt v 联 网的 广 泛应 用 ,c 时 代 也 过 渡 到 了后 P P c时 代 。 嵌 入 式 技 术 越 来 越 P SX T ra igLbay的 支 持 , 是 对 以 前 内 核 线 程 方 法 的 明 显 改 O I hedn irr1 这 与 人 们 的生 活 紧密 结 合 。 进 。 26 内 核 同 时 还 提 供 P SX s nl . O I i as和 P SX h小 一eouin g O I i rslt o Ln x操 作 系 统 是 一种 性 能 优 良 、源码 公 开 且 被 广 泛 应 用 的 免 费 t r。P SXsgas 会 丢 失, 且 可 以携 带 线 程 间或 处 理 器 间 的通 iu i s O I n l不 me i 并 操作系统, 由于 其 体积 小 、 裁 减 、 行 速 度 高 、 可 运 良好 的 网 络 性 能 等 优 信 信 息 。嵌 入 式 系统 要 求 系统 按时 间表 执 行 任 务 .O I ie 可 以 提 P SX t r m 点 , 以作 为 嵌 入 式 操作 系统 。 可 供 1Hz 触 发 器使 这一 切 变 得 简 单, 而可 以有 效 地 控 制进 度 。 k 的 从 Ln x的低 成 本 和 开 放 性 ,为 其 在 嵌 入 式 系 统 领 域 的应 用 营造 了 iu 1 . 控 制 器 的 支 持 Ln x. 核 加 入 了 多 种 微 控 制 器 的 支 5微 iu26内 肥 沃 的 土壤 。本 文 着 重 介 绍 Ln x26内 核 的新 特性 及 其 嵌 入式 应 用 持 。而 且 已经 将 其 整 合 进 了 新 的 内核 中, 始 支 持 多种 流 行 的无 MMU iu . 开 中 的优 势 , 将其 移植 到 嵌 入 式 平 台 中, 功 支 持 H2 4编 解 码 多 媒 体 微控 制 器 , 旧支 持 多 任务 处 理 , 没 有 内 存 保 护 功 能 。 同 时也 加 入 了 并 成 .6 仍 但 系统 。 许 多 流 行 的控 制 器 的 支持 , ¥ C 4 0等 。 如 32 1
系统调用的实现原理【转】
系统调⽤的实现原理【转】在看《unix/linux编程实践教程》时,忽然意识到,系统调⽤是如何实现的?在实际编程中,往往是调⽤相关的函数,⽐如open(),read()等等。
但是调⽤这些函数怎么可能让程序的运⾏在⽤户空间和内核空间切换呢?看了下⾯的⽂章,才知道怎么回事。
让我想到了《计算机组成原理》中讲到的东西。
原⽂地址:系统调⽤1什么是系统调⽤系统调⽤,顾名思义,说的是操作系统提供给⽤户程序调⽤的⼀组“特殊”接⼝。
⽤户程序可以通过这组“特殊”接⼝来获得操作系统内核提供的服务,⽐如⽤户可以通过⽂件系统相关的调⽤请求系统打开⽂件、关闭⽂件或读写⽂件,可以通过时钟相关的系统调⽤获得系统时间或设置定时器等。
从逻辑上来说,系统调⽤可被看成是⼀个内核与⽤户空间程序交互的接⼝——它好⽐⼀个中间⼈,把⽤户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给⽤户空间。
系统服务之所以需要通过系统调⽤来提供给⽤户空间的根本原因是为了对系统进⾏“保护”,因为我们知道Linux的运⾏空间分为内核空间与⽤户空间,它们各⾃运⾏在不同的级别中,逻辑上相互隔离。
所以⽤户进程在通常情况下不允许访问内核数据,也⽆法使⽤内核函数,它们只能在⽤户空间操作⽤户数据,调⽤⽤户空间函数。
⽐如我们熟悉的“hello world”程序(执⾏时)就是标准的⽤户空间进程,它使⽤的打印函数printf就属于⽤户空间函数,打印的字符“hello word”字符串也属于⽤户空间数据。
但是很多情况下,⽤户进程需要获得系统服务(调⽤系统程序),这时就必须利⽤系统提供给⽤户的“特殊接⼝”——系统调⽤了,它的特殊性主要在于规定了⽤户进程进⼊内核的具体位置;换句话说,⽤户访问内核的路径是事先规定好的,只能从规定位置进⼊内核,⽽不准许肆意跳⼊内核。
有了这样的陷⼊内核的统⼀访问路径限制才能保证内核安全⽆虞。
我们可以形象地描述这种机制:作为⼀个游客,你可以买票要求进⼊野⽣动物园,但你必须⽼⽼实实地坐在观光车上,按照规定的路线观光游览。
Linux系统调用_详细全过程
system_call片段(续) system_call片段(续)
nobadsys:
… #调用系统调 call *sys_call_table(,%eax,4) #调用系统调 用表中调用号为eax 用表中调用号为eax的系统调用例程 eax的系统调用例程 #将返回值存入堆栈 堆栈中 movl %eax,EAX(%esp) #将返回值存入堆栈中 Jmp ret_from_sys_call
优点
编程容易, 编程容易,从硬件设备的低级编程中解脱出来 提高了系统的安全性, 提高了系统的安全性,可以先检查请求的正确性
5.1 Linux系统调用-功能 系统调用系统调用
用户程序 . . . . 系统调用 . . . .
陷入处理机构 1)保护处理 机现场 2)取系统调 用功能号并 寻找子程序 入口 3)恢复处理 机现场并返 回 入口地址表 A0 A2 ... Ai ... An
系统调用 服务例程
system_call()片段 system_call()片段
…
pushl %eax /*将系统调用号压栈* /*将系统调用号压栈*/ SAVE_ALL ... /*检查系统调用号 cmpl$(NR_syscalls), %eax /*检查系统调用号 Jb nobadsys $(/*堆栈中的eax eax设置为Movl $(-ENOSYS), 24(%esp) /*堆栈中的eax设置为ENOSYS, ENOSYS, 作为返回值 Jmp ret_from_sys_call
Linux系统调用-功能 系统调用系统调用
系统调用是用户态进入内核态的唯一入口:一夫 系统调用是用户态进入内核态的唯一入口: 当关,万夫莫开。常用系统调用: 当关,万夫莫开。常用系统调用:
Linux 2.6.19.x内核编译配置选项简介(1)
Linux 2.6.19.x内核编译配置选项简介(1)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 IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是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 NamespacesUTS名字空间支持,不确定可以不选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中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Support for hot-pluggable devices支持热插拔设备,如usb与pc卡等,Udev也需要它Enable support for printk允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择BUG() support显示故障和失败条件(BUG和W ARN),禁用它将可能导致隐含的错误被忽略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让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace 程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler适用于大多数环境,但不太合适数据库应用Deadline I/O scheduler通常与Anticipatory相当,但更简洁小巧,更适合于数据库应用CFQ I/O scheduler为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占V oluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU 有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS 还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APMAC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD 的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备)PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)充许设备通过PCI总线写入内存堆栈产生一个中断而不是使用默认的IRQ中断,建议不选PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了。
linux实验_添加内核模块-完整版本
添加内核模块1.编写helloworld模块,了解模块的编程方法。
首先编写一个helloworld程序,如下图:图1 HelloWorld模块测试c程序两个头文件linux/module.h和linux/init.h是编写模块所必需的;程序里面有两个函数,第一个函数moduletest_init实现模块加载时的动作,第二个函数moduletest_exit实现模块卸载是的动作。
两个函数的函数名可以任意指定。
module_init和module_exit是两个宏,括号里的函数名才是真正的模块加载和卸载时要执行的函数,即不管上面的两个函数的函数名是什么,只要经过这两个宏的指定,就会称为模块加载和卸载时运行的函数。
最后一句表示模块遵循公共许可证,一般来说都要加上,不加会出现警告。
然后编译内核模块。
⑴编写Makefile文件;在与源文件同目录下,新建文件名为Makefile,注意M要大写。
编辑Makefile文件,添加以下内容并保存,如图:图2 helloworld模块的Makefile文件⑵编译内核模块;打开终端,进入当前所在的目录。
执行命令 make命令成功执行后,会在当前目录下生成许多文件,HelloWorld.o HelloWorld.ko HelloWorld.mod.o HelloWorld.mod.c Modules.symvers 其中,HelloWorld.ko是我们要加载的模块。
最后加载和卸载模块:终端在当前目录下,输入命令 insmod ./HelloWorld.ko;输入命令lsmod,能找到名为HelloWorld的模块,说明模块已经加载;输入命令dmesg,查看最后一行,会有模块加载时调用的函数输出;输入命令rmmod HelloWorld ,卸载模块(注意与加载时不同),然后输入lsmod,已经找不到HelloWorld模块,说明模块已经卸载;输入命令dmesg,查看模块卸载是调用的函数输出。
linux应用层调用内核接口函数的实现方法
在Linux操作系统中,应用层调用内核接口函数主要有以下几种方法:
1. 系统调用(System Call):系统调用是应用程序请求内核服务的一种方式,它是应用程序与操作系统内核之间通信的桥梁。
通过系统调用,应用程序可以访问内核提供的各种服务,例如文件操作、进程控制、网络通信等。
2. 库函数(Library Function):库函数是应用程序可以直接调用的函数,这些函数通常是由C标准库提供的。
库函数在实现时通常会使用系统调用来与内核交互,因此实际上是通过库函数间接地调用了内核接口函数。
3. 设备驱动程序(Device Driver):设备驱动程序是内核的一部分,它负责管理硬件设备。
应用程序可以通过设备驱动程序来访问硬件设备,实现与硬件的交互。
设备驱动程序通常通过系统调用来与应用程序通信。
4. 套接字(Socket):套接字是一种通信机制,用于应用程序之间的通信。
通过套接字,应用程序可以与其他应用程序或远程主机进行通信。
套接字在实现时通常会使用系统调用来与内核通信,因此也可以视为一种间接调用内核接口函数的方式。
无论哪种方法,都需要使用系统调用接口来实现应用程序与内核之间的通信。
系统调用接口提供了一组函数,例如`syscall()`、`access()`、
`mmap()`等,应用程序可以通过这些函数来发起系统调用,请求内核服务。
在内核中,相应的服务会被实现为内核函数,这些函数可以访问内核的数据结构和资源,以完成相应的操作。
嵌入式Linux2_6内核的CAN驱动设计与实现
33962010,31(15)计算机工程与设计Computer Engineering and Design0引言在嵌入式领域中,Linux2.6内核除了提高其实时性能,系统地移植更加方便,同时添加了新的体系结构和处理类型,可以支持大容量内存模型、微控制器,同时,还自带了很多总线驱动程序,虽然Linux 并非一个真正的实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域中大展身手[1]。
CAN (controller area network )是一种有效支持分布式控制或实时控制的串行通信网络,CAN 协议的最大特点是数据块的标识码可由11位或29位二进制数组成,可定义211或219个不同的数据块,使得CAN 总线构成的网络节点的数据通信实时性更强,提高了系统的可靠性和灵活性[2]。
传统的嵌入式系统CAN 总线驱动设计是基于嵌入式Linux2.4内核,本文着重研究和实现了在嵌入式Linux2.6内核的S3C2410开发板上使用Linux2.6自带的SPI 驱动实现CAN 总线的开发,并详细分析了在嵌入式Linux2.6.24内核下加载和声明SPI 总线的具体步骤,CAN 总线驱动初始化和中断控制的设计方法,以及CAN 驱动加载步骤。
1系统硬件设计系统硬件设计主要由微处理器S3C2410、带SPI 接口的独立CAN 控制器MCP2510与高速CAN 收发器TJA1050等器件组成[3]。
1.1芯片介绍(1)S3C2410:S3C2410是一款为手持设备和一般类型应用提供的一款高性能、低功耗、低价格微处理器。
内部采用高级微控制总线(AMBA )体系结构,主频高达203MHz ,集成3通道UART ,4通道DMA ,2通道的SPI [4]。
(2)MCP2510:MCP2510完全支持CAN 总线V2.0A/B 技术规范,能够发送和接收标准和扩展报文,同时具备验收过滤以及报文管理功能。
内核调用用户态函数
内核调用用户态函数内核是操作系统的核心,它负责管理系统资源、提供系统调用接口、执行进程调度等任务。
而用户态是指应用程序执行时所处的环境,它运行在内核之外,通过系统调用等方式与内核交互。
本文将介绍在内核中如何调用用户态函数。
1. 概述内核与用户态之间有明显的边界,内核无法直接访问用户态的数据和函数。
因此,如果在内核中需要调用用户态函数,需要考虑安全性及通过系统调用等方式进行。
2. 通过系统调用调用用户态函数系统调用是内核提供给用户态的接口之一,它允许用户态程序请求内核进行特权操作或获取系统资源。
在内核中,通过系统调用方式调用用户态函数可以保证安全。
具体的操作步骤如下:(1)用户态程序在需要被内核调用的函数前添加系统调用号,例如:```c #define SYS_FUNC 333 ```(2)用户态程序在需要被内核调用的函数前添加系统调用定义,例如:```c long sys_func(int arg1, int arg2) { // 函数 body return 0; } ```(3)在内核中,通过系统调用方式调用用户态函数,例如:```c static int __init my_init(void) { long ret = 0; ret = sys_call(SYS_FUNC, arg1, arg2); return 0; } ```(4)内核中定义系统调用函数,具体实现与平台有关,例如:```c asmlinkage long sys_call(int nr, ...){ // 系统调用函数 body return 0; } ```通过以上步骤即可在内核中成功调用用户态函数。
需要注意的是,在调用用户态函数时需要保证安全,例如对用户态传入的参数进行检查。
3. 通过 kprobes 调用用户态函数kprobes 是 Linux 内核中的一种轻量级跟踪和调试工具,它可以在运行时动态地在指定的内核函数或指令处插入探针,并执行自定义的处理函数。
58064《计算机操作系统实验指导》实验思考解答.docx[5页]
《计算机操作系统实验指导》(Linux版)(附微课视频)实验思考解答第1章操作系统实验体系介绍第1章无实验思考。
第2章实验环境的搭建与使用1. 实验2.1 Linux常用命令的使用(1)在Linux 中,图形界面与终端控制台以及各终端控制台之间在如何切换?使用ALT+F1~ALT+F6进行各终端控制台切换2. 实验2.2 Linux下C程序的编写(1)make 工具的编译原理是什么?make 是一个命令工具,它解释 Makefile 中的指令(规则)。
在 Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。
在执行 make 之前,需要一个命名为Makefile 的特殊文件(本文的后续将使用Makefile 作为这个特殊文件的文件名)来告诉 make 需要做什么(完成什么任务),该怎么做。
(2)如何直接使用gcc 命令完成myapp.c、greeting.h、greeting.c 三个文档的编译?输入以下两条命令:①gcc –c greeting.c //生成greeting.o文件② gcc –o greeting myapp.c greeting.o //把greeting.o和myapp.c一起编译成可执行文件greeting。
第3章进程控制与进程调度1. 实验3.1 进程的创建(1)总结调用fork()函数后的三种返回情况。
fork()系统调用有3种返回情况:返回值>0,表示当前进程是父进程,这个返回值为子进程的进程ID值;等于0,表示当前进程是子进程;小于0,表示进程创建失败,需要报错。
(2)总结fork()和wait()配合使用的情况,并尝试在父进程中取消wait()函数,观察进程的运行情况。
当父进程中同时使用fork()和wait()/waitpid()函数时,父进程会处于阻塞状态等待子进程的运行结束。
如果父进程中没有调用wait()/waitpid()函数,则父进程和其创建的子进程属于并发进程,也就是父进程和子进程几乎是独立运行的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
添加系统调用(模块添加法fedora10:2.6.27.5内核)
一、为什么要使用内核模块的方式添加系统调用?
⏹编译内核的方式费时间,一般的PC机都要两三个小时。
⏹不方便调试,一旦出现问题前面的工作都前功尽弃。
二、用内核模块的方式实现系统调用有个前提,就是系统必须导出sys_call_table 内核符号,但是在2.6内核和2.4.18以上版本中,sys_call_table不再导出。
也就是说模块中不能再通过简单的extern void *sys_call_table[];来获得系统调用
表地址。
但是,即使内核不导出sys_call_table,也可以在内存中找到它的地址,下面是它的实现方法:
第1步:编写syscall_my.c程序:
pptprogram/syscall/module_syscall/syscall_my.c
第2步:编写Makefie文件
见pptprogram/syscall/module_syscall/Makefile
第3步.执行make命令编译模块
第4步:执行insmod命令插入模块,此时会把自己编写的系统调用插入到系统调用表中。