单独编译 kernel 中某些 ko 的方法

更改 Linux kernel 驱动每次重编 kernel 引导非常费力。为了便于调试,可以通过已经有的 Makefile 使用 gcc 来对特定 module 进行编译。这样只需要将 module 以模块方式加载。可以在 linux 环境下进行简单的调试。

命令:

make -C $src_path M=$(pwd) modules

例如:

make -C /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/ M=$(pwd) modules

[root@localhost ata]# ls
acard-ahci.c         libahci.mod.c       pata_artop.c    pata_it821x.c        pata_piccolo.c      sata_inic162x.c
ahci.c               libahci.mod.o       pata_at32.c     pata_ixp4xx_cf.c     pata_platform.c     sata_mv.c
ahci.h               libahci.o           pata_at91.c     pata_jmicron.c       pata_pxa.c          sata_mv.ko
ahci.ko              libata-acpi.c       pata_atiixp.c   pata_legacy.c        pata_qdi.c          sata_mv.mod.c
ahci.mod.c           libata-core.c       pata_atp867x.c  pata_macio.c         pata_radisys.c      sata_mv.mod.o
ahci.mod.o           libata-eh.c         pata_bf54x.c    pata_marvell.c       pata_rb532_cf.c     sata_mv.o
ahci.o               libata.h            pata_cmd640.c   pata_mpc52xx.c       pata_rdc.c          sata_nv.c
ahci_platform.c      libata-pmp.c        pata_cmd64x.c   pata_mpiix.c         pata_rz1000.c       sata_promise.c
ahci_platform.ko     libata-pmp.c.mod    pata_cs5520.c   pata_netcell.c       pata_samsung_cf.c   sata_promise.h
ahci_platform.mod.c  libata-scsi.c       pata_cs5530.c   pata_ninja32.c       pata_sc1200.c       sata_qstor.c
ahci_platform.mod.o  libata-sff.c        pata_cs5535.c   pata_ns87410.c       pata_scc.c          sata_sil24.c
ahci_platform.o      libata-transport.c  pata_cs5536.c   pata_ns87415.c       pata_sch.c          sata_sil.c
ata_generic.c        libata-transport.h  pata_cypress.c  pata_octeon_cf.c     pata_serverworks.c  sata_sis.c
ata_generic.ko       Makefile            pata_efar.c     pata_of_platform.c   pata_sil680.c       sata_svw.c
ata_generic.mod.c    modules.builtin     pata_hpt366.c   pata_oldpiix.c       pata_sis.c          sata_sx4.c
ata_generic.mod.o    modules.order       pata_hpt37x.c   pata_opti.c          pata_sl82c105.c     sata_uli.c
ata_generic.o        Module.symvers      pata_hpt3x2n.c  pata_optidma.c       pata_triflex.c      sata_via.c
ata_piix.c           pata_acpi.c         pata_hpt3x3.c   pata_palmld.c        pata_via.c          sata_vsc.c
Kconfig              pata_ali.c          pata_icside.c   pata_pcmcia.c        pdc_adma.c          sis.h
libahci.c            pata_amd.c          pata_isapnp.c   pata_pdc2027x.c      sata_dwc_460ex.c
libahci.ko           pata_arasan_cf.c    pata_it8213.c   pata_pdc202xx_old.c  sata_fsl.c
[root@localhost ata]# rm *.ko *.o -f
[root@localhost ata]# ls

