?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

打长沙麻将视频下载:顶级贵宾会app下载:包你能学会的技术:Linux内核入门集

?

长沙转转麻将必胜口诀 www.fv7j.com.cn 步骤一:获取内核代码

这岁首,Linux成了一个时髦词。自诩对电脑玩的精晓的门生和IT人士们,没有哪个不在自己的电脑上安装一、两个Linux,并自觉遇上了时髦。然而,在Ubuntu或SUSE的论坛中,常常有这样的对话:

“你学Linux学了这么久,都学到了什么?”

“哦,我现在Linux的安装、进级、桌面美化都很纯熟!你看我这是最新版的Ubuntu,桌面很漂亮吧!”

“……”

Linux社区中有一句名言:假如你进入你的操作系统不知道该做什么,那最好照样关掉落电脑,必然有更紧张的事等着你去做。说真的,假如对 Linux敕令不纯熟,真的不能算是学过Linux。然而另一方面,Linux内核虽然是一样平常用户可学可不学的内容,但可以说却是Linux操作系统中最 好玩的部分。尤其对付开拓者而言,Linux内核开拓绝对是最抱负的检验场所。51CTO编辑不停觉得,国外之以是IT技巧大年夜拿林立,和他们从小打仗类 UNIX系统、把玩内核开拓是脱不了关系的。

下面是Linux内核开拓者Robert Love写的一篇入门文章,号称“包教会”,保举对Linux内核开拓感兴趣的门生、Linux喜欢者、开拓者以及系统治理员们必然不要错过。当然,虽然标题说是包教会,你可能必要必然的Linux敕令以及C说话的根基。

以下是正文内容:

Linux内核不停都被视为进修Linux最难的一块,信托大年夜家也必然看过不少关于内核的文章,但扪心自问,你现在究竟掌握了若干?本文将从零开始先容被视为高妙的Linux内核,内容涉及内核源代码的下载,编译,安装,以及内核开拓相关的内容。

若何获取Linux内核源代码

下载Linux内核当然要辞官方网站了,网站供给了两种文件下载,一种是完备的Linux内核,另一种是内核增量补丁,它们都是tar归档压缩包。除非你有特其余缘故原由必要应用旧版本的Linux内核,否则你应该老是进级到最新版本。

应用Git

由Linus领头的内核开拓步队从几年前就开始应用Git版本节制系统治理Linux内核了(参考涉猎:什么是Git?),而Git项目本身也 是由Linus创建的,它和传统的CVS不一样,Git是散播式的,是以它的用法和事情流程很多开拓职员可能会认为很陌生,但我强烈建议应用Git下载和 治理Linux内核源代码。

你可以应用下面的Git敕令获取Linus内核代码树的最新“推送”版本:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

然后应用下面的敕令将你的代码树与Linus的代码树最新状态同步:

$ git pull

安装内核源代码

内核包有GNU zip(gzip)和bzip2款式。Bzip2是默认和首选款式,由于它的压缩比平日比gzip更好,bzip2款式的 Linux内核包一样平常采纳linux-x.y.z.tar.bz2形式的文件名,这里的x.y.z是内核源代码的详细版本号,下载到源代码包后,解压和抽 取就很简单了,假如你下载的是bzip2包,运行:

$ tar xvjf linux-x.y.z.tar.bz2

假如你下载的是gzip包,则运行:

$ tar xvzf linux-x.y.z.tar.gz

无论履行上面哪一个敕令,着末都邑将源代码解压和抽取到linux-x.y.z目录下,假如你应用Git下载和治理内核源代码,你不必要下载tar包,只必要运行git clone敕令,它就会自动下载和解压。

内核源代码平日都邑安装到/usr/src/linux下,但在开拓的时刻最好不要应用这个源代码树,由于针对你的C库编译的内核版本平日也链接到这里的。

利用补丁

Linux内核开拓职员会将自己的改动做成补丁与其它职员分享,而且补丁是增量的,增量补丁是从一个内核树移动到另一个内核树的有效措施,不用 下载完备的内核包就可以进级内核,不仅可节省带宽,也节省了内核进级光阴,利用补丁之前先辈入内核源代码树所在目录,然后运行:

