使用gdb和虚拟机调试内核

调试内核很麻烦,即使是有了虚拟机的帮助。在这里记下一些关键的东西,以备忘 。 # 编译内核后, 用新内核启动系统失败,报错 “unable to mount fs ….” 之类. 需要用 update-initramfs 生成initram。 # 对于grub2,我增加了一个自定义的grub开机启动项用来调试内核,如下: #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the ’exec tail’ line above. echo “Add Debugging entry” cat « EOF menuentry “Debian debug 3.7.4”{ set root=(hd0,1) linux /boot/vmlinuz-3.7.4 root=/dev/vda1 ro quiet kgdboc=ttyS0,115200 kgdbwait initrd /boot/initrd.img-3.7.4 } EOF ...

January 28, 2013 · 1 min · kamus

Barebox介绍

从裸机上电开始启动计算机的过程听起来是相当复杂的。在PC的世界里,BIOS统治这个领域已经几十年了。不过,哲学上讲任何世界都是从出生,到繁荣,再后到死亡的过程。BIOS的寿命也即将迎来终结。BIOS的掘墓者即是EFI。对于MAC用户来说,EFI的使用已经有好长一段时间了。而在嵌入式Linux的世界里,u-boot则在长时间里扮演着老大哥的角色。 U-boot,或者来自DENX的das U-boot提供了非常丰富的功能。如:网络,脚本,支持FLASH(这里的flash是存储方面的flash,而不是adobe的那个flash)。一般的嵌入式系统工程序师需要的工具,都提供好了。 还是那句话,对于万事万物,都是生生死死的过程啊。u-boot的功能越来越强大。催生了新的事物的诞生。它的名字就是:Barebox。 Barebox最开始被称之为:u-boot-v2,它是一个像u-boot一样野心勃勃的bootloader。不过Barebox更有Linux的味道一些。它的发展抛弃了u-boot而越来越像Linux。它有文件系统,有基本的shell,甚至还有与Linux近似的驱动模块。 Barebox的另一个创新即是,bootloader可以被构建成一个用户空间的应用程序。这样的好处是显而易近的,你可以更方便的开方和调试Barebox。 说了这么多,看看Barebox是个什么样子呢? uboot:/ uboot:/ ls . .. dev env 和Linux一样,dev目录夹下面放了系统的设备文件。比如,mem设备文件描述了计算机的内存。 再回到u-boot,它有一个特殊的命令:md。md命令可以查看内存的内容。对于Barebox,提供了同样的工具。不过这个工具是以一种POSIX的方式实现的:打开/dev/mem设备,lseek移动文件指针,read读出文件内容。这样的实现方式不仅仅提升了代码结构,它还使得md命令可以不需修改就应用到其它设备上,比如flash存诸器。 如果你想测试一下Barebox到底如何。你可以有两种方法。 第一:你可以下载Barebox的沙盒功能即把它构建成一个Linux的用户空间的应用。来自Barebox官方的解释是: Sandbox: If you develop features for Barebox, you can use the ‘sandbox’ target which compiles Barebox as a POSIX application in the Linux userspace: it can be started like a normal command and even has network access (tun/tap). Files from the local filesytem can be used to simulate devices. 如果你要为Barebox开发功能,你可以使用’沙盒’。这种方式把Barebox构建成一个Linux的用户空间程序。它像一般的命令一样,而且还有网络功能。来自文件系统的文件可以被用来模拟设备。 第二:不说你也知道,把Barebox安装到真真正正的硬件上吧!对于我,我就尝试过在PC机的一块旧式的主板上安装Barebox。 最后,Barebox的官方网站是: http://barebox.org/ ...

July 2, 2012 · 1 min · kamus

使用Cscope阅读大型工程Linux内核的源代码教程

