list_entry(ptr, type, member)语句理解 list_entry(ptr, type, member)语句定义在文件include/linux/list.h中。 00342: /** 00343: *list_entry-getthestructforthisentry 00344: *@ptr:the&structlist_headpointer. 00345: *@type:thetypeofthestructthisisembeddedin. 00346: *@member:thenameofthelist_structwithinthestruct. 00347: */ 00348: #definelist_entry(ptr, type, member)\ 00349: container_of(ptr,type,member) 00350: 而container_of()宏定义在文件include/linux/kernel.h。 00670: /** 00671: *container_of-castamemberofastructureouttothecontainingstructure 00672: *@ptr:thepointertothemember. 00673: *@type:thetypeofthecontainerstructthisisembeddedin. 00674: *@member:thenameofthememberwithinthestruct. 00675: * 00676: */ 00677: #definecontainer_of(ptr, type, member)({ \ 00678: consttypeof(((type*)0)–>member)*__mptr=(ptr); \ 00679: (type*)((char*)__mptr–offsetof(type,member));}) […]
READ MORE »Posts in category 内核基础
Linux升级LSISAS1068E控制器驱动方法
较低的mptsas驱动可能存在Bug,此时我们希望希望LSISAS1068E驱动。升级方法如下: 升级步骤: 1、从lsi官方网站下载最新驱动源码 下载网址为: http://www.lsi.com/search/Pages/downloads.aspx?k=* 找到对应内核版本的源码包,RHEL4/SLES9和RHEL5/SLES10有两个不同的源码包。 2、解压缩下载ZIP包,并找到源码包 如RHEL5上当前最新版本源码包文件为mptlinux-4.26.00.00-src.tar.gz 3、解压缩源码包,并编译 解压缩源码包后,进入源码目录,执行./compile脚本即可编译。 [root@houyi-vm33 ~]# tar zxf mptlinux-4.26.00.00-src.tar.gz [root@houyi-vm33 ~]# cd message/ [root@houyi-vm33 message]# pwd /root/message [root@houyi-vm33 message]# ls fusion [root@houyi-vm33 message]# cd fusion/ [root@houyi-vm33 fusion]# ls clean Kconfig lsi mptbase.h mptdebug.h mptlan.h mptscsih.c pound uload compile linux_compat.h Makefile mptctl.c mptfc.c mptsas.c mptscsih.h rejected_ioctls update csmi load mptbase.c […]
READ MORE »Ubuntu使用RHEL 6.1内核方法
安装RHEL内核步骤 1、RHEL6.1内核RPM包提取 从RHEL 6.1 x86_64系统ISO镜像文件(Red Hat Enterprise Linux 6.1 Server x86_64 .iso)里面将系统内核文件及firmware文件的rpm包提取出来存放(路径为:Red Hat Enterprise Linux 6.1 Server x86_64 .iso\Packages),提取出来的正确的文件名如下: kernel-2.6.32-131.0.15.el6.x86_64.rpm
READ MORE »Linux内核SCSI硬盘盘符分配
我们以Redhat Enterprise Linux 6内核源码2.6.32-71.e16版本为例,分析Linux内核SCSI层是如何给硬盘分配盘符的,即/dev/sda、/dev/sdb … /dev/sdm等盘符的由来。
READ MORE »FlashCache调试及内核栈信息
[328048.563382] Pid: 0, comm: swapper Tainted: G N 2.6.32.12-0.7-xen #1 [328048.563384] Call Trace: [328048.563401] [<ffffffff80009af5>] dump_trace+0x65/0x180 [328048.563412] [<ffffffff8034f056>] dump_stack+0x69/0x73 [328048.563420] [<ffffffff8019730b>] blk_update_request+0xbb/0x3d0 [328048.563426] [<ffffffff8019763f>] blk_update_bidi_request+0x1f/0x70 [328048.563432] [<ffffffff80198447>] blk_end_bidi_request+0x27/0x80 [328048.563461] [<ffffffffa00251fa>] scsi_end_request+0x3a/0xc0 [scsi_mod] [328048.563490] [<ffffffffa00255e9>] scsi_io_completion+0x109/0x4e0 [scsi_mod] [328048.563505] [<ffffffff8019daf5>] blk_done_softirq+0x85/0xa0 [328048.563512] [<ffffffff80044bbe>] __do_softirq+0xde/0x1a0 [328048.563518] [<ffffffff8000800c>] call_softirq+0x1c/0x30 [328048.563524] [<ffffffff80009635>] do_softirq+0xa5/0xe0 [328048.563530] [<ffffffff80258912>] evtchn_do_upcall+0x212/0x2a0 [328048.563536] [<ffffffff80007a6e>] do_hypervisor_callback+0x1e/0x30 [328048.563543] […]
READ MORE »Linux内核源码特殊用法
Linux内核源码主要以C语言为主,有一小部分涉及汇编语言,编译器使用的是Gcc。初次看内核源码,会遇到一些难以理解、晦涩的代码;而恰恰是这些晦涩的代码,在内核源码中经常出现。把一些晦涩、常见的代码看懂后,大家会发现看内核代码越来越顺利。 本文以x86_64架构中的Linux 2.6.32-71.el6(RHEL 6,点击下载)源码为例,选择一些经常出现且晦涩的源码进行解释,选择的源码虽以2.6.32-71.el6为例,但很多内容同样使用其他版本的源码。主要内容包括Gcc中C语言的扩展用法、及其他一些杂项。 点击阅读完整内容
READ MORE »[转]Linux Power Management Architecture
介绍Linux内核电源管理框架,非常不错的材料。 来源:http://home.dei.polimi.it/bellasi/doku.php?id=teaching:2010:embeddedsystems1 点击下载:Linux Power Management Architecture A review on Linux PM frameworks
READ MORE »Linux内核初始化时如何切换到64位模式
Linux内核初始化时,最初工作在CPU实地址模式下,然后进入保护模式。那么内核代码在哪里进入初始化CPU,让进入64位(x86_64)模式? Intel 64 CPU中,支持IA-32和IA-32e两种模式,如下图。IA-32e模式就是支持64位程序运行,也支持传统的32位程序运行。在Linux内核初始化时,要进入64位模式,就是进入Intel CPU的IA-32e模式。 本文以内核源码2.6.32-71.el6为例,切换到64位CPU模式源码在arch/x86/boot/compressed/head_64.S中。对于下面的设置步骤理解,可参考《Intel 64 and IA-32 Architectures Software Developer’s ManualVolume 3 (3A & 3B) System Programming Guide March 2011》. 这里补充一下IA32_EFER寄存器的含义。IA32_EFER寄存器是Intel CPU中的其中一个MSR(Model-Specific Registers)。在读写这个MSR寄存器之前,必须要先通过CPUID指令来确认这个寄存器是否存在。 00100: / * 00101: * Prepare for entering 64 bit mode 00102: */ 00103: 00104: / * Load new GDT with the 64bit segments using 32bit descriptor */ 00105: leal […]
READ MORE »