$ patch –p1内核源代码树先容

内核源代码树分为许多目录,它们下面又包孕许多子目录,源代码树的顶级目录及其描述拜见下表。

在源代码树的根目录下还有很多文件必要阐明,COPYING是内核许可描述文件(即GNU GPL v2),CREDITS是介入Linux内 核的开拓职员名单,MAINTAINERS列出了掩护各个子系统和驱动的小我,Makefile是内核Makefile的根基。

天生内核

天生内核着实很简单,以致比编译和安装其它系统级组件,如glibc还要简单,从2.6版本开始,Linux内核引入了一个新的设置设置设备摆设摆设和天生系统,它使临盆内核的操作变得加倍简单了。

设置设置设备摆设摆设内核

既然已经拿到内核源代码,那我们在开始编译前就可以根据必要自行设置设置设备摆设摆设和定制,可以编译你指定的功能和想要的驱动,设置设置设备摆设摆设内核是天生内核必须的一 步,由于内核供给了大年夜量的功能,支持各类不合的硬件,有很多都必要设置设置设备摆设摆设,内核设置设置设备摆设摆设是由设置设置设备摆设摆设选项节制的,设置设置设备摆设摆设选项都有CONFIG前缀,例如,对称多处置惩罚 (SMP)是由CONFIG_SMP设置设置设备摆设摆设选项设置设置设备摆设摆设的,假如设置了这个选项,SMP就被启用了,反之则被禁用,设置设置设备摆设摆设选项可以确定会天生哪个文件,也可以经由过程 预处置惩罚指令操控代码。

设置设置设备摆设摆设选项可以节制天生历程要么是布尔型,要么是三态型,布尔型便是“是”或“否”,大年夜部分内核设置设置设备摆设摆设选项都属于布尔型,如 CONFIG_PREEMPT,而三态型则在“是”和“否”的根基上,又增添一个“??椤毖∠?,??檠∠畋硎旧柚蒙柚蒙璞赴谏璋谏柩∠畋簧柚昧?,但着末会编译成???,而不 是直接编译进内核,??榭梢岳斫馕勺粤Χ厝氲墓ぞ?,一样平常来说,驱动设置设置设备摆设摆设平日都是三态型。

设置设置设备摆设摆设选项也可所以字符串或整数,这样的选项不会节制天生历程,指定的值由内核源代码造访预处置惩罚宏时应用,例如,可以为某个设置设置设备摆设摆设选项指定静态分配数组的大年夜小。

Linux厂商也会随发行版供给预编译的内核,如Canonical为Ubuntu,或Red Hat为Fedora供给的内核,这样的内核通 常只启用了必要的内核功能,险些所有驱动都被编译成??榱?,这样的内核供给了一个优越的根基内核和广泛的硬件??橹С?,无论若何,想要成为内核高手,你应 该编译自己的内核。

值得荣耀的是,内核供给了很多对象简化设置设置设备摆设摆设 ,最简单的对象是基于文本敕令行的实用法度榜样,如:

$ make con顶级贵宾会app下载fig

这个对象会一个选项一个选项地设置设置设备摆设摆设,但用户必要介入,如指定“是(y)”,“否(m)”照样“??椋╩)”,全部设置设置设备摆设摆设历程必要很长的光阴,因 此,除非是有人按小时计费请你进级内核,其实找不出其余来由用这种最原始的措施设置设置设备摆设摆设内核了,相反,有现成的基于ncurses的图形化对象可以代替。

$ make menuconfig

或是基于gtk+的图形化对象

$ make gconfig

上述三个对象都将设置设置设备摆设摆设选项分成多个种别,如“处置惩罚器类型和特性”,你可以在这些种别上往返移动,查看内核选项,当然也可以改动它们的设置了。

下面这个敕令会根据你的架构创建一个默认的设置设置设备摆设摆设根基。

$ make defconfig

