Linux内核编译、驱动开发命令及步骤总结

------常用命令--------
---内核源码本身也无32位和64位之分,只有编译以后才有区别----

yum list installed 列出所有已安装的软件包
yum list updates 列出所有可更新的软件包
yum install softName 安装软件包
yum remove softName 删除软件包

服务
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务

程序
# rpm -qa #查看所有安装的软件包
进程
# ps -ef # 查看所有进程
# top #实时显示进程状态

系统
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量

资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载

磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况

网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息

用户
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务


--Fedora16内核版本为3.1.0-7.fc16.i686 到3.4.2 (2012.07.12)
--Fedora18的内核版本:3.6.10-4
--Fedora 17 采用3.3.4 内核,集成4.7.0 版 gcc、gcc-c++、gcc-gfortran、gcc-objc 以及 gcc-gnat,OpenJDK7取代了OpenJDK6,成为了Fedora 默认Java开发套件,集成KDE 4.8桌面环境,性能和稳定性上有显著提升,其中包含KDE Plasma 工作空间,集成了 GNOME 3.4 桌面环境。
--Fedora 19 采?用? 3.9.0 内?核

1.uname -a / -r //查看内核版本
2.安装VMware Tools后需要重启,复制粘帖功能才正常。
3.Makefile文件的两行make开头的行,make前头必须是一个Tab空格,不能是Space键的其它空格,也不能没有空格。
4.添加sudo权限
[root@localhost ~]# chmod

777 /etc/sudoers
[root@localhost ~]# gedit /etc/sudoers
[root@localhost ~]# chmod 440 /etc/sudoers
5.CentOS中文设置
[root@localhost ~]# gedit /etc/sysconfig/i18n
#LANG="en_US.UTF-8"
LANG="zh_CN.UTF-8" //改成中文
6. *.glade是GTK+图形界面产生器的XML格式设计文件,可用于C、C++、Java、C#、Python、Perl等。
7. VMware调整客户机尺寸atuosize-->autofit guest

番外篇 安装内核头文件
编译一个设备驱动模块时,你需要在系统中安装内核头文件。内核头文件同样在你编译与内核直接链接的用户空间程序时需要。当你在这些情况下安装内核头文件时,你必须确保内核头文件精确地与你当前内核版本匹配(比如:3.13.0-24-generic)。
#rpm -qa | grep kernel-headers-$(uname -r)
第一篇 内核编译安装

1.下载要编译的源码包,
sudo cp src-name.tar.xz /usr/src //复制到/usr/src
sudo xz -d src-name.tar.xz //解压xz包
sudo tar -xvf src-name.tar //解压tar包,得到源码文件夹
另外,似乎也可用 #tar -Jxvf src-name.tar.xz -C /usr/src一步解压
bzip2 -d linux-2.6.32.26.tar.bz2 //解压bz2包
2.安装编译工具

1)sudo yum groupinstall "Development Tools"
或者sudo yum install gcc gcc-c++ kernel-devel
2)--安装ncurses 它是一个能提供功能键定义(快捷键),屏幕绘制及基于文本终端的图形互动功能的动态库。这就不难解释为何执行make menuconfig命令需要ncurses了。
sudo yum install gcc make ncurses ncurses-devel perl
sudo yum update

3.清理旧配置文件
法1:sudo make mrproper //删除源码目录残留.o和其他从属文件,确保源代码目录下没有不正确的.o文件以及文件的互相依赖
法2:sudo make distclean

4. 配置
注意:编译的时候用的.config文件最好用你原来内核的config文件,这个文件在/boot/目录下有个config-内核版本号。将这个文件copy到你要安装的内核的根目录下(名字改成.config),再编译。可能会提示你一些新的配置,不懂的yes或者编译成模块选M就行了,宁多勿缺啊!
***注意:标准内核源码对CPU默认配置是Pentium-Pro,为高性能奔腾处理器。有可能存在兼容问题,建议将CPU类型改为X586。步骤:在Menuconfig菜单下,进入General setup--Processor type and features回车进入Processor family,选择586/K5/5x86/6x86/6x86MX项
法1:sudo make menuconfig
----此命令运行将弹出"kernel configuration"界面,按"ESC",点"YES"退出即可
法2:sudo make oldconfig //如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦
Y--将该功能编译进内核
N--不
M--将该功能编译成可在需要时动态载入内核的模块
5. 编译内核
注意:2.6内核作了优化,不必显式执行make dep、make bzImage,只需make命令,系统会自动完成make dep、make b

