Kernel

详解神秘Linux内核

本章要先浏览一下内核发出的启动信息,然后再逐个讲解一些有意思的点。 2.1 启动过程 图2-1显示了基于x86计算机Linux系统的启动顺序。第一步是BIOS从启动设备中导入主引导记录(MBR),接下来MBR中的代码查看分区表并从 活动分区读取GRUB、LILO或SYSLINUX等引导装入程序,之后引导装入程序会加载压缩后的内核映像并将控制权传递给它。内核取得控制权后,会将 自身解压缩并投入运转。 基于x86的处理器有两种操作模式:实模式和保护模式。在实模式下,用户仅可以使用1 MB内存,并且没有任何保护。保护模式要复杂得多,用户可以使用更多的高级功能(如分页)。CPU 必须中途将实模式切换为保护模式。但是,这种切换是单向的,即不能从保护模式再切换回实模式。 内核初始化的第一步是执行实模式下的汇编代码,之后执行保护模式下init/main.c文件(上一章修改的源文件)中的 start_kernel()函数。start_kernel()函数首先会初始化CPU子系统,之后让内存和进程管理系统就位,接下来启动外部总线和 I/O设备,最后一步是激活初始化(init)程序,它是所有Linux进程的父进程。初始化进程执行启动必要的内核服务的用户空间脚本,并且最终派生控 制台终端程序以及显示登录(login)提示。 图2-1 基于x86硬件上的Linux的启动过程 本节内的3级标题都是图2-2中的一条打印信息,这些信息来源于基于x86的笔记本 电脑的Linux启动过程。如果在其他体系架构上启动内核,消息以及语义可能会有所不同。   2.1.1 BIOS-provided physical RAM map 内核会解析从BIOS中读取到的系统内存映射,并率先将以下信息打印出来: BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) ... BIOS-e820: 00000000ff800000 - 0000000100000000 (reserved) 实模式下的初始化代码通过使用BIOS的int 0x15服务并执行0xe820号函数(即上面的BIOS-e820字符串)来获得系统的内存映射信息。内存映射信息中包含了预留的和可用的内存,内核将 随后使用这些信息创建其可用的内存池。在附录B的B.1节,我们会对BIOS提供的内存映射问题进行更深入的讲解。 图2-2 内核启动信息 2.1.2 758MB LOWMEM available 896 MB以内的常规的可被寻址的内存区域被称作低端内存。内存分配函数kmalloc()就是从该区域分配内存的。高于896 MB的内存区域被称为高端内存,只有在采用特殊的方式进行映射后才能被访问。 在启动过程中,内核会计算并显示这些内存区内总的页数。   2.1.3 Kernel command line: ro root=/dev/hda1 Linux的引导装入程序通常会给内核传递一个命令行。命令行中的参数类似于传递给C程序中main()函数的argv列表,唯一的不同在于它们是传 递给内核的。可以在引导装入程序的配置文件中增加命令行参数,当然,也可以在运行过程中修改引导装入程序的提示行。如果使用的是GRUB 这个引导装入程序,由于发行版本的不同,其配置文件可能是/boot/grub/grub.conf或者是/boot/grub/menu.lst。如果 使用的是LILO,配置文件为/etc/lilo.conf。下面给出了一个grub.conf文件的例子(增加了一些注释),看了紧接着title kernel 2.6.23的那行代码之后,你会明白前述打印信息的由来。 default 0 #Boot the 2.6.23 kernel by default timeout 5 #5 second to alter boot order or parameters title kernel 2.6.23 #Boot Option 1 #The boot image resides in the first partition of the first disk #under...
阅读全文

用新安装的内核编译新网卡出现‘struct net_device’ has no member named ‘mc_list’

报错信息如下:make -C /lib/modules/2.6.38/build SUBDIRS=/usr/src/AR81/src modules make: Entering directory `/usr/src/linux'   CC   /usr/src/AR81/src/at_common_main.o   CC   /usr/src/AR81/src/atl1e_main.o /usr/src/AR81/src/atl1e_main.c: In function &lsquo;atl1e_set_multi&rsquo;: /usr/src/AR81/src/atl1e_main.c:1859: error: &lsquo;struct net_device&rsquo; has no member named &lsquo;mc_list&rsquo; /usr/src/AR81/src/atl1e_main.c:1859: error: dereferencing pointer to incomplete type /usr/src/AR81/src/atl1e_main.c:1860: error: dereferencing pointer to incomplete type make: ***  Error 1 make: ***  Error 2 make: Leaving directory `/usr/src/linux' make: ***  Error 2 编译内核时需要如下选项:-*- Networking support  --->        Networking options  --->             <*> Unix domain sockets            &hellip;&hellip;               IP: kernel level autoconfiguration                      IP: DHCP support                      IP: BOOTP support                      IP: RARP support  
阅读全文

