• linux下运行minecraft并加载mod

    前言

    之前随便架设了一个服务器供小伙伴玩耍,后来小伙伴表示希望minecraft能提供更多功能。最近正好有时间就想建一个新的可加载mod的服务器。为了能将整个过程讲述清楚,该篇文章我们先来讲一讲如何单机加载mod,然后在后续的文章里介绍如何在服务器里加载mod。本系列文章主要是小白向,帮助大家快速入门使用minecraft。

    目录

    简介

    正式开始之前我们先来简单地介绍一下minecraft。

    1. minecraft主文件
      在linux下,minecraft会被安装到.minecraft 文件夹。因为minecraft是用java写的,所以使得该游戏可以跨越三大平台(windows,linux,mac os)。minecraft游戏可以在官方网站 购买下载。

    2. 启动器
      启动minecraft需要启动器,minecraft官方会提供一个启动器,该启动器在启动游戏后,需要官方提供的用户名和密码。除了官方提供的启动器外,还有各种各样第三方的启动器,比如这篇文章用到的HMCL启动器,第三方启动器可以绕过官方的认证。官方版本会提供官方服务器,皮肤等服务,推荐大家购买正版。

    3. 材质包
      一般人第一次见到minecraft,都会吐槽该游戏的粗糙画质。所以人们开发了minecraft的各种各样的材质包,可以让minecraft看起来更好看。

    4. mod
      人们开发了各种各样的minecraft插件,称之为mod,可以使得游戏在原始的基础上具备了各种各样的功能,比如可以制造飞机等。
      对于各种mod,有很多软甲加载mod文件,这里我们只使用Forge和LiteLoader。

    安装游戏

    1. 首先确保安装了Java SE Runtime Environment(JRE)
      windows安装
      下载地址
      linux安装
      我使用的时deepin,可以直接在软件商店找到
      ubuntu可以使用

      $ sudo add-apt-repository ppa:webupd8team/java
      $ sudo apt-get update
      $ sudo apt-get install oracle-java8-installer
    2. 安装minecraft
      2.1 下载启动器
      这里我推荐HMCL启动器(点击下载)
      在下载页面中找到下载链接,选择通用版jar
      这里写图片描述

      我下载的文件名为HMCL-2.7.7.25.jar

      2.2 安装minecraft
      打开终端,

      $ cd ~/你下载启动器的目录
      $ java -jar HMCL-2.7.7.25.jar

      在打开的窗口中依次选取

      1 游戏设置
      2游戏下载
      3找到你要下载的版本,点击。这里以1.10.2为例
      4点击下载,稍等片刻
      这里写图片描述

      2.3尝试运行
      点击窗口上方的”主页”
      在”名字”方框中输入自己的名字
      点击启动游戏
      启动过程中可能会提示缺少材质,问是否下载,选是。
      这里写图片描述

      2.4 成功启动后就可以玩最标准的minecraft了

    安装mod加载器

    HMCL启动器集成了Forge和LiteLoader安装。HMCL只能单独地调用Forge和LiteLoader,但是我们需要让两个加载器同时生效。所以Forge我们借用HMCL,LiteLoader需要我们自己手动安装。
    1安装Forge
    这里写图片描述
    2运行Forge minecraft
    在版本处选取带有forge字样的版本。
    这里写图片描述
    3 安装LiteLoader
    下载地址
    找到符合自己的版本,选择通用版下载

    ``` bash
    $ java -jar liteloader-installer-1.10.2-00.jar
    ```
    在弹出窗口选择
    "Extract LiteLoader jar"
    解压路径找到.minecraft/mods文件夹。.minecraft文件夹在"/home/linux用户名"或者在HMCL所在目录下。
    点击确定。
    ![这里写图片描述](https://img-blog.csdn.net/20170607195037315?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2l0aHViXzM5MDY4MTQ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    

    至此,mod的启动器安装完毕。

    安装mod

    这里我们以安装“小地图voxelMap Mod”作为例子。
    1 下载
    下载地址
    2 安装
    启动HMCL
    在mod管理里点击添加,找到刚才下载到的mod文件,这里为’mod_voxelMap_1.6.21_for_1.10.2.litemod’
    这里写图片描述
    3 运行Forge minecraft
    就可以在minecraft里出现小地图了。

    更多的mod可以在http://www.minecraftxz.com/找到

    展开全文
  • 我们可以为代码清单4.1的模板编写一个简单的Makefile: obj-m := hello.o 并使用如下命令编译Hello World模块:  make -C /usr/src/linux-2.6.15.5/ M=

    http://hi.baidu.com/justin_huangjh/blog/item/a211254502d73b3b87947313.html


    我们可以为代码清单4.1的模板编写一个简单的Makefile:

    obj-m := hello.o

    并使用如下命令编译Hello World模块:

           make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

           如果当前处于模块所在的目录,则以下命令与上述命令同等:

             make –C /usr/src/linux-2.6.15.5 M=$(pwd) modules

           其中-C后指定的是Linux内核源代码的目录,而M=后指定的是hello.c和Makefile所在的目录,编译结果如下:

    [root@localhost driver_study]# make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

    make: Entering directory `/usr/src/linux-2.6.15.5'

    CC [M] /driver_study/hello.o

    /driver_study/hello.c:18:35: warning: no newline at end of file

    Building modules, stage 2.

    MODPOST

    CC      /driver_study/hello.mod.o

    LD [M] /driver_study/hello.ko

    make: Leaving directory `/usr/src/linux-2.6.15.5'

    从中可以看出,编译过程中,经历了这样的步骤:先进入Linux内核所在的目录,并编译出hello.o文件,运行MODPOST会生成临时的hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录。

           中间生成的hello.mod.c文件的源代码如代码清单4.7所示。

    代码清单4.7 模块编译时生成的.mod.c文件

    1    #include <linux/module.h>

    2    #include <linux/vermagic.h>

    3    #include <linux/compiler.h>

    4   

    5    MODULE_INFO(vermagic, VERMAGIC_STRING);

    6   

    7    struct module __this_module

    8    __attribute__((section(".gnu.linkonce.this_module"))) = {

    9    .name = KBUILD_MODNAME,

    10    .init = init_module,

    11    #ifdef CONFIG_MODULE_UNLOAD

    12    .exit = cleanup_module,

    13    #endif

    14    };

    16    static const char __module_depends[]

    17    __attribute_used__

    18    __attribute__((section(".modinfo"))) =

    19    "depends=";

    hello.mod.o产生了ELF(Linux所采用的可执行/可连接的文件格式)的2个节,即modinfo和.gun.linkonce.this_module。

    如果一个模块包括多个.c文件(如file1.c、file2.c),则应该以如下方式编写Makefile:

    obj-m := modulename.o

    modulename-objs := file1.o file2.o   

    -----------------------------------------------------------------

    http://blog.csdn.net/zhaokugua/archive/2007/11/02/1862500.aspx

    4.9模块的编译

    ----------------------------------------------------------------------

    2.4内核中,模块的编译只需内核源码头文件;需要在包含linux/modules.h之前定义MODULE;编译、连接后生成的内核模块后缀为.o。

    2.6内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀为.ko;编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。

    清单2:2.4 内核模块的Makefile模板 

    #Makefile2.4
    KVER=$(shell uname -r)
    KDIR=/lib/modules/$(KVER)/build
    OBJS=mymodule.o
    CFLAGS=-D__KERNEL__ -I$(KDIR)/include -DMODULE -D__KERNEL_SYSCALLS__ -DEXPORT_SYMTAB
      -O2 -fomit-frame-pointer  -Wall  -DMODVERSIONS -include $(KDIR)/include/linux/modversions.h
    all: $(OBJS)
    mymodule.o: file1.o file2.o
     ld -r -o $@ $^
    clean:
     rm -f *.o

    在2.4 内核下,内核模块的Makefile与普通用户程序的Makefile在结构和语法上都相同,但是必须在CFLAGS中定义-D__KERNEL__- DMODULE,指定内核头文件目录-I$(KDIR)/include。有一点需注意,之所以在CFLAGS中定义变量,而不是在模块源码文件中定义,一方面这些预定义变量可以被模块中所有源码文件可见,另一方面等价于将这些预定义变量定义在源码文件的起始位置。在模块编译中,对于这些全局的预定义变量,一般在CFLAGS中定义。


    清单3:2.6 内核模块的Makefile模板

    # Makefile2.6
    ifneq ($(KERNELRELEASE),)
    #kbuild syntax. dependency relationshsip of files and target modules are listed here.
    mymodule-objs := file1.o file2.o
    obj-m := mymodule.o 
    else
    PWD  := $(shell pwd)
    KVER ?= $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build
    all:
     $(MAKE) -C $(KDIR) M=$(PWD) 
    clean:
    rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
    endif

    KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时, KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o与file2.o 连接生成。obj-m := mymodule.o表示编译连接后将生成mymodule.o模块。

    补充一点,"$(MAKE) -C $(KDIR) M=$(PWD)"与"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是较老的使用方法。推荐使用M而不是SUBDIRS,前者更明确。

    通过以上比较可以看到,从Makefile编写来看,在2.6内核下,内核模块编译不必定义复杂的CFLAGS,而且模块中各文件依赖关系的表示简洁清晰。


    清单4: 可同时在2.4 与 2.6 内核下工作的Makefile

    #Makefile for 2.4 & 2.6
    VERS26=$(findstring 2.6,$(shell uname -r))
    MAKEDIR?=$(shell pwd)
    ifeq ($(VERS26),2.6)
    include $(MAKEDIR)/Makefile2.6
    else
    include $(MAKEDIR)/Makefile2.4
    endif
    展开全文
  • 在/boot/grub/目录下,我们可以发现: 915resolution.mod crypto.lst gcry_md5.mod iso9660.mod multiboot2.mod raid6rec.mod ufs2.mod acpi.mod crypto.mod
    在/boot/grub/目录下,我们可以发现:
    915resolution.mod  crypto.lst                   gcry_md5.mod        iso9660.mod     multiboot2.mod       raid6rec.mod        ufs2.mod
    acpi.mod           crypto.mod                   gcry_rfc2268.mod    jfs.mod         nilfs2.mod           read.mod            uhci.mod
    affs.mod           cs5536.mod                   gcry_rijndael.mod   jpeg.mod        normal.mod           reboot.mod          usb.mod
    afs.mod            date.mod                     gcry_rmd160.mod     kernel.img      ntfs.mod             regexp.mod          usb_keyboard.mod
    afs_be.mod         datehook.mod                 gcry_seed.mod       keylayouts.mod  ntfscomp.mod         reiserfs.mod        usbms.mod
    aout.mod           datetime.mod                 gcry_serpent.mod    keystatus.mod   ntldr.mod            relocator.mod       usbserial_common.mod
    at_keyboard.mod    diskboot.img                 gcry_sha1.mod       legacycfg.mod   ohci.mod             scsi.mod            usbserial_ftdi.mod
    ata.mod            dm_nv.mod                    gcry_sha256.mod     linux.mod       part_acorn.mod       search.mod          usbserial_pl2303.mod
    ata_pthru.mod      drivemap.mod                 gcry_sha512.mod     linux16.mod     part_amiga.mod       search_fs_file.mod  usbtest.mod
    befs.mod           echo.mod                     gcry_tiger.mod      lnxboot.img     part_apple.mod       search_fs_uuid.mod  vbe.mod
    befs_be.mod        efiemu.mod                   gcry_twofish.mod    loadenv.mod     part_bsd.mod         search_label.mod    vga.mod
    biosdisk.mod       efiemu32.o                   gcry_whirlpool.mod  locale          part_gpt.mod         sendkey.mod         vga_text.mod
    bitmap.mod         efiemu64.o                   gettext.mod         loopback.mod    part_msdos.mod       serial.mod          video.lst
    bitmap_scale.mod   elf.mod                      gfxmenu.mod         ls.mod          part_sun.mod         setjmp.mod          video.mod
    blocklist.mod      example_functional_test.mod  gfxterm.mod         lsacpi.mod      part_sunpc.mod       setpci.mod          video_bochs.mod
    boot.img           ext2.mod                     gptsync.mod         lsapm.mod       partmap.lst          sfs.mod             video_cirrus.mod
    boot.mod           extcmd.mod                   grldr.img           lsmmap.mod      parttool.lst         sleep.mod           video_fb.mod
    bsd.mod            fat.mod                      grub.cfg            lspci.mod       parttool.mod         squash4.mod         videoinfo.mod
    btrfs.mod          font.mod                     grubenv             lvm.mod         password.mod         tar.mod             videotest.mod
    bufio.mod          fs.lst                       gzio.mod            mdraid09.mod    password_pbkdf2.mod  terminal.lst        xfs.mod
    cat.mod            fshelp.mod                   halt.mod            mdraid1x.mod    pbkdf2.mod           terminal.mod        xnu.mod
    cdboot.img         functional_test.mod          hashsum.mod         memdisk.mod     pci.mod              terminfo.mod        xnu_uuid.mod
    chain.mod          g2hdr.img                    hdparm.mod          memrw.mod       play.mod             test.mod            xzio.mod
    cmostest.mod       gcry_arcfour.mod             hello.mod           minicmd.mod     png.mod              test_blockarg.mod   zfs.mod
    cmp.mod            gcry_blowfish.mod            help.mod            minix.mod       probe.mod            testload.mod        zfsinfo.mod
    command.lst        gcry_camellia.mod            hexdump.mod         minix2.mod      pxe.mod              tga.mod
    configfile.mod     gcry_cast5.mod               hfs.mod             mmap.mod        pxeboot.img          trig.mod
    core.img           gcry_crc.mod                 hfsplus.mod         moddep.lst      pxecmd.mod           true.mod
    cpio.mod           gcry_des.mod                 hwmatch.mod         msdospart.mod   raid.mod             udf.mod
    cpuid.mod          gcry_md4.mod                 iorw.mod            multiboot.mod   raid5rec.mod         ufs1.mod

    这里有很多的以mod为后缀的文件,其具体意义为:

    常规命令
    ---------------------------------------------------------
    pxe.mod                                Driver to provide access to the pxe filesystem
    pxecmd.mod                             Command to control the PXE device
    cat.mod                                Show the contents of a file. 显示文件内容

    cmp.mod                                Compare two files.

    configfile.mod                         configure - Load another config file.
                                           source    - Load another config file without changing context.
                                           .         - Load another config file without changing context.

    cpuid.mod                              Check for CPU features
    crc.mod                                Calculate the crc32 checksum of a file.
    echo.mod                               Display a line of text.

    halt.mod                               halts the computer.  This command does not work on all firmware.
    suspend.mod                            Halt the system, if possible using APM

    hello.mod                              Say hello
    help.mod                               Show a help message.
    hexdump.mod                            Dump the contents of a file or memory.

    ls.mod                                 List devices and files.
    lspci.mod                              List PCI devices
    normal.mod                       Grub2 的常规模式(于此对应的是安全模式,内置于 kernel 中)

    pci.mod
    play.mod                         播放音频文件 (体验功能) Play a tune
    read.mod                               Set variable with user input
    reboot.mod                             Reboot the computer. 重启计算机

    search.mod                             Search devices by file, filesystem label or filesystem UUID.
    serial.mod

    sleep.mod                              Wait for a specified number of seconds

    terminal.mod                           Select a terminal.
    terminfo.mod                           Set terminfo type.
    test.mod                               test -
                                              [ - Evaluate an expression

    ieee1275_suspend                       Return to Open Firmware prompt


    分区管理
    ---------------------------------------------------------
    pc.mod                                 pc 机上的分区类型(主分区、扩展分区)管理
    sun.mod                                sun 机上的分区类型管理
    gpt.mod                                Read GUID Partition Tables (GPT).
    apple.mod                              苹果机的分区管理
    acorn.mod                              Linux/ADFS partition tables.
    amiga.mod                              Amiga partition tables (RDB).


    图形相关:
    ---------------------------------------------------------
    vga.mod                                字符终端
    gfxterm.mod                            图形终端
                                           background_image - Load background image for active terminal.
                                           
    font.mod                               Specify one or more font files to display.

    vbe.mod                                pc 上图形核心库
    vbeinfo.mod                            List compatible VESA BIOS extension video modes.
    vbetest.mod                            Test VESA BIOS Extension 2.0+ support

    video.mod
    videotest.mod                          Test video subsystem

    bitmap.mod                             图片格式基类
    jpeg.mod                               JPG 图片格式解码
    tga.mod                                TGA 图片格式解码
    png.mod                                PNG 图片格式解码


    文件系统
    ---------------------------------------------------------
    affs.mod                               Amiga Fast FileSystem.
    afs.mod                                The native AtheOS file-system.
    cpio.mod                               cpio and tar filesystem.

    ext2.mod                               Second Extended filesystem
    fat.mod                                FAT filesystem
    hfs.mod                                HFS
    hfsplus.mod                            HFS+ Filesystem.
    iso9660.mod                            iso9660 implementation with extensions: SUSP, Rock Ridge. (光盘文件系统)
    jfs.mod                                JFS
    minix.mod                              The minix filesystem, version 1 and 2.
    ntfs.mod                               NTFS filesystem
    ntfscomp.mod                           compression support for the NTFS filesystem
    reiserfs.mod                           ReiserFS versions up to 3.6
    sfs.mod                                Amiga Smart FileSystem.
    udf.mod                                Universal Disk Format filesystem. (光盘文件系统)
    ufs.mod                                Unix File System
    xfs.mod                                XFS

    fshelp.mod                             Filesystem helper functions (查找文件、读取文件操作)


    磁盘访问
    ---------------------------------------------------------
    ata.mod                                ATA disk access.
    fs_uuid.mod                            Access disks by their filesystem UUID.
    host.mod                               Dummy disk driver to provide access to the hosts filesystem. (grub-emu 用以访问宿主文件系统)
    loopback.mod                           Make a device of a file. (command to add loopback devices.)

    biosdisk.mod                           BIOS 磁盘设备 (cdrom, hdd, cdrom 访问层)
    lvm.mod                                module to read Logical Volumes. (加密卷)
    memdisk.mod                            Access embedded memory disk
    raid.mod                               module to read RAID arrays.


    引导器
    ---------------------------------------------------------
    appleloader.mod                        Boot legacy system. (apple legacy boot loader.)

    multiboot.mod                          multiboot - Load a Multiboot kernel.
                                           module    - Load a Multiboot module.

    linux.mod                              linux    - Load a linux kernel.
                                           initrd   - Load an initrd.
                                           
    loadenv.mod                            load_env - Load variables from environment block file.
                                           save_env - Save variables to environment block file.

    blocklist.mod                          Print a block list.
    boot.mod                               Boot an operating system.

    bsd.mod                                freebsd - load freebsd kernel
                                           openbsd - load openbsd kernel
                                           netbsd  - load netbsd kernel
                                           freebsd_loadenv
                                                   - load freebsd env
                                           freebsd_module
                                                   - load freebsd module
    chain.mod                              load another boot loader


    其他 (未知)
    ---------------------------------------------------------
    aout.mod
    elf.mod

    _bsd.mod
    _chain.mod
    _linux.mod
    _multiboot.mod


    IO hook
    ---------------------------------------------------------
    bufio.mod                              buffered io access
    gzio.mod                               decompression support for gzip


    展开全文
  • 最近在学习linux的驱动,之前做嵌入式实验的时候加载驱动模块都是.o文件,但是现在发现很多驱动模块都是.ko文件,于是上网查了一下两者的区别,现在贴出来,和大家一起分享。 .o文件也就是object文件,.ko...

    最近在学习linux的驱动,之前做嵌入式实验的时候加载驱动模块都是.o文件,但是现在发现很多驱动模块都是.ko文件,于是上网查了一下两者的区别,现在贴出来,和大家一起分享。
      .o文件也就是object文件,.ko文件是kernel object文件,与.o的区别在于其多了一些sections,比如.modinfo。.modinfo section是由kernel source里的modpost工具生成的,包括MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE, device ID table以及模块依赖关系等等。depmod工具根据.modinfo section生成modules.dep, modules.*map等文件,以便modprobe更方便的加载模块。
      在2.6内核下编译driver, 首先要确认你的linux系统里有没有kernel tree,检查的方法是看看文件夹/lib/modules/$(uname -r)/build是否指向source code,并进去看看,是否有Makefile, include, scripts等文件夹,在scripts/mod下可以找到前面提到的modpost,这个是生成.ko的关键。如果没有kernel tree,需要重新build一份kernel来建立这个kernel tree。
      在2.4内核中,生成的就是.o文件。2.6的kernel对内核模块的管理做了一些扩展,生成的就是.ko文件。
    展开全文
  • .mod.c 是什么文件

    2014-10-21 17:39:37
    转自:http://www.cnblogs.com/felixjia/archive/2011/09/15/2178126.html

    转自:http://www.cnblogs.com/felixjia/archive/2011/09/15/2178126.html

     

    我们可以为代码清单4.1的模板编写一个简单的Makefile:

    obj-m := hello.o

    并使用如下命令编译Hello World模块:

           make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

           如果当前处于模块所在的目录,则以下命令与上述命令同等:

             make –C /usr/src/linux-2.6.15.5 M=$(pwd) modules

           其中-C后指定的是Linux内核源代码的目录,而M=后指定的是hello.c和Makefile所在的目录,编译结果如下:

    [root@localhost driver_study]# make -C /usr/src/linux-2.6.15.5/ M=/driver_study/ modules

    make: Entering directory `/usr/src/linux-2.6.15.5'

    CC [M] /driver_study/hello.o

    /driver_study/hello.c:18:35: warning: no newline at end of file

    Building modules, stage 2.

    MODPOST

    CC      /driver_study/hello.mod.o

    LD [M] /driver_study/hello.ko

    make: Leaving directory `/usr/src/linux-2.6.15.5'

    从中可以看出,编译过程中,经历了这样的步骤:先进入Linux内核所在的目录,并编译出hello.o文件,运行MODPOST会生成临时的hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录。

           中间生成的hello.mod.c文件的源代码如代码清单4.7所示。

    代码清单4.7 模块编译时生成的.mod.c文件

    1    #include <linux/module.h>

    2    #include <linux/vermagic.h>

    3    #include <linux/compiler.h>

    4   

    5    MODULE_INFO(vermagic, VERMAGIC_STRING);

    6   

    7    struct module __this_module

    8    __attribute__((section(".gnu.linkonce.this_module"))) = {

    9    .name = KBUILD_MODNAME,

    10    .init = init_module,

    11    #ifdef CONFIG_MODULE_UNLOAD

    12    .exit = cleanup_module,

    13    #endif

    14    };

    16    static const char __module_depends[]

    17    __attribute_used__

    18    __attribute__((section(".modinfo"))) =

    19    "depends=";

    hello.mod.o产生了ELF(Linux所采用的可执行/可连接的文件格式)的2个节,即modinfo和.gun.linkonce.this_module。

    如果一个模块包括多个.c文件(如file1.c、file2.c),则应该以如下方式编写Makefile:

    obj-m := modulename.o

    modulename-objs := file1.o file2.o   

    -----------------------------------------------------------------

    http://blog.csdn.net/zhaokugua/archive/2007/11/02/1862500.aspx

    4.9模块的编译

    ----------------------------------------------------------------------

    2.4内核中,模块的编译只需内核源码头文件;需要在包含linux/modules.h之前定义MODULE;编译、连接后生成的内核模块后缀为.o。

    2.6内核中,模块的编译需要配置过的内核源码;编译、连接后生成的内核模块后缀为.ko;编译过程首先会到内核源码目录下,读取顶层的Makefile文件,然后再返回模块源码所在目录。

    清单2:2.4 内核模块的Makefile模板

     

    #Makefile2.4
    KVER=$(shell uname -r)
    KDIR=/lib/modules/$(KVER)/build
    OBJS=mymodule.o
    CFLAGS=-D__KERNEL__ -I$(KDIR)/include -DMODULE -D__KERNEL_SYSCALLS__ -DEXPORT_SYMTAB
      -O2 -fomit-frame-pointer  -Wall  -DMODVERSIONS -include $(KDIR)/include/linux/modversions.h
    all: $(OBJS)
    mymodule.o: file1.o file2.o
     ld -r -o $@ $^
    clean:
     rm -f *.o

     

    在2.4 内核下,内核模块的Makefile与普通用户程序的Makefile在结构和语法上都相同,但是必须在CFLAGS中定义-D__KERNEL__- DMODULE,指定内核头文件目录-I$(KDIR)/include。有一点需注意,之所以在CFLAGS中定义变量,而不是在模块源码文件中定义,一方面这些预定义变量可以被模块中所有源码文件可见,另一方面等价于将这些预定义变量定义在源码文件的起始位置。在模块编译中,对于这些全局的预定义变量,一般在CFLAGS中定义。


    清单3:2.6 内核模块的Makefile模板

     

    # Makefile2.6
    ifneq ($(KERNELRELEASE),)
    #kbuild syntax. dependency relationshsip of files and target modules are listed here.
    mymodule-objs := file1.o file2.o
    obj-m := mymodule.o 
    else
    PWD  := $(shell pwd)
    KVER ?= $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build
    all:
     $(MAKE) -C $(KDIR) M=$(PWD) 
    clean:
    rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
    endif

     

    KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时, KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。mymodule-objs := file1.o file2.o表示mymoudule.o 由file1.o与file2.o 连接生成。obj-m := mymodule.o表示编译连接后将生成mymodule.o模块。

    补充一点,"$(MAKE) -C $(KDIR) M=$(PWD)"与"$(MAKE) -C $(KDIR) SUBDIRS =$(PWD)"的作用是等效的,后者是较老的使用方法。推荐使用M而不是SUBDIRS,前者更明确。

    通过以上比较可以看到,从Makefile编写来看,在2.6内核下,内核模块编译不必定义复杂的CFLAGS,而且模块中各文件依赖关系的表示简洁清晰。


    清单4: 可同时在2.4 与 2.6 内核下工作的Makefile

     

    #Makefile for 2.4 & 2.6
    VERS26=$(findstring 2.6,$(shell uname -r))
    MAKEDIR?=$(shell pwd)
    ifeq ($(VERS26),2.6)
    include $(MAKEDIR)/Makefile2.6
    else
    include $(MAKEDIR)/Makefile2.4
    endif

     

    展开全文
  • GRUB2中的.mod文件

    2012-03-05 15:40:51
    对于大多数人来说,引导加载程序并不是操作系统中最让人激动的部分,但它们却是极其重要的。...GRUB 2 是 Ubuntu 9.10 中的默认引导加载程序,也是其他许多主流 Linux 发行版的默认引导加载程序。其他发行版迟早都会将
  • 目录 目录 1 1.前言 1 2.PAM 2 3.pam_limits 2 4.limits.conf的由来 3 5.模块入口函数 4 6.解析limits.conf 6 7.生效limits.conf 7 8.systemctl和systemd 8 ...附3:使用meson编译system...
  • 相信很多人都在windows环境开发好项目后再布置到linux上,但这个时候或许你发现...第一、编辑httpd.conf文件1、 - 在etc/httpd/conf/目录下的httpd.conf 文件,找到:LoadModule rewrite_module modules/mod_rewrite.so
  • 配置主配置文件  用vi或其它文件编辑器编辑主配置文件httpd.conf :  vi /usr/local/apache-2.2.6/conf/httpd.conf  按下面提示进行修改: ###=========httpd.conf begin=================== ##Apache主配置...
  •  首先打开/usr/local/apache2/conf/httpd.conf文件,修改三处,  1.查看该行LoadModule rewrite_module modules/mod_rewrite.so,是否有#号,如果有去掉该#号注释  2.找到行Options FollowSymLinks,并修改行...
  • 从git上下载了最新版本的源码,放在我的ubuntu系统下,首先从现有ubuntu系统的boot目录下,拷贝了config-3.13.0-32-generic文件linux源码根目录下,改名为.config文件。然后make clean,make menuconfig,save,...
  • error:file '/boot/grub/i386-pc/normal.mod' not found 网上找了不少的办法,看到的大致雷同,提到的几个命令应该记录一下。在救援模式下,只有很少的命令可是使用: set 设置环境变量 ls 查看设备 insmod 加载...
  • windows下的尝试: gomod初尝试 下载官方包1.11(及其以上版本将会自动支持gomod) 默认GO111MODULE=auto(auto是指...初始化模块,会在项目根目录下生成 go.mod文件。 go mod tidy根据go.mod文件来处理依赖关系。 go m...
  • hello.c文件如下 #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Xie"); MODULE_DESCRIPTION("Hello World Module"); MODULE_ALIAS("a simplest module"); static int __init hello_init() { ...
  • 真实讲述怎么一步步解决error: file '/boot/grub/i386-pc/normal.mod' not found问题的
  • link环境下程序部署以后提示/boot/grub/i386-pc.normal.mod not fund是什么意思?
  • 在device.h文件中 又给提供了那些函数呢?
  • vmlinux.o 生成

    2013-09-15 00:03:25
    vmlinux.o Makefile 对应内核版本:2.6.35.13 vmlinux.o 是生成 vmlinux 的依赖之一,在链接出 vmlinux 之前会先链接出 vmlinux.o 。 vmlinux.o 定义在顶层 Makefile 中: vmlinux.o: $(modpost-init) $(vm...
  • 本篇也是记录Go1.13版本在Linux系统的环境搭建和使用go mod工具。 Linux发行版:CentOS7 64位 Go安装版本:go1.13.linux-amd64 目录 Go环境安装 使用go mod go.mod版本管理文件 Go环境安装 去官网下载Linux...
1 2 3 4 5 ... 20
收藏数 81,249
精华内容 32,499
热门标签