Cscope是一个非常有用的工具,可以用来方便地阅读很大型工程的源代码。较之使用传统的Unix工具grep,使用Cscope可以省下你一大笔时间,大大提高阅读代码的效率。 通过本教程,我会教给你如何使用Cscope阅读Linux内核的源代码。毫无疑问,你可以举一反三,用同样的方法阅读其它的大型工程的源代码,不仅仅是C语言写的工程,也可以是Java或者C++或者C#开发的工程。 STEP 1 获得源代码: 去到Linux内核的网站http://www.kernel.org下载随便一个版本的Linux内核源代码压缩包。然后解压缩,把源代码释放到某个目录。本文假设你把源代码释放到 /home/code/linux-2.6.26。 STEP 2 选择一个目录存放Cscope所需要的数据库文件。 本文假设选择用/home/cscope目录存放cscope的数据库文件和其它一些相关文件。 STEP 3 生成文件 cscope.files 在最简单的情况下,工程目录下的所有源代码都是我要关心的,于是可以跳过下面所述,简单地在工程的根目录下运行’cscope -R’命令,这样Cscope就会在工程目录下所有源代码中处理相关工作。 但是你关心的代码并必工程目录下所有的代码,你还需要排除很多目录下的大量代码该如何做呢?在这种情况下,你需要生成一个文件cscope.files,这个文件包含 了所有cscope将要扫描的文件的文件名,每个名字占一行。最好使用绝对路径,这样你就可以在其它目录下,而不是现在创建cscope.files文件的目录下使用这个刚创建的数据库。下面的代码将完成这个任务(假设我要所有的java文件): $ cd / $ find /my/project/dir -name “*.java” > /my/cscope/dir/cscope.files 对于Linux内核来讲,情况还要稍微复杂一点。因为我们还要排除好些文件夹,这些文件夹有存放文档的文件夹,存放脚本的文件夹,与处理器架构相关的汇编代码的目录夹,与处理器架构相关的C代码除了x86(大多数人已经仅仅对x86感兴趣),另外还会排除所有的驱动文件目录夹,因为驱动占了内核很大一部分,但驱动代码通常不是我们要关心的。如果不排除这些目录的话,cscope当然也能工作,但是却给我们增加了麻烦,因为大大增加了重复的定义出现的概率。下面看我怎么做: $ LNX=/home/linux-2.6.26 $ cd / $ find $LNX \ -path "$LNX/arch/*" ! -path "$LNX/arch/i386*" -prune -o \ -path "$LNX/include/asm-*" ! -path "$LNX/include/asm-i386*" -prune -o \ -path "$LNX/tmp*" -prune -o \ -path "$LNX/Documentation*" -prune -o \ -path "$LNX/scripts*" -prune -o \ -path "$LNX/drivers*" -prune -o \ -name "*.[chxsS]" -print >/home/jru/cscope/cscope.files ...

June 12, 2012 · 1 min · kamus

KVM你问我答 FAQ (四)

KVM和Xen有什么区别? Xen是一个外部虚拟机管理程序(External hypervisor),它承担了管理物理机器的任务并把物理机器的各种资源分配给客户机。与Xen不同,KVM本身是Linux内核的一部分,它使用Linux自己的进程调度和内存管理。这就天然决定了KVM易于使用并于体积会很小。仅管体积小,但KVM的功能确不少。比如,KVM可以把客户机从内存中兑换到物理磁盘上,如同swap普通进程一样释放RAM。KVM目前只在提供支持硬件虚拟化的x86机器上运行(如vt/svm指令集)。从这这方面讲,Xen通过修改客户机操作系统,充许虚拟机运行在没有硬件虚拟化技术的x86平台上运行。这种虚拟化技术称之为准虚拟化paravirtualization,参见另一贴:Linux的虚拟化技术。KVM在CPU级别不支持paravirtualization,但为了指高I/O性能,会对设备驱动程序支持准虚拟化。 KVM和Vmware有什么区别呢? VMware是一个商用专用虚拟化产品,KVM是在GPL许可证下发布的自由软件。 KVM和QEMU有什么区别? QEMU是模拟器。参见Linux的虚拟化技术 KVM & QEMU 。 KVM有windows下的移移植版本吗? ...

June 11, 2012 · 1 min · kamus

KVM你问我答 FAQ (三)