Linux kernel Task 03:How to patch for the Linux kernel

I have been very busy recently,let's go on the task 03.How to patch for the Linux kernel. This is Task 03 of the Eudyptula Challenge ------------------------------------------   Now that you have your custom kernel up and running, it's time to modify it!   The tasks for this round are:   - Take the kernel git tree from Task 02 and change the Makefile to     modify the EXTRAVERSION field.  Do this in a way that the     running kernel (after modifying the Makefile, rebuilding, and     rebooting) has the characters "-eudyptula" in the version string.   - Show proof of booting this kernel.  Extra cookies when you provide     creative examples, especially if done in interpretive dance at your     local pub.   - Send a patch that shows the Makefile modified.  Do this in a manner     that would be acceptable for merging in the kernel source tree.     (Hint, read the file Documentation/SubmittingPatches and follow the     steps there.) # uname -a Linux bogon 3.15.0-rc4-00298-g9f1eb57 #1 SMP Wed May 7 21:30:42 PDT 2014 x86_64 x86_64 x86_64 GNU/Linux # cd /kernel/Task3/ # ls linux # cd linux/ # cp Makefile Makefile.orig^C # cd .. # diff -up linux/Makefile{.orig,} &amp;gt; /tmp/patch # cat /tmp/patch --- linux/Makefile.orig 2014-05-22 06:19:41.842094049 -0700 +++ linux/Makefile 2014-05-22 06:21:08.616098040 -0700 @@ -1,7 +1,7 @@ VERSION = 3 PATCHLEVEL = 15 SUBLEVEL =...
阅读全文

Linux kernel Task 02:Compile your costom kernel

第2个任务描述如下:   This is Task 02 of the Eudyptula Challenge ------------------------------------------   Now that you have written your first kernel module, it's time to take off the training wheels and move on to building a custom kernel.  No more distro kernels for you.  For this task you must run your own kernel.  And use git!  Exciting, isn't it?  No?  Oh, ok...   The tasks for this round are:   - Download Linus's latest git tree from git.kernel.org (you have to     figure out which one is his.  It's not that hard, just remember what     his last name is and you should be fine.)   - Build it, install it, and boot it.  You can use whatever kernel     configuration options you wish to use, but you must enable     CONFIG_LOCALVERSION_AUTO=y.   - Show proof of booting this kernel.  Bonus points if you do it on a     "real" machine, and not a virtual machine (virtual machines are     acceptable, but come on, real kernel developers don't mess around     with virtual machines, they are too slow.  Oh yeah, we aren't real     kernel developers just yet.  Well, I'm not anyway, I'm just a     script...)  Again, proof of running this kernel is up to you, I'm     sure you can do well.   Hint, you should look into the 'make localmodconfig' option, and base your kernel configuration on a working distro kernel configuration. Don't sit there and answer all 1625 different kernel configuration options by hand, even I, a foolish script, know better than to do that!   After doing this, don't throw away that kernel, git tree, and configuration file.  You'll be using it for later tasks.  A working kernel configuration file is a precious thing, all kernel developers have one they have grown and tended to over the years.  This is the start of a long journey with yours.  Don't discard it like was a broken umbrella, it deserves better than that.   I get the linux kernel source code use set of commands: # uname -a Linux bogon 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux # mkdir /kernel/Task2 # cd /kernel/Task2/ # pwd /kernel/Task2 # git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git # cd linux/ # make localmodconfig Then modify the configure file '.config',set CONFIG_LOCALVERSION_AUTO=y ... # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" #CONFIG_LOCALVERSION_AUTO is not set CONFIG_LOCALVERSION_AUTO=y CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y ... Next run,some compile information is ignored: # make -j8 all # make modules_install # make...
阅读全文