zImage所做工作
sudo make -j4 //4个线程编译,
6. 编译和安装模块
sudo make modules_install
7. 安装内核 在源码目录下执行make install,此命令为我们全权代理了安装新内核的所有工作,执行完后,就可直接重启,在启动菜单中就有新内核供选择。其完成的工作有3项,见后。
sudo make install
注意:本人make install时出现以下几个错误,应该是虚拟机VMware Tools模块,直接无视,重新启动系统,出现启动选择菜单,选择新编译的内核菜单,顺利启动并能正常使用。
ERROR: modinfo: could not find module nf_defrag_ipv6
ERROR: modinfo: could not find module vmblock
ERROR: modinfo: could not find module vsock
ERROR: modinfo: could not find module ipv6
ERROR: modinfo: could not find module vmhgfs
要解决这些错误,只需在配置.config时,将以上模块全设成m,或者直接在.config中将以上项全改成m即可。

make install完成的3项工作:1是将编译生成的内核镜像bzImage从源码目录arch/i386/boot复制到/boot,并重命名为vmlinuz-2.6.32.68(根据具体内核版本而定);2是用命令"mkinitrd initrd-2.6.32.68 2.6.32.68",生成initrd-2.6.32.68.img文件,它用于临时引导硬件到实际内核vmlinuz能够接管并继续引导的状态,将其也复制到/boot目录。注意mkinitrd是RedHat特有命令,其他Linux有类似命令; 3是配置grub 打开/boot/grub/grub.conf,加入以下代码
title MyLinux-2.6.32.68(这是启动菜单显示的名字)
root(hd0,0) // /boot放在hd0磁盘的第一个分区
kernel /vmlinuz-2.6.32.68 ro root=UUID=... //具体看grub.conf
然后重启,若一切正常即可看到新内核的启动项。

8. 修改启动菜单 注意:本人在CentOS6.5上编译2.6.32.68上未修改启动菜单,安装内核后重启就能看到启动菜单中有新编译的内核。
#vim /boot/grub/grub.conf


二、驱动开发篇

安装完centos后,编译了一下驱动测试程序Hello。编译过程出现如下错误:
make: *** /lib/modules/2.6.32-220.4.1.el6.i686/build: No such file or directory. Stop.
make: *** [all] Error 2

但是用ls查询了一下,该文件明明存在。上网搜集,原来需要安装以下kernel相关的编译软件:
1:kernel-firmware
2:kernel
3:kernel-debug
4:kernel-headers
5:kernel-doc
6:kernel-devel
7:kernel-debug-deve

安装完成之后,即可以make成功。

三、驱动编译及Makefile
1. Makefile
obj-m := hello.o // "obj -m"指的是编译内核模块,”obj -y“指的是内核编译;
make -C $(KDIR) M=$(PWD) modules //"-C"指定内核源码所在路径,"M="指定待编译module模块所在目录。


写好了一个简单hello驱动后,编译模块是出现了问题:
1) 没有.config 文件
2) 总是出现找不到文件的情况

来才发现在编译模块之前首先要配置并构造内核,准备内核树
关于Makefile运行的具体过程,重点介绍为何Makefile被执行了两次;
一个简单的hello内核模块的Makefile:
#hell0_makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *.mod.c *.mod.o *.ko
endif

*******特别注意:*********
上面"KERNELDIR:=/lib/modules/$(shell uname -r)/build"是用当前系统内核版本进行编译,若要使编译的驱动适用于其他内核版本,则配置为"KERNELDIR := /usr/src/kernels/2.6.32.68",当然2.6.32.68内核源码要存在于该目录。
编译驱动时指定的内核应与其加载运行的内核版本一致。若将2.5.10.1内核编译的驱动在2.6.32.68内核下加载,会出错无法加载。