我在使用QEMU,如何知道我有没有启用KVM的硬件加速功能? 如果你怀疑你没有启用KVM提供的硬件加速功能。你可以按照下面的步骤做检查。首先,看看你有没有得到下面的提示信息: qemu-system-x86_64 -hda myvm.qcow2 open /dev/kvm: No such file or directory Could not initialize KVM, will disable KVM support 如果是这种情况,请再检查: kvm模块被正确载入了吗? lsmod | grep kvm. 查看 dmesg 的输出,保证没有这个提示信息: “KVM, disabled by BIOS”. 请确保/dev/kvm 确实存在,而且你有权限使用它。 其它诊断方式: 如果你能使用 QEMU monitor ( ctrl-alt-2, 再 ctrl-alt-1 回到 VM 的显示屏 ),敲入 info kvm 命令。如果正常的话,应该有“KVM support: enabled”这条信息输出。 在host机上敲 lsmod | grep kvm 命令,看看输出的最右栏。如果kvm在正常运行的话,这个数字不能是0。这行的数字与架构相关的模块(一般指的是kvm_intel,或kvm_amd)有联系,它显示了有多少个VM正在使用这个模块。举例说明,如果你有两个虚拟机正在使用KVM模块,host机的CPU使用的是vt技术,那么就会得到: # lsmod | grep kvm kvm_intel 44896 2 kvm 159656 1 kvm_intel ...

June 10, 2012 · 2 min · kamus

Linux的虚拟化技术 KVM 和 QEMU

Linux 2.6.20发布以后。一个称之为KVM的非常优秀的虚拟化框架加入了linux代码主干。KVM是Kernel-based Virtual Machine的首字母简写。这篇文章将在理论层面和实践层面都会简单介绍KVM是如何工作的。http://ykyi.net 简单的理论背景: 目前有几种虚拟化的方式。 其中一种称之为准虚拟化(para-virtulization)。使用准虚拟化的时候,为了达到虚拟化的目的,客户机系统必须被修改。修改后的客户机知道它运行在虚拟的环境中,与虚拟机管理程序(Supervisor)协同工作。这样的好处理较之全虚拟化,性能上有一定的优势。 另一种称之为全虚拟化(full virtualization)。使用这种技术则不需要修改操作系统。但相对于准虚拟化技术,全虚拟代技术牺牲了一些性能。因为没有客户机OS的参于,是非常困难得到很高的虚拟化效率的。但自从CPU产商在硬件层面推出虚拟化支持的时候,情况就不一样了。如Intel的VT,AMD的AMD-V虚拟化技术。KVM就是利用了CPU的虚拟化支持技术实现了。并且KVM作为linux内核的一个模块加载,天然继承了linux内核的诸多优势。基于KVM的虚拟机,被当成一个标准的Linux进程被Linux内核调度。这个KVM虚拟机看到的都是虚拟的硬件。对于一个标准的Linux进程,有两种运行模式:内核态和用户态。KVM给虚拟机进程加入了第三个模式:客户模式(guest mode)。而客户模式又有它自己的内核态和用户态。 KVM包括两部分组件: 一个设备驱动程序用来管理虚拟化硬件。这个驱动是一个字符驱动,用来管理虚拟化硬件(for managing the virtualization hardware)。 一个用户空间运行的模拟器。通常选择QEMU稍作修改。QEMU是由一个叫Fabrice Bellard的法国黑客写的。 KVM与QEMU实战,在linux下安装windows xp: 前期准备,需要安装KVM和QEMU.另外还有保证你已经编译了内核。 真正的安装超级简单。 第一步:# qemu-img create hda.img -f qcow 6G 第二步: # kvm -no-acpi -m 256 -cdrom winxpsp2.iso -hda hda.img -boot d 下面简单的解释下。 第一步创建了一个虚拟磁盘(实际上就是文件系统上一个文件而已,不过话又说回来,unix的哲学就是所有的东东都是文件。)这条命令选择了QEMU的写时复制策略。这使得这个文件会按需增长。所以一开始这个文件不会太大,以后随着你的虚拟xp占用的空间增大而增大。不过这条命令把大小限制到第大6G. 第二步:指定了win xp的镜像文件就开始安装啦!喔,这条命令使用了 -no-acpi 开关。据说acpi在QEMU中支持的不够好。不过我觉得问题应该得到解决了吧,所以也可以不用 -no-acpi。ykyi.net 于是就装好啦!真的非常简单啊~~ 于是你就可以用这个虚拟的xp做一些你不愿意在真实OS上作的测试啦!或者使用只有在win下的软件。 转贴请注明出处 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/

June 7, 2012 · 1 min · kamus

内核线程是什么东东 What is Kernel threads

有一些Unix内核,比如Solaris和SVR4.2/MP,被组织成一些内核线程。一个内核线程是一个执行上下文且可以被调度;这样的内核线程可能与一个用户程序相关联,也有可以只执行一些内核函数。上下文切换的时候,切换内核线程上下文的开销远比切换用户进程上下文的开销要小。因为内核线程通常共用一个地址空间。而Linux的内核线程则有不同。Linux的内核线程仅仅周期性的执行一个内核函数。而且,Linux内核进线程并不表示一个基本的可执行上下文。 zausiu’s blog. http://ykyi.net 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.

June 5, 2012 · 1 min · kamus

十个选择Oracle Linux而不是RedHat企业版Linux的原因

Linux在当今基于云的解决方案中被普通采用。而Oracle Linux目前最完整的集成解决方案。它提供了高性能和高可靠性,却只是选择Redhat Linux的花费的1/7。 http://ykyi.net 译! 原因一: Oracle Linux成本低: Oracle Linux可以自由下载和部署。 对Oracle Linux的支持订阅(Support Subscription)非常简单且价格便宜。 支持花费(Support costs)不到Redhat的七分之一。 你不能够下载Redhat Ent Linux,除非你购买了Support Subscription。 而Redhat Ent Linux的订阅以及插件的价格都很贵。 Redhat Ent Linux的授权许可证非常的复杂。 原因二: Oracle Linux已包含管理工具。 Oracle Linux支持用户使用免费的Oracle Linux服务器的生命期管理工具,这个工具相当于Redhat的卫星服务以及相关模块。 同样的Oracle企业管理者工具也能被授权管理从应用到磁盘的整个解决方案。 而红帽的卫星服务器用户则需要分别为每台服务器都申请许可证。可想而知,花费要高很多。 原因三:Oracle Linux的高有效性。 Oracle Linux includes OCFS2 and Oracle Linux Basic and Premier Support subscribers have free access to Oracle Clusterware Red Hat charges separately for add-ons that include clustering software for HA ...

May 27, 2012 · 3 min · kamus

怎么订阅Linux内核邮件列表

官方页面: http://vger.kernel.org/majordomo-info.html As of now, subscription support is not handled at the web! 从现在开始,订阅操作不在通过web方式操作啦。 All VGER list control activities (joining and leaving, that is) are handled via email server at address: 所以的VGER列表的操作都通过邮件的方式搞定。 majordomo@vger.kernel.org All email sent to there must be TEXT/PLAIN, there can be no multipart messages, no VCARDs, nothing “fancy’’. In presense of such things, Majordomo will very likely do wrong thing. 所以的邮件都必须以纯文本发送。不需要multipart message,不需要VCARD,不需要花哨的东东。如果你违反了,Majordomo系统就会出错。 When you send there email, do make sure that all of the email headers, both visible and transport level, have same addresses in them. People experience problems when for example “From:’’, “Sender:’’ and possible “Reply-To:’’ headers present different addresses. The most common manifestation is complete silence from VGER! ...

May 20, 2012 · 3 min · kamus

gcc的-E选项什么意思

gcc的-E选项可以为你生成预编译后的文件。预编译后的文件将把c文件中的宏以及该文件包含的所有头文件展开。这样就没有了一层一层进入嵌套包含的头文件。下面是一个使用gcc的-E选项的例子。 下面是来自gcc mannual page的解释: -E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output. Input files which don’t require preprocessing are ignored. $ gcc -E drivers/char/mydrv.c -D__KERNEL__ -Iinclude -Iinclude/asm-x86/mach-default > mydrv.i 其中的-I选项告诉编译器在哪些目录中搜索所需要的头文件。 还可以用gcc的-S选项生成汇编码的文件。如: $ gcc -S drivers/char/mydrv.c -D__KERNEL__ -Iinclude -Ianother/include/path ykyi.net

February 22, 2012 · 1 min · kamus