虽然默认设置设置设备摆设摆设顶级贵宾会app下载有些坚定(在i386上,默认设置设置设备摆设摆设是由Linus设置设置设备摆设摆设的),但假如你从未设置设置设备摆设摆设过内核,它供给了一个优越的起头。

设置设置设备摆设摆设选项存储在源代码树根目录下一个名叫。config的文件中,你可以打开这个文件手工编辑此中的设置设置设备摆设摆设选项,改动后或要在新的内核源代码树上利用现有设置设置设备摆设摆设文件,你可以应用下面的敕令验证和更新设置设置设备摆设摆设:

$ make oldconfig

在天生内核之前必须运行这个敕令。

设置设置设备摆设摆设选项CONFIG_IKCONFIG_PROC指定了完备的内核设置设置设备摆设摆设文件压缩包位置,默认是/proc/config.gz,这样在天生新 内核时要克隆现有的设置设置设备摆设摆设就变得异常简单了。假如你当前的内核开启了这个选项,你可以从/proc拷贝该设置设置设备摆设摆设文件,然后在此根基上天生新的内核:

$ zcat /proc/config.gz > .config   $ make oldconfig

内核设置设置设备摆设摆设好后,应用下面的敕令进行天生:

$ make

和2.6曩昔的内核不一样,在天生内核前不再必要履行make dep敕令了,依附树会自动掩护,也不必要再指定特定的天生类型,如bzImage,或自力天生???,默认Makefile规则会自动处置惩罚好统统。

将滋扰信息最小化

在天生历程中会遭到警告和差错的滋扰。最小化滋扰信息的一个诀窍是重定向make的输出,但仍旧会看到一些警告和差错:

$ make > /detritus

假如你想查看天生输出,你可以事后涉猎这个文件,假如你完全不想看到任何输出,那么就重定向到/dev/null:

$ make > /dev/null

同时履行多个天生功课

Make敕令供给了一个功能可以将天生历程拆分成多个平行的功课,这些功课可以自力运行,也可以并交运行,在多处置惩罚器系统上可以极大年夜地前进天生速率,也前进了处置惩罚器使用率,由于天生大年夜型源代码树会呈现大年夜量的I/O等待光阴。

默认环境下,make只能拆分成一个功课,由于Makefiles经?;岚胁痪返囊栏叫畔?,假如然是这样,多个并行履行的功课将会引起纷乱,终极会导致天生历程掉败,假如Makefiles中的依附信息无误,那么完全可以拆分成多个功课履行,如:

$ make –jn

这里的n表示拆分的功课数量,平日按每个处置惩罚器拆分成1-2个功课,例如,在一个16核心的机械上 ,你可以运行:

$ make -j32 > /dev/null

应用distcc或ccache等优秀的对象也可以大年夜大年夜前进天生速率。

安装新内核

内核天生好之后,你必要安装它,若何安装于系统架构和向导加载法度榜样有关,我们以x86架构,grub向导加载法度榜样为例进行阐明。

首先将arch/i386/boot/bzImage拷贝到/boot,重命名为vmlinuz- version,这里的version也是 版本号,然后编辑/boot/grub/grub.conf,为新内核添加响应的项目,假如是应用LILO向导装载法度榜样,则改动/etc /lilo.conf文件,然后运行lilo。

??榈陌沧坝胂低臣芄刮薰?,都是自动完成的,以root用户运行:

% make modules_install

这个敕令会将所有编译好的??榘沧暗?lib/modules下对应的子目录中。

天生历程会在源代码树根目录下创建一个System.map文件,它包孕一个符号查找表,映射内核符号到它们的肇端地址,在调试时代可以用它将内存地址转换成函数和变量名。

可能会碰到的问题

与通俗用户空间的利用法度榜样比拟,Linux内核有多顶级贵宾会app下载个特殊的属性,下面是我觉得最紧张的一些不合:

◆内核既不造访C库也不造访标准C头;

◆内核是用GNU C编码的;

◆内核缺少用户空间供给的内存?;?;

◆内核不能轻易地履行浮点运算;