当写完一个hello模块,只要使用以上的makefile, make一下就行。 假设我们把hello模块的源代码放在/home/study/prog/mod/hello/下。 当我们在这个目录运行make时,make是怎么执行的呢? LDD3第二章第四节“编译和装载”中只是简略地说到该Makefile被执行了两次, 但是具体过程是如何的呢?
首先,由于make 后面没有目标,所以make会在Makefile中的第一个不是以.开头的目标作为默认的目标执行, 于是default成为make的目标。
make会执行 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
shell是make内部的函数,
假设当前内核版本是2.6.13-study,则$(shell uname -r)的结果是"2.6.13-study",
这里,实际运行的是
"make -C /lib/modules/2.6.13-study/build M=/home/study/prog/mod/hello/ modules"
其中,/lib/modules/2.6.13-study/build是一个指向内核源代码/usr/src/linux的符号链接。
可见,make执行了两次:
第一次执行时是读hello模块的源代码所在目录/home/s tudy/prog/mod/hello/下的Makefile;
第二次执行时是执行/usr/src/linux/下的Makefile时.
但是还是有不少令人困惑的问题:
1)这个KERNELRELEASE也很令人困惑,它是什么呢?在/home/study/prog/mod/he llo/Makefile中是没有定义这个变量的,所以起作用的是else…endif这一段。不过,如果把hello模块移动到内核源代码中。例如放到/usr/src/linux/driver/中, KERNELRELEASE就有定义了。 在/usr/src/linux/Makefile中有 162 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION) 这时候,hello模块也不再是单独用make编译,而是在内核中用make modules进行编译。 用这种方式,该Makefile在单独编译和作为内核一部分编译时都能正常工作。
2)这个obj-m := hello.o什么时候会执行到呢? 在执行:
make -C /lib/modules/2.6.13-study/build M=/home/study/prog/mod/hello/ modules
时,make 去/usr/src/linux/Makefile中寻找目标modules: 862 .PHONY: modules 863 modules: $(vmlinux-d

irs) $(if $(KBUILD_BUILTIN),vmlinux) 864 @echo ' Building modules, stage 2.'; 865 $(Q)$(MAKE) -rR -f $(srctree)/scripts/Makefile.modpost
可以看出,分两个stage: 1.编译出hello.o文件。 2.生成hello.mod.o hello.ko 在这过程中,会调用 make -f scripts/Makefile.build obj=/home/study/prog/mod/hello 而在 scripts/Makefile.build会包含很多文件: 011 -include .config 012 013 include $(if $(wildcard $(obj)/Kbuild), $(obj)/Kbuild, $(obj)/Makefile) 其中就有/home/study/prog/mod/hello/Makefile 这时 KERNELRELEASE已经存在。 所以执行的是: obj-m:=hello.o
关于make modules的更详细的过程可以在scripts/Makefile.modpost文件的注释 中找到。如果想查看make的整个执行过程,可以运行make -n。

3.加载驱动
sudo insmod hello.ko

查看打印信息
1)#tail /var/log/messages
2)#dmesg | tail -8
3)#demsg |tail /var/log/messages

查看已加载模块信息
[root@localhost work]# lsmod |grep hello
hello 678 0

4.卸载驱动
sudo rmmod hello

注:
1)insmod 加载模块的代码段和数据段到内核,并且调用模块的初始化函数来启动所有东西.
2)rmmod 如果内核认为模块还在用( 就是说, 一个程序仍然有一个打开文件对应模块输出的设备), 或者内核被配置成不允许模块去除, 模块去除会失败.
3)lsmod 生成一个内核中当前加载的模块的列表. lsmod 通过读取/proc/modules虚拟文件工作. 当前加载的模块的信息也可在位于/sys/module的sysfs虚拟文件系统找到.
4)如从一个终端模拟器或者在窗口系统中运行insmod 和rmmod, 你不会在你的屏幕上看到任何东西. 消息进入了其中一个系统日志文件中, 例如 /var/log/messages(实际文件名子随 Linux 发布而变化).



清华大学源:#cd /etc/yum.repos.d
#vi fedora-tuna.repo
[fedora]
name=Fedora $releasever - $basearch - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/$basearch/os/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/$basearch/debug/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-debug-$releasever&arch=$basearch
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[fedora-source]
name=Fedora $releasever - Source - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/source/SRPMS/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-source-$releasever&arch=$basearch
enabled=0
metadata_exp

ire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch



#vi fedora-updates-tuna.repo
[fedora]
name=Fedora $releasever - $basearch - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/$basearch/os/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/$basearch/debug/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-debug-$releasever&arch=$basearch
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[fedora-source]
name=Fedora $releasever - Source - tuna
failovermethod=priority
baseurl=https://www.360docs.net/doc/cc10879160.html,/fedora/releases/$releasever/Everything/source/SRPMS/
#mirrorlist=https://https://www.360docs.net/doc/cc10879160.html,/metalink?repo=fedora-source-$releasever&arch=$basearch
enabled=0
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch


退出并保存即可
#yum cache

相关文档
最新文档