Linux每日一记(2014-6-3)

来源:互联网 发布:python 服务端开发 编辑:程序博客网 时间:2024/06/09 18:45

Linux内核配置:

  1. make config:基于文本模式
  2. make menuconfig:基于菜单模式
  3. make oldconfig:基于旧配置文件
  4. make xconfig:图形化配置

make menuconfig错误解决:

sudo apt-get install libncurses5-dev


配置文件先在arch/arm/configs里面查找相应模板,并复制至内核初始目录,重命名为.config,修改相应配置


Linux内核编译:

  1. make zImage:用于小于512K的内核(X86)
  2. make bzImage

加V=1:

查看编译详细信息


编译好的镜像文件在arch/$(arch)/boot下


Linux制作ramdist:

mkinitrd initrd-$version $version (第二个version一定要为实际版本)


Linux编译内核模块:

make modules


Linux安装内核模块:

make modules_install


1.选项*(编译到内核)
如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。

2.选项M(编译到模块)
如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。

Linux下打开pdf命令:

evince  filename.pdf


Linux 内核Makefile文件分类:

  1. 顶层Makefile:总体控制内核的编译、连接
  2. .config:配置文件,在配置内核时生成,所有Makefile文件都是根据.config来决定使用哪些文件
  3. arch/$(ARCH)/Makefile:对应体系结构的Makefile,决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像
  4. script/Makefile.*:Makefile共用的通用规则、脚本等
  5. kbuild Makefiles:各级子目录下的Makefile,相对简单,被上一层Makefile调用来编译当前目录下文件

Linux内核编译对Makefile的修改:

修改ARCH=arm:Makefile后面有很多$(ARCH)这样的语句,如arch/$(ARCH)/Makefile,可以引用arm下的Makefile

修改CROSS_COMPILE=arm-linux-:后面有CC=$(CROSS_COMPILE)gcc,这样CC=arm-linux-gcc了,ld、as也同样如此


obj-y:用来定义哪些文件被编进内核

obj-m:用来定义哪些文件被编译成可加载模块

lib-y:用来定义哪些文件被编成库文件

obj-y,obj-m:还可以用来指定要进入的下一层子目录

其中obj-m在编译模块时用到:

  1. 只有一个源文件:在obj-m中直接增加它的.o文件即可

obj-m := hello.o

        2.  多个源文件:除了在obj-m中增加一个.o文件外,还要定义一个<module_name>-objs变量来告诉Makefile这个.o文件由哪些文件组成

obj-m := hello.o

hello-objs := main.o add.o


Linux编译模块Makefile:

ifneq ($(KERNELRELEASE),)obj-m := hello.ohello-objs := main.o add.oelseKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)all:$(MAKE) -C $(KDIR) M=$(PWD) modulesendif
KERNELRELESE

在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELESE没有被定义,所以make将读取执行else之后的内容

-C $(KDIR)

跳转到内核源码目录下读取那里的Makefile

M=$(PWD)

返回当前目录继续读入执行当前的Makefile。当从内核源码目录返回时,KERNELRELESE已经被定义,make将执行else之前的内容。else之前的内容由kbuild解析,指名模块源码中各文件的依赖关系,以及要生成的目标模块名


加载insmod (insmod hello.ko)

卸载rmmod (rmmod hello)

查看lsmod

加载modprobe (modprobe hello)

modprobe根据把文件/lib/modules/<$version>/modules.dep查看加载模块并加载相应依赖模块

0 0
原创粉丝点击