◆内核有一个小型的固定大年夜小的进程客栈;

◆因为内核支持异步中断和SMP,是以同步和并发是内核主要担心的问题;

◆可移植性也很紧张。

下面我们就逐个来懂得一下这些问题,所有内核开拓职员都必须记着它们。

无libc或标准头

和用户空间利用法度榜样不一样,内核并没有链接到标准的C库,也没有链接到任何其它的库,这样设计的缘故原由有很多,包括如先有鸡照样先有蛋的问题,但主要缘故原由照样速率和内核大年夜小,不要说完备的C库,便是它的一个子集也够大年夜,内核太大年夜只会导致效率低下。

不要担心,许多常用的libc函数都在内核中实现了,例如,常见的字符串操作函数就位于lib/string.c中,只必要包括它的头文件就可以了。

这里的头文件指的是内核源代码树中的头文件,内核也只能应用树内的头文件,根基文件位于源代码根目录的include/目录下,例如,头文件就位于include/linux/inotify.h。

与架构相关的头文件则位于arch//include/asm,例如,假如在x86架构下编译,与你 架构相关的文件便是arch/x86/include/asm,只必要在引用这些头的地方加上asm/前缀即可,如。

遗漏落的大年夜部分都是类似printf()这样的函数,内核不会应用printf(),但它供给了printk()函数,其体现毫不比 printf()差,printk()会拷贝款式化的字符串到内核日志缓冲区,syslog法度榜样便是从这里读守信息的,其用法也和printf()类似:

printk("Hello world! A string '%s' and an integer '%d'n", str, i);

printf()和printk()之间最大年夜的不合是,printk()容许你指定一个优先级标记,syslogd应用这个标记确定在哪里显示内核消息,下面是一个应用优先级标记的示例:

printk(KERN_ER顶级贵宾会app下载R "this is an error!n");

留意在KERN_ERR和打印的消息之间没有逗号,这是有意这么设计的,优先级应用一个预定义的字符定义,在编译时代它与打印的信息是串联的。

GNU C

和许多Unix内核类似,Linux内核也是用C编写的,但大概会让人很意外,内核不是用严谨的ANSI C编写的,内核开拓职员用的却是gcc(GNU编译器集,包孕了编译内核和Linux C法度榜样的C编译器)中的各类说话扩展。

内核开拓职员同时应用了C说话的ISO C99和GNU C扩展,这些变更让Linux内核与gcc结合得更慎密,但近来又呈现了一个编译 器 – 英特尔的C编译器 – 也对gcc的功能支持得相称好,是以也可以用它来编译Linux内核。最低支持的gcc版本是3.2,建议采纳 gcc 4.4或更高的版本编译。应用ISO C99扩展也是可以的,由于C99是C说话的官方版本。

内联函数

C99和GNU C都支持内联函数,内联函数是直接插入到每个函数调用的位置的,打消了函数调用和返回的开销,容许进一步优化,由于编译器可以 同时优化调用者和被调用函数,但它也有毛病,代码大年夜小会增添,由于函数的内容被直接复制到所调用者内部了,是以也会增添内存耗损和指令缓存空间。内核开拓 职员一样平常在小型光阴很关键的函数中才会应用内联函数。

定义函数时,应用static和inline关键字声明内联函数,例如:

static inline void wolf(unsigned long tail_size)

函数必须先声明后应用,否则编译器就不能使函数内联,一样平常做法是将内联函数放在头文件中,由于它们被标记为static,不会创建输出函数,假如内联函数仅在一个文件中应用,可以放在该文件的顶部。

在内核中,与繁杂的宏比拟,出于安然和可读性方面斟酌,内联函数是首选。

内联汇编

Gcc C编译器容许在C函数中嵌入汇编指令,asm()编译器指令用于内联汇编代码,例如,这个内联汇编指令履行x86处置惩罚器的rdtsc指令,返回光阴戳寄存器(tsc)的值:

unsigned int low, high;

asm volatile("rdtsc" : "=a" (low), "=d" (high));

/* low and high now contain the lower and upper 32-bits of the 64-bit tsc */