acard-ahci.c         libata-sff.c        pata_cs5520.c     pata_mpc52xx.c       pata_radisys.c      sata_mv.mod.c
ahci.c               libata-transport.c  pata_cs5530.c     pata_mpiix.c         pata_rb532_cf.c     sata_nv.c
ahci.h               libata-transport.h  pata_cs5535.c     pata_netcell.c       pata_rdc.c          sata_promise.c
ahci.mod.c           Makefile            pata_cs5536.c     pata_ninja32.c       pata_rz1000.c       sata_promise.h
ahci_platform.c      modules.builtin     pata_cypress.c    pata_ns87410.c       pata_samsung_cf.c   sata_qstor.c
ahci_platform.mod.c  modules.order       pata_efar.c       pata_ns87415.c       pata_sc1200.c       sata_sil24.c
ata_generic.c        Module.symvers      pata_hpt366.c     pata_octeon_cf.c     pata_scc.c          sata_sil.c
ata_generic.mod.c    pata_acpi.c         pata_hpt37x.c     pata_of_platform.c   pata_sch.c          sata_sis.c
ata_piix.c           pata_ali.c          pata_hpt3x2n.c    pata_oldpiix.c       pata_serverworks.c  sata_svw.c
Kconfig              pata_amd.c          pata_hpt3x3.c     pata_opti.c          pata_sil680.c       sata_sx4.c
libahci.c            pata_arasan_cf.c    pata_icside.c     pata_optidma.c       pata_sis.c          sata_uli.c
libahci.mod.c        pata_artop.c        pata_isapnp.c     pata_palmld.c        pata_sl82c105.c     sata_via.c
libata-acpi.c        pata_at32.c         pata_it8213.c     pata_pcmcia.c        pata_triflex.c      sata_vsc.c
libata-core.c        pata_at91.c         pata_it821x.c     pata_pdc2027x.c      pata_via.c          sis.h
libata-eh.c          pata_atiixp.c       pata_ixp4xx_cf.c  pata_pdc202xx_old.c  pdc_adma.c
libata.h             pata_atp867x.c      pata_jmicron.c    pata_piccolo.c       sata_dwc_460ex.c
libata-pmp.c         pata_bf54x.c        pata_legacy.c     pata_platform.c      sata_fsl.c
libata-pmp.c.mod     pata_cmd640.c       pata_macio.c      pata_pxa.c           sata_inic162x.c
libata-scsi.c        pata_cmd64x.c       pata_marvell.c    pata_qdi.c           sata_mv.c
[root@localhost ata]# make -C /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/ M=$(pwd) modules
make: Entering directory `/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15'
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.o
/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.c: In function ‘ahci_init_one’:
/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.c:1226:67: warning: initialization from incompatible pointer type [enabled by default]
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.o
  CC [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.o
  Building modules, stage 2.
  MODPOST 5 modules
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ahci_platform.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/ata_generic.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/libahci.ko
  CC      /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.mod.o
  LD [M]  /home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15/drivers/ata/sata_mv.ko
make: Leaving directory `/home/edwin/rpmbuild/BUILD/kernel-2.6.40.fc15'
[root@localhost ata]# ls
acard-ahci.c         libahci.mod.c       pata_artop.c    pata_it821x.c        pata_piccolo.c      sata_inic162x.c
ahci.c               libahci.mod.o       pata_at32.c     pata_ixp4xx_cf.c     pata_platform.c     sata_mv.c
ahci.h               libahci.o           pata_at91.c     pata_jmicron.c       pata_pxa.c          sata_mv.ko
ahci.ko              libata-acpi.c       pata_atiixp.c   pata_legacy.c        pata_qdi.c          sata_mv.mod.c
ahci.mod.c           libata-core.c       pata_atp867x.c  pata_macio.c         pata_radisys.c      sata_mv.mod.o
ahci.mod.o           libata-eh.c         pata_bf54x.c    pata_marvell.c       pata_rb532_cf.c     sata_mv.o
ahci.o               libata.h            pata_cmd640.c   pata_mpc52xx.c       pata_rdc.c          sata_nv.c
ahci_platform.c      libata-pmp.c        pata_cmd64x.c   pata_mpiix.c         pata_rz1000.c       sata_promise.c
ahci_platform.ko     libata-pmp.c.mod    pata_cs5520.c   pata_netcell.c       pata_samsung_cf.c   sata_promise.h
ahci_platform.mod.c  libata-scsi.c       pata_cs5530.c   pata_ninja32.c       pata_sc1200.c       sata_qstor.c
ahci_platform.mod.o  libata-sff.c        pata_cs5535.c   pata_ns87410.c       pata_scc.c          sata_sil24.c
ahci_platform.o      libata-transport.c  pata_cs5536.c   pata_ns87415.c       pata_sch.c          sata_sil.c
ata_generic.c        libata-transport.h  pata_cypress.c  pata_octeon_cf.c     pata_serverworks.c  sata_sis.c
ata_generic.ko       Makefile            pata_efar.c     pata_of_platform.c   pata_sil680.c       sata_svw.c
ata_generic.mod.c    modules.builtin     pata_hpt366.c   pata_oldpiix.c       pata_sis.c          sata_sx4.c
ata_generic.mod.o    modules.order       pata_hpt37x.c   pata_opti.c          pata_sl82c105.c     sata_uli.c
ata_generic.o        Module.symvers      pata_hpt3x2n.c  pata_optidma.c       pata_triflex.c      sata_via.c
ata_piix.c           pata_acpi.c         pata_hpt3x3.c   pata_palmld.c        pata_via.c          sata_vsc.c
Kconfig              pata_ali.c          pata_icside.c   pata_pcmcia.c        pdc_adma.c          sis.h
libahci.c            pata_amd.c          pata_isapnp.c   pata_pdc2027x.c      sata_dwc_460ex.c
libahci.ko           pata_arasan_cf.c    pata_it8213.c   pata_pdc202xx_old.c  sata_fsl.c

gcc: error: elf_i386/elf_x86_64: No such file or directory

