<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Linux Kernel on kamuszhou&#39;s blog</title>
    <link>https://ykyi.net/tags/linux-kernel/</link>
    <description>Recent content in Linux Kernel on kamuszhou&#39;s blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 17 Feb 2013 05:10:42 +0000</lastBuildDate>
    <atom:link href="https://ykyi.net/tags/linux-kernel/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Linux内核中的宏可变参数(GCC的宏可变参数)</title>
      <link>https://ykyi.net/?p=931/</link>
      <pubDate>Sun, 17 Feb 2013 05:10:42 +0000</pubDate>
      <guid>https://ykyi.net/?p=931/</guid>
      <description>&lt;pre style=&#34;color: rgb(0, 0, 0); line-height: normal; word-wrap: break-word; white-space: pre-wrap;&#34;&gt;Linux内核中的宏可变参数(GCC的宏可变参数)。
写内核模块的时候为了调试方便，经常需要wrap一下printk函数。下面的宏定义非常有实用价值。
注意两个井号~~
记到博客里~~

#define seclvl_printk(verb, type, fmt, arg...)			\
	do {							\
		if (verbosity &amp;gt;= verb) {			\
			static unsigned long _prior;		\
			unsigned long _now = jiffies;		\
			if ((_now - _prior) &amp;gt; HZ) {		\
				printk(type &#34;%s: %s: &#34; fmt,	\
					MY_NAME, __FUNCTION__ ,	\
					## arg);		\
				_prior = _now;			\
			}					\
		}						\
	} while (0)&lt;/pre&gt;</description>
    </item>
    <item>
      <title>使用gdb和虚拟机调试内核</title>
      <link>https://ykyi.net/?p=917/</link>
      <pubDate>Mon, 28 Jan 2013 03:31:28 +0000</pubDate>
      <guid>https://ykyi.net/?p=917/</guid>
      <description>&lt;p&gt;调试内核很麻烦，即使是有了虚拟机的帮助。在这里记下一些关键的东西，以备忘 。&lt;/p&gt;
&lt;p&gt;＃  编译内核后， 用新内核启动系统失败，报错 “unable to mount fs ….” 之类.&lt;/p&gt;
&lt;p&gt;需要用 update-initramfs 生成initram。&lt;/p&gt;
&lt;p&gt;＃ 对于grub2，我增加了一个自定义的grub开机启动项用来调试内核，如下：&lt;/p&gt;
&lt;p&gt;#!/bin/sh&lt;br&gt;
exec tail -n +3 $0&lt;br&gt;
# This file provides an easy way to add custom menu entries.  Simply type the&lt;br&gt;
# menu entries you want to add after this comment.  Be careful not to change&lt;br&gt;
# the &amp;rsquo;exec tail&amp;rsquo; line above.&lt;br&gt;
echo &amp;ldquo;Add Debugging entry&amp;rdquo;&lt;br&gt;
cat &amp;laquo; EOF&lt;br&gt;
menuentry &amp;ldquo;Debian debug 3.7.4&amp;rdquo;{&lt;br&gt;
set root=(hd0,1)&lt;br&gt;
linux /boot/vmlinuz-3.7.4 root=/dev/vda1 ro quiet kgdboc=ttyS0,115200 kgdbwait&lt;br&gt;
initrd /boot/initrd.img-3.7.4&lt;br&gt;
}&lt;br&gt;
EOF&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux内核Makefiles教程(二)</title>
      <link>https://ykyi.net/?p=847/</link>
      <pubDate>Sat, 07 Jul 2012 13:52:55 +0000</pubDate>
      <guid>https://ykyi.net/?p=847/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://ykyi.net/2012/07/linux%E5%86%85%E6%A0%B8makefiles%E6%95%99%E7%A8%8B%E4%B8%80/&#34;&gt;接第一篇 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;**3.3.**&lt;strong&gt;可加载模块目标&lt;/strong&gt; &lt;strong&gt;obj-m (Loadable module goals – obj-m)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;obj-m指定将被构建为可加载内核模块的对象文件(object file)。&lt;/p&gt;
&lt;p&gt;一个模块可以从一个源文件构建或者从多个源文件构建。如果模块仅仅从一个源文件构建，kbuild makefile仅仅把对象文件加到obj-m。如下：&lt;/p&gt;
&lt;p&gt;       #drivers/isdn/i4l/Makefile&lt;/p&gt;
&lt;p&gt;        obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o&lt;/p&gt;
&lt;p&gt;_在这个例子中，__$(CONFIG_ISDN_PPP_BSDCOMP)_&lt;em&gt;被求值为__m.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If a kernel module is built from several source files, you specify that you want to build a module in the same way as above.&lt;/p&gt;
&lt;p&gt;如果一个内核模块需要从多个源文件构建，你也是按照刚才提到的那一行指定。不过，除此之外，还要额外地指定，你的内核模块需要哪些对象文件。所以还需要设置&amp;lt;模块名&amp;gt;-objs变量。如下：&lt;/p&gt;
&lt;p&gt;       #drivers/isdn/i4l/Makefile&lt;/p&gt;
&lt;p&gt;        obj-$(CONFIG_ISDN) += isdn.o&lt;/p&gt;
&lt;p&gt;        isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o&lt;/p&gt;
&lt;p&gt;在这个例子中，模块名是 isdn 。Kbuild将编译isdn-objs列出的所有对象文件，然后运行$(LD) –r把这些对象文件链接成一个文件isdn.o。&lt;/p&gt;
&lt;p&gt;Kbuild用-objs后缀或者-y后缀识别构成复合对象文件(composite objects)的对象文件。这样，Makefile就可以使用CONFIG_* 符号来确定一个对象文件是不是一个复合对象文件的一部分。如下：&lt;/p&gt;
&lt;p&gt;       #fs/ext2/Makefile&lt;/p&gt;
&lt;p&gt;        obj-$(CONFIG_EXT2_FS)        += ext2.o&lt;/p&gt;
&lt;p&gt;        ext2-y                       := balloc.o bitmap.o&lt;/p&gt;
&lt;p&gt;        ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux内核Makefiles教程(一)</title>
      <link>https://ykyi.net/?p=840/</link>
      <pubDate>Fri, 06 Jul 2012 08:17:50 +0000</pubDate>
      <guid>https://ykyi.net/?p=840/</guid>
      <description>&lt;p&gt; &lt;/p&gt;
&lt;h1 id=&#34;linux内核makefiles&#34;&gt;Linux内核Makefiles&lt;/h1&gt;
&lt;p&gt;本教程描述了了Linux内核的Makefile是如何工作的。&lt;/p&gt;
&lt;h2 id=&#34;1概述&#34;&gt;1. 概述&lt;/h2&gt;
&lt;p&gt;Linux内核的Makefile包括五个部分。&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td style=&#34;width:203px;&#34;&gt;
      &lt;p&gt;
        Makefile
      &lt;/p&gt;
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width:373px;&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;
    最上层Makefile
  &amp;lt;/p&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&#34;width:203px;&#34;&gt;
      &lt;p&gt;
        .config
      &lt;/p&gt;
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width:373px;&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;
    内核配置文件。
  &amp;lt;/p&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&#34;width:203px;&#34;&gt;
      &lt;p&gt;
        arch/$(ARCH)/Makefile
      &lt;/p&gt;
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width:373px;&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;
    CPU架构相关Makefile
  &amp;lt;/p&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&#34;width:203px;&#34;&gt;
      &lt;p&gt;
        scripts/Makefile.*
      &lt;/p&gt;
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width:373px;&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;
    对于所有Kbuild&amp;amp;nbsp;Makefile的公共方法。.
  &amp;lt;/p&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td style=&#34;width:203px;&#34;&gt;
      &lt;p&gt;
        kbuild&amp;nbsp;Makefiles
      &lt;/p&gt;
    &lt;/td&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;td style=&amp;quot;width:373px;&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;
    有将近500个kbuild&amp;amp;nbsp;Makefiles。
  &amp;lt;/p&amp;gt;
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;最上层Makefile读取.config文件。.config文件是由内核配置过程生成的。&lt;/p&gt;
&lt;p&gt;最上级的Makefile负责生成linux的内核映象文件vmlinux和其它所有的模块。最上级Makefile递归地进入内核代码树的各级子目录分别执行子目录下的Makefile。究竟要进入哪些子目录是由内核配置阶段决定的，即配置在.cncfig文件中。最上级Makefile提定了一个路径为arch/$(ARCH)/Makefile的子目录Makefile。这个Makefile中定义了与处理器架构紧密相关的信息。&lt;/p&gt;
&lt;p&gt;每一个子目录下面都有一个kbuild Makefile，这里都定义了一些makefile命令和变量可以被更下级的Makefile继承。Kbuild Makefile使用来自.config配置的信息生成各种文件列表用来构建内建的或者模块化的目标文件。Scripts/Makefile.*包括了很多被其它Makefile使用定义和规则。&lt;/p&gt;
&lt;h2 id=&#34;2谁使用内核makefile&#34;&gt;2. 谁使用内核Makefile&lt;/h2&gt;
&lt;p&gt;内核Makefile的使用者可以大致分为四种。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用户(Userse)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这类使用者仅仅敲入一些命令，如“make menuconfig”或者“make”。他们很少会阅读甚修改内核Makefile和源代码文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一般开发者（Normal Developers）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一般开发者一般编写一些设备驱动程序，文件系统，网络协议。他们需要维护他们编写的代码涉及的子系统的kbuild Makefiles。为了工作地更有效率，他们甚至还需要对整个内核的Makefile有全局的把握，包括对kbuild的公共接口的详尽了解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;处理器架构开发者(Arch Developers)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这部分开发者关心与某个处理器架构紧密相关的代码部分，比如PC上最广泛使用的x86，以及IA64，还有ARM,Sparc,PowerPC,Alpha,s390,MIPS。Linux支持几百种处理器架构。从内核2.6.24开始，i386和x86_64合并为x86。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KBuild的开发者(KBuild Developers)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;KBuild的开发者就是维护内核构建系统的开发者，他们需要知道内核Makefile的各个方面。&lt;/p&gt;
&lt;p&gt;——&lt;/p&gt;
&lt;p&gt;本篇教程主要面向第二类开发者和第三类开发者。即一般开发者和处理器体系架构开发者。&lt;/p&gt;
&lt;h2 id=&#34;3kbuild文件&#34;&gt;3. kbuild文件&lt;/h2&gt;
&lt;p&gt;大多数内核Makefile文件是kbuild Makefile文件，它们使用不同于一般make文件的kbuild语法。下面会介绍kbuild makefile的语法。Kbuild文件一般被命名为Mafile，但是也可以使用Kbuild名字。如果已经存在一个Makefile文件了，那么就只好用Kbuild名字了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何正确地提交内核补丁包</title>
      <link>https://ykyi.net/?p=716/</link>
      <pubDate>Wed, 20 Jun 2012 11:39:56 +0000</pubDate>
      <guid>https://ykyi.net/?p=716/</guid>
      <description>&lt;p&gt;原文：&lt;a href=&#34;https://lwn.net/Articles/500443/&#34;&gt;https://lwn.net/Articles/500443/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;翻译：&lt;a href=&#34;http://ykyi.net&#34;&gt;ykyi.net &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;Greg Kroah-Hartman(又Greg KH)在执行一个了不起的作务：减少内核开发者，尤其是维护者的暴躁情绪。他在日本横滨举行的全球Linux大会上的讲演呼吁公众理解内核维护者的工作，内核贡献者的什么样的行为会导致内核维护者变得暴戾。但是，如果内核贡献者们能够遵守一些约束，他代表他自己做了许多承诺。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;
  Greg&amp;nbsp;Kroah&amp;nbsp;Hartman把Linux内核称之为&#34;有史以来最宏大的软件开发项目&#34;，而且它的开发速度也是&amp;ldquo;亘古未有&amp;rdquo;。从3.0到3.4，有373个公司的2833位开发者参于了Linux内核的开发。这一年，(2011年的5月到，2012年的5月)，Linux内核在每个小时会有5.79处变动。而且这个开发速度仍然要加速，如果你看看3.4的开发过程，每小时共有7.21处变动。这里所说的变动仅仅指能够被合并到主干的补丁包，而那些被拒绝的补丁包没有被统计进来。
&lt;/p&gt;
&lt;p style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;
  补丁包修改了哪些文件，内核开发者就把补丁包发给负责这些文件的维护者。所以的内核维护者，现在大概有700人。他们把改变应用到130个子系统的维护者那里。再从子系统的维护者到Linus的Linux内核代码分支。最后并必Linux内核的主干。如果提交的补丁包一路通过的话。
&lt;/p&gt;
&lt;p style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;
  因此，来看看为什么一些补丁包不会被接受呢？Greg&amp;nbsp;Kroah&amp;nbsp;Hartman以刚过去的两个星期收到的补丁包为例，这两个星期刚好处于3.5版本的Merge Window时间。Merge Window是一个他确不应该接收到许多补丁包的时间段。他应该在Merge Window开始前收到所以有可能会在Merge Window其间被发往Linux Torvalds的补丁包。不过，他说他在这两个星期的时间里收到487个补丁包。其中的大多数都有很多问题，有些补丁包来自那些本应该对内核有更好理解的内核开发者们。
&lt;/p&gt;
&lt;h4 style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;
  坏的补丁包
&lt;/h4&gt;
&lt;p style=&#34;color: rgb(0, 0, 0); font-family: &#39;Times New Roman&#39;; font-size: medium; &#34;&gt;
  Greg KH举例说明了一些他收到的坏的补丁包。其中一个补丁包被命名为：patch 48/48(一个有48个补丁集的最后一个)，但是其它的47个都没有。他还收到一堆补丁但没有写清楚先后顺序。如此，他要么猜测一个顺序，这毫无疑问会失败。另一个替代方案就是安全不管这个补丁了。另外还收到过有10个补丁的补丁集，但是2号补丁确丢失了。
&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux内核维护者的职责</title>
      <link>https://ykyi.net/?p=710/</link>
      <pubDate>Wed, 20 Jun 2012 08:48:58 +0000</pubDate>
      <guid>https://ykyi.net/?p=710/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;&lt;span style=&#34;font-family: &#39;comic sans ms&#39;, cursive; &#34;&gt;原文: &lt;/span&gt;&lt;/span&gt;&lt;a href=&#34;http://www.linuxfoundation.org/news-media/blogs/browse/2012/06/role-linux-kernel-maintainer&#34;&gt;http://www.linuxfoundation.org/news-media/blogs/browse/2012/06/role-linux-kernel-maintainer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;翻译: &lt;a href=&#34;http://ykyi.net&#34;&gt;ykyi.net&lt;/a&gt;&lt;/p&gt;
&lt;p style=&#34;margin: 1em 0px; font-size: 1.08em; line-height: 1.53em; color: rgb(77, 77, 77); font-family: Tahoma, Verdana, Arial, Helvetica, &#39;Bitstream Vera Sans&#39;, sans-serif; &#34;&gt;
  &lt;span style=&#34;font-size:14px;&#34;&gt;&lt;span style=&#34;font-family: &#39;comic sans ms&#39;, cursive; &#34;&gt;&lt;span style=&#34;line-height: 1.53em; &#34;&gt;几个星期前在日本举行的Linux大会(LinuxCon)上，我做了一个演讲，&lt;/span&gt;&lt;span style=&#34;line-height: 1.53em; &#34;&gt;题目是&#34;Linux内核维护者，他们在做什么，如何能够帮到他们&#34;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&#34;margin: 1em 0px; font-size: 1.08em; line-height: 1.53em; color: rgb(77, 77, 77); font-family: Tahoma, Verdana, Arial, Helvetica, &#39;Bitstream Vera Sans&#39;, sans-serif; &#34;&gt;
  &lt;span style=&#34;font-size:14px;&#34;&gt;&lt;span style=&#34;font-family: &#39;comic sans ms&#39;, cursive; &#34;&gt;&lt;span style=&#34;line-height: 1.53em; &#34;&gt;这个演讲的视频可以通过这个&lt;/span&gt;&lt;a href=&#34;http://video.linux.com/videos/linux-kernel-maintainers-what-they-do-and-how-you-can-help-them&#34; style=&#34;font-size: 1.08em; line-height: 1.53em; color: rgb(51, 102, 153); &#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;链接&lt;/a&gt;&lt;span style=&#34;line-height: 1.53em; &#34;&gt;看到。如果你想要幻灯片，和我的讲演稿，可以在&lt;/span&gt;&lt;a href=&#34;https://github.com/gregkh/presentation-linux-maintainer&#34; style=&#34;font-size: 1.08em; line-height: 1.53em; color: rgb(51, 102, 153); &#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;这个地址&lt;/a&gt;&lt;span style=&#34;line-height: 1.53em; &#34;&gt;获得。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用Cscope阅读大型工程Linux内核的源代码教程</title>
      <link>https://ykyi.net/?p=586/</link>
      <pubDate>Tue, 12 Jun 2012 11:45:14 +0000</pubDate>
      <guid>https://ykyi.net/?p=586/</guid>
      <description>&lt;p&gt;Cscope是一个非常有用的工具，可以用来方便地阅读很大型工程的源代码。较之使用传统的Unix工具grep，使用Cscope可以省下你一大笔时间，大大提高阅读代码的效率。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;通过本教程，我会教给你如何使用Cscope阅读Linux内核的源代码。毫无疑问，你可以举一反三，用同样的方法阅读其它的大型工程的源代码，不仅仅是C语言写的工程，也可以是Java或者C++或者C#开发的工程。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;STEP 1 获得源代码：&lt;/p&gt;
&lt;p&gt;去到Linux内核的网站http://www.kernel.org下载随便一个版本的Linux内核源代码压缩包。然后解压缩，把源代码释放到某个目录。本文假设你把源代码释放到 /home/code/linux-2.6.26。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;STEP 2 选择一个目录存放Cscope所需要的数据库文件。&lt;/p&gt;
&lt;p&gt;本文假设选择用/home/cscope目录存放cscope的数据库文件和其它一些相关文件。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;STEP 3 生成文件 cscope.files&lt;/p&gt;
&lt;p&gt;在最简单的情况下，工程目录下的所有源代码都是我要关心的，于是可以跳过下面所述，简单地在工程的根目录下运行&amp;rsquo;cscope -R&amp;rsquo;命令，这样Cscope就会在工程目录下所有源代码中处理相关工作。&lt;/p&gt;
&lt;p&gt;但是你关心的代码并必工程目录下所有的代码，你还需要排除很多目录下的大量代码该如何做呢？在这种情况下，你需要生成一个文件cscope.files，这个文件包含 了所有cscope将要扫描的文件的文件名，每个名字占一行。最好使用绝对路径，这样你就可以在其它目录下，而不是现在创建cscope.files文件的目录下使用这个刚创建的数据库。下面的代码将完成这个任务（假设我要所有的java文件）：&lt;/p&gt;
&lt;p&gt;$ cd /   &lt;/p&gt;
&lt;p&gt;$ find /my/project/dir -name &amp;ldquo;*.java&amp;rdquo; &amp;gt; /my/cscope/dir/cscope.files&lt;/p&gt;
&lt;p&gt;对于Linux内核来讲，情况还要稍微复杂一点。因为我们还要排除好些文件夹，这些文件夹有存放文档的文件夹，存放脚本的文件夹，与处理器架构相关的汇编代码的目录夹，与处理器架构相关的C代码除了x86（大多数人已经仅仅对x86感兴趣），另外还会排除所有的驱动文件目录夹，因为驱动占了内核很大一部分，但驱动代码通常不是我们要关心的。如果不排除这些目录的话，cscope当然也能工作，但是却给我们增加了麻烦，因为大大增加了重复的定义出现的概率。下面看我怎么做：&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;    $ LNX=/home/linux-2.6.26&lt;/p&gt;
&lt;p&gt;    $ cd /    &lt;/p&gt;
&lt;p&gt;    $ find  $LNX                                                                \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/arch/*&amp;quot; ! -path &amp;quot;$LNX/arch/i386*&amp;quot; -prune -o               \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/include/asm-*&amp;quot; ! -path &amp;quot;$LNX/include/asm-i386*&amp;quot; -prune -o \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/tmp*&amp;quot; -prune -o                                           \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/Documentation*&amp;quot; -prune -o                                 \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/scripts*&amp;quot; -prune -o                                       \&lt;/p&gt;
&lt;p&gt;    -path &amp;quot;$LNX/drivers*&amp;quot; -prune -o                                       \&lt;/p&gt;
&lt;p&gt;    -name &amp;quot;*.[chxsS]&amp;quot; -print &amp;gt;/home/jru/cscope/cscope.files&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM你问我答 FAQ (四)</title>
      <link>https://ykyi.net/?p=579/</link>
      <pubDate>Mon, 11 Jun 2012 15:19:17 +0000</pubDate>
      <guid>https://ykyi.net/?p=579/</guid>
      <description>&lt;p&gt;&lt;strong&gt;KVM&lt;span style=&#34;font-family: 宋体;&#34;&gt;和&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Xen&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;有什么区别？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Xen&lt;span style=&#34;font-family: 宋体;&#34;&gt;是一个外部虚拟机管理程序&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;(External hypervisor)&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，它承担了管理物理机器的任务并把物理机器的各种资源分配给客户机。与&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Xen&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;不同，&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;本身是&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Linux&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;内核的一部分，它使用&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Linux&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;自己的进程调度和内存管理。这就天然决定了&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;易于使用并于体积会很小。仅管体积小，但&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;的功能确不少。比如，&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;可以把客户机从内存中兑换到物理磁盘上，如同&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;swap&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;普通进程一样释放&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;RAM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;。&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;目前只在提供支持硬件虚拟化的&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;x86&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;机器上运行（如&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;vt/svm&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;指令集）。从这这方面讲，&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Xen&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;通过修改客户机操作系统，充许虚拟机运行在没有硬件虚拟化技术的&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;x86&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;平台上运行。这种虚拟化技术称之为准虚拟化&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;paravirtualization&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，参见另一贴：&lt;/span&gt;&lt;a href=&#34;http://ykyi.net/2012/06/linux%E7%9A%84%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF-kvm-%E5%92%8C-qemu/&#34;&gt;Linux&lt;span style=&#34;font-family: 宋体;&#34;&gt;的虚拟化技术&lt;/span&gt;&lt;/a&gt;。&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;在&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;CPU&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;级别不支持&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;paravirtualization&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;，但为了指高&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;I/O&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;性能，会对设备驱动程序支持准虚拟化。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KVM&lt;span style=&#34;font-family: 宋体;&#34;&gt;和&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;Vmware&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;有什么区别呢？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VMware&lt;span style=&#34;font-family: 宋体;&#34;&gt;是一个商用专用虚拟化产品，&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;是在&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;GPL&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;许可证下发布的自由软件。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KVM&lt;span style=&#34;font-family: 宋体;&#34;&gt;和&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;QEMU&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;有什么区别？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;QEMU&lt;span style=&#34;font-family: 宋体;&#34;&gt;是模拟器。参见&lt;/span&gt;&lt;a href=&#34;http://ykyi.net/2012/06/linux%E7%9A%84%E8%99%9A%E6%8B%9F%E5%8C%96%E6%8A%80%E6%9C%AF-kvm-%E5%92%8C-qemu/&#34;&gt;Linux&lt;span style=&#34;font-family: 宋体;&#34;&gt;的虚拟化技术 &lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;KVM &amp;amp; QEMU&lt;/span&gt;&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;KVM&lt;span style=&#34;font-family: 宋体;&#34;&gt;有&lt;/span&gt;&lt;span style=&#34;font-family: Arial;&#34;&gt;windows&lt;/span&gt;&lt;span style=&#34;font-family: 宋体;&#34;&gt;下的移移植版本吗？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM你问我答 FAQ (三)</title>
      <link>https://ykyi.net/?p=574/</link>
      <pubDate>Sun, 10 Jun 2012 13:12:57 +0000</pubDate>
      <guid>https://ykyi.net/?p=574/</guid>
      <description>&lt;h3 dir=&#34;ltr&#34;&gt;
  我在使用QEMU，如何知道我有没有启用KVM的硬件加速功能?
&lt;/h3&gt;
&lt;p&gt;如果你怀疑你没有启用KVM提供的硬件加速功能。你可以按照下面的步骤做检查。首先，看看你有没有得到下面的提示信息：&lt;/p&gt;
&lt;p&gt;qemu-system-x86_64 -hda myvm.qcow2&lt;br&gt;
open /dev/kvm: No such file or directory&lt;br&gt;
Could not initialize KVM, will disable KVM support&lt;/p&gt;
&lt;p&gt;如果是这种情况，请再检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;kvm模块被正确载入了吗？ lsmod | grep kvm.&lt;/li&gt;
&lt;li&gt;查看 dmesg 的输出，保证没有这个提示信息： “KVM, disabled by BIOS”.&lt;/li&gt;
&lt;li&gt;请确保/dev/kvm 确实存在，而且你有权限使用它。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其它诊断方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你能使用 QEMU monitor ( ctrl-alt-2, 再 ctrl-alt-1 回到 VM 的显示屏 )，敲入 info kvm 命令。如果正常的话，应该有“KVM support: enabled”这条信息输出。&lt;/li&gt;
&lt;li&gt;在host机上敲 lsmod | grep kvm 命令，看看输出的最右栏。如果kvm在正常运行的话，这个数字不能是0。这行的数字与架构相关的模块(一般指的是kvm_intel,或kvm_amd)有联系，它显示了有多少个VM正在使用这个模块。举例说明，如果你有两个虚拟机正在使用KVM模块，host机的CPU使用的是vt技术，那么就会得到：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;# lsmod | grep kvm&lt;br&gt;
kvm_intel              44896  2&lt;br&gt;
kvm                   159656  1 kvm_intel&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM你问我答FAQ (一)</title>
      <link>https://ykyi.net/?p=502/</link>
      <pubDate>Sat, 09 Jun 2012 05:12:04 +0000</pubDate>
      <guid>https://ykyi.net/?p=502/</guid>
      <description>&lt;h3 dir=&#34;ltr&#34;&gt;
  使用KVM需要哪些准备？
&lt;/h3&gt;
&lt;p&gt;****你需要一台运行Linux的x86的机器。它的CPU是有VT技术支持的英特尔cpu或者有SVM（又常被称为AMD-V）支持的AMD的CPU.&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 dir=&#34;ltr&#34;&gt;
  KVM支持64位的处理器吗？
&lt;/h3&gt;
&lt;p&gt;****KVM支持64位的处理器！此时，你可以运行32位或者64位的客户机。&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 dir=&#34;ltr&#34;&gt;
  What is Intel VT / AMD-V / hvm?
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;英特尔VT，是什么？AMD-V又是什么？hvm是什么？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.intel.com/technology/itj/2006/v10i3/1-hardware/6-vt-x-vt-i-solutions.htm&#34;&gt;Intel VT&lt;/a&gt; 和&lt;a href=&#34;http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_8826_14287,00.html&#34;&gt;AMD’s AMD-V&lt;/a&gt; 都指的是指令集扩展。它们在硬件层面帮助实现虚拟机管理技术。这种技术使得在虚拟机上运行的速度接近直接在真实机器上运行的速度。HVM是硬件虚拟机的缩写(Hardware Virtual Machine )则是一个生产商中立的词汇(vendor-neutral term)，它常常用来指代x86指定集扩展。&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 dir=&#34;ltr&#34;&gt;
  从哪里得到KVM内核模块呢？
&lt;/h3&gt;
&lt;p&gt;****可以从这里获得 &lt;a href=&#34;http://www.linux-kvm.org/page/Getting_the_kvm_kernel_modules&#34;&gt;http://www.linux-kvm.org/page/Getting_the_kvm_kernel_modules&lt;/a&gt; 。&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 dir=&#34;ltr&#34;&gt;
  我如何知道我的CPU支持Intel VT技术或者AMD-V技术呢？
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;如果你的Linux操作系统比较新，尝试以下的指令：&lt;br&gt;
. egrep ‘^flags.&lt;/em&gt;(vmx|svm)’ /proc/cpuinfo&lt;/strong&gt;&lt;/em&gt;*&lt;/p&gt;
&lt;p&gt;如果出现一些文字，那说说你的CPU支持虚拟化。你也可以在/proc/cpuinfo文件中找到处理器模块的名字，然后到供应商的网站上查询。&lt;br&gt;
注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果安装了Xen hypervisor，为了防止被劫持，你在dom0和domU中都得不到这些输出。dom0和domU是Xen hypervisor的术语。如果你没有安装Xen，直接忽略。&lt;/li&gt;
&lt;li&gt;一些产商默认在BIOS定设中禁用了CPU的虚拟化支持。你需要先在BIOS中打开虚拟化支持。&lt;/li&gt;
&lt;li&gt;如果你用的是intel cpu，对于内核版本2.6.15以前的Linux，你得不到这样的输出。如果你用的是amd cpu，对于内核版 本2.6.16以前的linux，你得不到这样的输出。如果你不确定你的Linux内核版本，用#uname -r 命令查看。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 dir=&#34;ltr&#34;&gt;
  出现 &amp;#8220;KVM: disabled by BIOS&amp;#8221; error 错误
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Check if there is an option to enable it in the BIOS. If not, look for a more recent BIOS on the vendor’s web site.&lt;br&gt;
在BIOS设定在找找看有没有启用cpu虚拟化的选项，如果没有，去到主板厂商的网站上面看看有没有新的BIOS发布并支持打开cpu虚拟化，那么你需要刷新BIOS.&lt;br&gt;
注意：&lt;br&gt;
1.对于部分硬件(如 HP nx 6320)，你需要先关掉主机电源，再打开主机电源才能使BIOS中启用cpu虚拟化支持生效。&lt;br&gt;
2.BIOS的部分设定有可能与启用CPU虚拟化冲突。比如在Thinkpad T500上，启用Intel AMT技术会出现冲突。这样kvm-intel在载入时会抱怨”disabled by bios”错误。&lt;br&gt;
3. 在一些Dell的硬件中，你还需要禁用”Trusted Execution”，否则不能打开VT。&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux用两种信号量 Linux has two kinds of semaphore</title>
      <link>https://ykyi.net/?p=480/</link>
      <pubDate>Tue, 05 Jun 2012 12:24:40 +0000</pubDate>
      <guid>https://ykyi.net/?p=480/</guid>
      <description>&lt;p&gt;面试中经常会考什么是信号量，对于linux,实际上有两种semaphore.&lt;/p&gt;
&lt;p&gt;第一种是指一种IPC(Inter-process communication进程通讯)的方法。这种IPC是从Unix SYstem V时代开始的，System V发布时加入了三种IPC，它们是semaphore信号量，message queues消息队列，shared memory共享内存。&lt;/p&gt;
&lt;p&gt;Linux中另一种Semaphore是内核用来同步的机制。在kernel中，semaphore通常当成一个二值信号量使用。获得信号量时有可能会睡眠，这样进程就会被调度开，放弃处理机；如果某段内核代码得到了一个信号量，这段代码还可以睡眠。这点不像spinlock，尝试得到spinlock会不停地忙等，得到spinlock后不充许睡眠。当然这个“不充许”不是语法层面的，而是应该被程序员遵守。否则整个系统的的性能就会被这代不遵守约定的代码毁掉了。&lt;/p&gt;
&lt;p&gt;copyright ykyi.net&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
    </item>
    <item>
      <title>内核线程是什么东东 What is Kernel threads</title>
      <link>https://ykyi.net/?p=476/</link>
      <pubDate>Tue, 05 Jun 2012 05:45:13 +0000</pubDate>
      <guid>https://ykyi.net/?p=476/</guid>
      <description>&lt;p&gt;有一些Unix内核，比如Solaris和SVR4.2/MP，被组织成一些内核线程。一个内核线程是一个执行上下文且可以被调度；这样的内核线程可能与一个用户程序相关联，也有可以只执行一些内核函数。上下文切换的时候，切换内核线程上下文的开销远比切换用户进程上下文的开销要小。因为内核线程通常共用一个地址空间。而&lt;strong&gt;Linux的内核线程&lt;/strong&gt;则有不同。Linux的内核线程仅仅周期性的执行一个内核函数。而且，Linux内核进线程并不表示一个基本的可执行上下文。 zausiu&amp;rsquo;s blog. &lt;a href=&#34;http://ykyi.net&#34;&gt;http://ykyi.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some Unix Kernels, such as Solaris and SVR4.2/MP, are organized as a set of kernel threads. A kernel thread is an execution context that can be independently scheduled; it may be aasociated with a user program, or it may run only some kernel functions. Context switches between kernel threads are usually much less expensive than context switches between ordinary processes, because the former usually operate on a common address space. Linux uses kernel threads in a very limited way to execute a few kernel functions periodically; however, they do not represent the basic execution context abstractions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>怎么为Linux源代码生成补丁</title>
      <link>https://ykyi.net/?p=402/</link>
      <pubDate>Wed, 22 Feb 2012 05:27:48 +0000</pubDate>
      <guid>https://ykyi.net/?p=402/</guid>
      <description>&lt;p&gt;怎么为Linux源代码生成补丁&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;用diff命令来为linux源代码生成补丁。如：&lt;/p&gt;
&lt;p&gt;$ diff -Nur /path/to/original/kernel /path/to/your/kernel &amp;gt; change.patch&lt;/p&gt;
&lt;p&gt;注意原始的源代码在前，更改后的源代码在后。2.6.x内核的补丁包提交约定指出你需要在每个patch后面写上这样一行：&lt;/p&gt;
&lt;p&gt;Sined-off-by: name &lt;email&gt;&lt;/p&gt;
&lt;p&gt;这样注明这个补丁包由你制作并贡献给社区。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;参看 Documentation/SubmittingPatches可以知道更多关于提交linux源代码补丁的内容 。&lt;/p&gt;
&lt;p&gt;参看 Documentation/applying-patches.txt 可以知道更多如果打补丁包。&lt;/p&gt;
&lt;p&gt;copyright ykyi.net&lt;/p&gt;</description>
    </item>
    <item>
      <title>initramfs 和 initrd 的区别</title>
      <link>https://ykyi.net/?p=236/</link>
      <pubDate>Fri, 25 Nov 2011 05:21:49 +0000</pubDate>
      <guid>https://ykyi.net/?p=236/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;Linux 2.6内核引入了一个新的feature叫做initramfs。与initrd相比,initramfs有几个好处。&lt;br /&gt; initrd模拟一个磁盘(这就是它的名字的由来，initramdisk或initrd)。模拟磁盘也就同时引入了Linux的块IO子系统的开销，比如缓存(caching)，而initramfs从根本上把cache也装载(mounted)成filesystem(因此叫做initramfs).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;Initramfs建立在page cahce之上，和page cache一样，会动态地自动增长和缩减尺寸来减入内存的使用量，而initrd做不到这点。&lt;br /&gt; 另外，不像initrd需要文件系统驱动(filesystem driver)的支持，比如EXT2 driver，如果你的initrd使用ext2。而initramfs则不需要文件系统的支持，initramfs的实现代码很简单，只是基于page cache的简单一层。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux的开机启动顺序</title>
      <link>https://ykyi.net/?p=228/</link>
      <pubDate>Fri, 25 Nov 2011 05:01:39 +0000</pubDate>
      <guid>https://ykyi.net/?p=228/</guid>
      <description>&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;对于x86机器的Linux的启动顺序，BIOS首先从启动设备载入MBR(Master Boot Record).存在MBR里的代码就去找分区表，从活动分区读入Linux的bootloader，最常用的像Grub,其它的有LILO,SYSLINUX。&lt;br /&gt; Bootloader把压缩格式的内核映象载入并把控制权交给内核映像。&lt;br /&gt; 内核映像自解压，启动内核！&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;x86处理器有两种工作模式。实模式和保护模式。在实模式，你只能够寻址1M内存。保护模式下，就复杂得多，可以作到使用处理器的很多高级特性比如分页。CPU必须从实模式转到保护模式是一个单行通道(one-way street)。你不能从保护模式退入实模式。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;内核第一阶段的内核初始化是在实模式中完成的。接下来从init/main.c 中定义的 start_kernel()函数进入你保护模式。start_kernel()先初始化CPU subsystem。接下来启动存储器和进程管理。然后启动外围总线和IO设备。启动序列的最后一个阶段便是init进程被启动。这个进程是所有的Linux进程的祖先。Init进程执行用户空间的脚本。这些脚本被用来启动必要的内核服务程序。Init最后spawn一个控制台给你。于是启动就完成了。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&#34;font-size:14px;&#34;&gt;copyright ykyi.net&lt;/span&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