Linux内核是用C和汇编说话混杂编写的,与底层硬件相关的代码很多都是用汇编说话写的,剩下的大年夜部分内核代码都是直接用C编写的。

分支评释

Gcc C编译器内置了一个指令优化前提分支,内核将这个打包成易于应用的宏 -likely()和unlikely()。

先看下面这样的if语句:

if (error) { /* … */ }

将这个分支标记为异常弗成能采纳

/* we predict 'error' is nearly always zero … */ if (unlikely(error)) { /* … */ }

相反,将这个分支标记为异??赡懿赡?/p>

/* we predict 'success' is nearly always nonzero … */ if (likely(success)) { /* … */ }

当分支指令已经知道一个优先级,或你想在一种环境下优化另一种环境时应该应用上述指令,最紧张的是,当分支精确标记时,这些指令会提升机能,但假如分支标记差错则会低落机能,在内核代码中,unlikely()要应用得更多,由于if语句倾向于表示一种特殊环境。

无内存?;?/p>

当用户空间的利用法度榜样考试测验一个不法的内存造访时,内核可以捕捉履新错,发送SIGSEGV旌旗灯号,杀掉落进程,假如内核考试测验一个不法的内存造访时,结果就不受节制了,由于谁也无法去节制内核,这也是内核最主要的掉误。

此外,内核内存也是弗因素页的,是以你耗损的每个内存字节都比物理内存的一个字节要少。

不能(轻易)应用浮点数

当用户空间进程应用浮点指令时,内核要认真处置惩罚从整型到浮点模式的转换。

与用户空间不一样,内核不能无缝支持浮点数,由于它自己不能随意马虎地捕捉到自己,在内核中应用浮点数必要手动保存和规复浮点数寄存器,是以除非却有需要,否则只管即便不要在内核中做浮点运算。

小型,固定大年夜小的客栈

用户空间可以静态分配许多不合的客栈,包括巨型布局和千元数组,这个行径是合法的,由于用户空间有很大年夜的客栈,并可以动态增长。

内核客栈不大年夜也不是动态的,相反,它很小且是固定的,内核客栈的正确大年夜小根据架构有所不合,在x86上,客栈大年夜小是在编译时确定的,一样平常是 4KB或8KB,历史上,内核客栈有2页,平日表示它处于32位架构上,大年夜小是8KB,假如是16KB就表示是64位架构,总之大年夜小是固定的,每个进程接 收它自己的客栈。

同步和并发

内核最轻易受竞争前提影响,和一个单线程的用户空间利用法度榜样不一样,有许多内核特点容许同时造访共享资本,是以必要同步以防止竞争,分外是:

◆Linux是一种抢占式多义务操作系统,进程是由内核的进程调整器随意调整和再次调整的,内核必须在这些义务之间同步;

◆Linux支持顶级贵宾会app下载对称多处置惩罚(SMP),是以,假如没有适当的?;?,在两个或多个处置惩罚器上同时履行的内核代码可能会同时造访相同的资本;

◆中断是异步发生的,是以,假如没有适当的?;?,在造访资本时代也可能发生中断,中断处置惩罚法度榜样可能就会造访到相同的资本;

◆Linux是有优先权的,是以,假如没有适当的?;?,内核代码可能会优先履行,造访其它代码正在应用的资本。

办理这些问题的一样平常措施是自旋锁和旌旗灯号量。

可移植性的紧张性

虽然用户空间利用法度榜样一样平常不会太注重可移植性,但Linux切实着实是一个可移植性操作系统,应该维持同等,这意味着与架构无关的C代码必须在大年夜量的系统上精确地编译和运行,与架构相关的代码必须在内核源代码树中应用特定的目录分隔开。

总结

可以肯定,内核有它独特的性子,它有它自己的一些原则,不过,内核的繁杂性和障碍与其它大年夜型软件项目比拟,并没有什么大年夜的不合,Linux开拓蹊径上最紧张的一步是熟识到内核并弗成怕,不认识?当然!弗成超越?当然不是!

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: