代码改变世界

Linux内核里的DebugFS

2011-01-17 23:52 by wwang, 47583 阅读, 7 推荐, 收藏, 编辑
摘要:DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。通常情况下,最常用的内核调试手段是printk。但printk并不是所有情况都好用,比如打印的数据可能过多,我们真正关心的数据在大量的输出里不是那么一目了然;或者我们在调试时可能需要修改某些内核变量,这种情况下printk就无能为力,而如果为了修改某个值重新编译内核或者驱动又过于低效,此时就需要一个临时的文件系统可以把我们需要关心的数据映射到用户空间。在过去 阅读全文

用make-kpkg简化Ubuntu系统的内核编译过程

2011-01-07 19:41 by wwang, 18294 阅读, 4 推荐, 收藏, 编辑
摘要:本文介绍的make-kpkg可以用于所有Debian系的发行版如Debian、Ubuntu、Linux Mint等。传统编译方式通常,如果我们需要编译Linux内核,大概要经历以下几个步骤:1、配置内核最常用的配置内核的方法是“make menuconfig”。“make config”太简陋,“make xconfig”虽然更加直观,但需要庞大的qt类库支持,menuconfig应该是最佳的折中。2、编译内核和模块依次执行“make”、“make modules”、“make modules_install”、“make install”,如果前面的配置没有问题的话,耐心等待一段时间就可以得 阅读全文

使用rdp协议访问远程Linux桌面

2011-01-06 20:01 by wwang, 35704 阅读, 3 推荐, 收藏, 编辑
摘要:一般情况下,如果需要登陆远程Linux系统,我们会使用ssh/telnet来完成,如果需要登陆到远程Linux系统的桌面环境,我们可能会使用VNC。VNC是大部分Linux发行版默认的基于RFB协议的远程桌面程序,但对于普通用户来说,VNC的用户体验并不好,它太慢了。当然,这个“慢”也不是不可以改进,如果我们选择一个强大的客户端,比如UltraVNC,操作会流畅不少。但是UltraVNC只支持Windows系统,在Linux下我还没找到与之相当的客户端。如果您使用过Windows下的远程桌面,应该会对其操作的流畅性有很深的印象。Windows的远程桌面基于RDP协议,在Linux下,我们也是可 阅读全文

Linux设备模型 (4)

2010-12-27 19:55 by wwang, 6362 阅读, 3 推荐, 收藏, 编辑
摘要:《Linux设备模型 (2)》和《Linux设备模型 (3)》主要通过一些简单的实作介绍了kobject、kset、kobj_type、attribute等数据结构的用法,但这些实作并没有涉及到实际环境下的设备模型和sysfs。本文将以/sys下的module子目录为例,看看内核是如何构建sysfs这棵大树的。(注:本文的分析基于2.6.36内核)module的创建当module被insmod到内核空间时,/sys/module目录下会相应创建一个和模块同名的目录。我们以usb_storage为例,在执行完sudo modprobe usb_storage之后,sysfs里会产生一个名为usb 阅读全文

Linux设备模型 (3)

2010-12-21 19:51 by wwang, 13873 阅读, 4 推荐, 收藏, 编辑
摘要:在上文中,我们介绍到如何使用default attribute。Default attribute使用很方便,但不够灵活。比如上篇文章在Kobject一节中提到的那个例子,name和val这两个attribute使用同一个show/store函数来访问,如果attribute非常多,show/store函数里的分支就会很凌乱。为了解决这个问题,我们可以参考内核提供的kobj_attribute。在内核里,kobj_attibute是这样定义的:每一个attribute会对应自己的show/store函数,这样就极大的提高了灵活性。可是,在上一篇文章中我们的认知是,sysfs是通过kobject 阅读全文

Linux设备模型 (2)

2010-12-16 00:11 by wwang, 11519 阅读, 7 推荐, 收藏, 编辑
摘要:上一篇文章《Linux设备模型 (1)》主要介绍了Linux设备模型在用户空间的接口sysfs,用户通过这个接口可以一览内核设备的全貌。本文将从Linux内核的角度来看一看这个设备模型是如何构建的。在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录。从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的作用,这里的其他结构体可以看作是kobject的派生类。Kobject为Linux设备模型提供了很多有用的功能,比如引用计数,接口抽象, 阅读全文

Linux设备模型 (1)

2010-12-09 00:21 by wwang, 15347 阅读, 7 推荐, 收藏, 编辑
摘要:随着计算机的周边外设越来越丰富,设备管理已经成为现代操作系统的一项重要任务,这对于Linux来说也是同样的情况。每次Linux内核新版本的发布,都会伴随着一批设备驱动进入内核。在Linux内核里,驱动程序的代码量占有了相当大的比重。下图是我在网络上搜索到的一幅Linux内核代码量的统计图,对应的内核版本是2.6.29。我们可以很明显的看到,在Linux内核中驱动程序的比例已经非常高了。Linux 2.6内核最初为了应付电源管理的需要,提出了一个设备模型来管理所有的设备。在物理上,外设之间是有一种层次关系的,比如把一个U盘插到笔记本上,实际上这个U盘是接在一个USB Hub上,USB Hub又是 阅读全文

Linux内核里的“智能指针” (续)

2010-12-03 22:13 by wwang, 5018 阅读, 1 推荐, 收藏, 编辑
摘要:在上一篇文章《Linux内核里的智能指针》里介绍了Linux内核如何使用引用计数来更加安全的管理内存,本文承接前篇,主要介绍几点使用kref时的注意事项。Linux内核文档kref.txt罗列了三条规则,我们在使用kref时必须遵守。规则一:If you make a non-temporary copy of a pointer, especially if it can be passed to another thread of execution, you must increment the refcount with kref_get() before passing it off 阅读全文

Linux内核里的“智能指针”

2010-12-02 22:22 by wwang, 17902 阅读, 7 推荐, 收藏, 编辑
摘要:众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异常。现代的C/C++类库一般会提供智能指针来作为内存管理的折中方案,比如STL的auto_ptr,Boost的Smart_ptr库,QT的QPointer家族,甚至是基于C语言构建的GTK+也通过引用计数来实现类似的功能。Linux内核是如何解决这个问题呢?同样作为C语言的解决方案,Linux内核采用的也是引用计数的方式。如果您更熟悉C++,可以把它类比为Boost的shared_ptr,或者是QT的QSharedPointer。在Linux内核里,引用计数是通过 阅读全文

玩转C链表

2010-11-28 20:50 by wwang, 44995 阅读, 17 推荐, 收藏, 编辑
摘要:链表是C语言编程中常用的数据结构,比如我们要建一个整数链表,一般可能这么定义:struct int_node { int val; struct int_node *next;};为了实现链表的插入、删除、遍历等功能,另外要再实现一系列函数,比如:void insert_node(struct int_node **head, int val);void delete_node(struct int_node *head, struct int_node *current);void access_node(struct int_node *head){ struct int_node *no 阅读全文