最近碰到个 PM 连接的硬盘在 Fedora 15 (FC15)中无法识别的问题,但是在 Fedora 13 中却是可以侦测到的。对比 fc13 使用的是 2.6.34,fc15 则是 2.6.40(3.0.4)。决定逐一将 kernel 降级来判断到底是从那一版的 kernel 开始出现这个问题的。那在使用 fc15 的 gcc 编译 2.6.36.2 以下 kernel 时,一直报错。

错误提示:

gcc: error: elf_x86_64: No such file or directory

解决方法:

这个问题是由于 gcc 4.6 不再支持 linker-style 架构。讲 arch/x86/vdso/Makefile 中,

将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。
将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"。

可以解决这个问题。

 

参考链接:https://bbs.archlinux.org/viewtopic.php?id=119341

【转】Linux Kernel 内核编译安装

一、获取内核源码文件。

从http://www.kernel.org下载内核源码包(linux-2.6.26.tar.gz)。

# cp linux-2.6.26.tar.gz /usr/src
# tar -xvzf linux-2.6.26.tar.gz
# ln -s linux-2.6.26  linux-2.6

二、配置内核。

1. 进入内核文件所在目录。
    # cd /usr/src/linux-2.6

2. 编辑 /usr/src/linux-2.6/Makefile 文件的EXTRAVERSION的值。
    EXTRAVERSION = No_Power_Management_Support   # 以此标识内核

3. 运行命令make mrproper,以确保源文件处于一致、干净的状态。这个命令会删除内核配置文件.config(如果有的话)。

4. 保存默认的配置文件(/usr/src/linux-2.6/arch/x86/i386_defconfig)到安全位置,比如软盘,以便必要时恢复默认配置。

5. 使用配置工具设置内核选项。

#make config(基于文本的最为传统的配置界面,由于有几百个问题要回答,一般使用其它的配置工具。)
#make menuconfig(基于文本选单的配置界面)
#make xconfig(基于图形窗口模式的配置界面)
#make oldconfig(使用已有的内核配置文件,仅提示一些新的特性。)

选择相应的配置时,有三种选择:  

 “Y”- 将该功能编译进内核
 “N”- 不将该功能编译进内核
 “M”- 将该功能编译成可以在需要时动态插入到内核中的模块。

参考:Linux 2.6.19.x 内核编译配置选项简介

设置完选项后,保存更改。上述配置工具会生成配置文件 /usr/src/linux-2.6.26/.config

如果要使用现有的配置文件(比如默认的配置文件),首先将该配置文件拷贝为/usr/src/linux-2.6/.config,然后执行命令    make oldconfig

三、编译内核。

1.make clean
   清除前面过程中make后遗留下的文件。

2.make dep
   读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。2.6内核不需要执行此步骤。

3.make zImage
   make bzImage

   这两个命令会在/usr/src/linux-2.6下创建文件vmlinux,这是未压缩的内核。

   make zImage 和 make bzImage 会各自在/usr/src/linux/arch/i386/boot/下创建文件zImage和bzImage,这是已经压缩的内核。zImage是用gzip压缩的,适合存储在软盘上的内核。bzImage是更大的超过软盘空间限制的压缩内核。

4.make modules   编译生成相应的模块。

5.make modules_install
   一旦模块被编译,它们须被拷贝到相应的子目录/lib/modules下,make modules_install 命令执行这一任务。
   模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行make modules_install之前最好对/lib/modules进行备份。

6.make install 通过执行以下步骤完成安装。
  (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; 
  (2)修改bootloader的配置文件;
  (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:

  title Red Hat Linux (2.***)
  root(hd0, 1)
  kernel /boot/vmlinuz-2.*** ro root=LABEL=/
  initrd /boot/initrd-2.***.img

 

转自:http://wanghongwei.iteye.com/blog/232543

Linux 下使用 Crontab 命令实现定时操作重启(计划任务)

crond 服务是一个定时执行的服务,可以通过 crontab 命令添加或者编辑需要定时执行的任务:

  • crontab -u //设定某个用户的 crond 服务,一般 root 用户在执行这个命令的时候需要此参数
  • crontab -l //列出某个用户的 crond 服务的详细内容
  • crontab -r //删除没个用户的 crond 服务
  • crontab -e //编辑某个用户的 crond 服务

编辑中的内容格式:

#MIN HOUR DAY MONTH DAYOFWEEK COMMAND

 

比如:

  • #每天早上6点10分

        10 6 * * * date

  • #每两个小时

        0 */2 * * * date (solaris 5.8似乎不支持此种写法)

  • #晚上11点到早上8点之间每两个小时,早上8点

        0 23-7/2,8 * * * date

  • #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

        0 11 4 * mon-wed date

  • #1月份日早上4点

        0 4 1 jan * date