修改、获取Linux内核版本信息的方法
自己编译的内核进行修改后为后续方便查询是那个版本的系统。
所以每次更改内核后都需要修改一下版本信息,
又因为内核一般是不变的为了区分所以增加到扩展版本上。
操作环境:
硬件是全志 V3S
Linux内核是3.4
修改的方法:
方法一:
一个在menuconfig中进行增加
打开menuconfig
cd linux-3.4
sudo make ARCH=arm CROSS_COMPILE=arm-buildroot-Linux-gnueabihf- menuconfig
General setup
(-v1.1)Locl version - append to kernel release //在括号中输入要增加的扩展信息
方法二:
打开内核跟目录下的Makefile
在 4 EXTRAVERSION 后增加
sudo vi Makefile
4 EXTRAVERSION = -v1.1
重新编译生成系统。
查看系统版本的方法
uname -r
得到 3.4.39-v1.1
也可以执行
uname -a
cat /proc/version
c 程序获取增加版本信息的代码
read_version.c
#include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <errno.h> #include <signal.h> #include <stdbool.h> #define VERSION_DEV "/proc/version" #define MAX_BUF 2048 int read_version(char * dev,char *buf) { int fp =0; int ret =-1; char buff[512]={0}; int len =0; char *pos =NULL; char *endpos =NULL; if((dev == NULL) || (buf == NULL)){ printf("%s:input arg error\n",__FUNCTION__); return -1; } fp = open(dev,O_RDONLY); if(fp == -1){ printf("open dev failed\n"); ret = fp; goto err0; } ret = read(fp,buff,512); if(ret < 0) { printf("Read error\n"); goto err1; } // printf("ret=%d:%s",ret,buff); pos = strstr(buff,"-v"); //printf("pos=%x",pos); if(pos == NULL) goto err1; else{ endpos = strchr(pos,' '); // printf("endpos=%x",endpos); if(endpos != NULL){ ret = endpos - pos -1; memcpy(buf,pos+1,ret); } } err1: close(fp); err0: return ret; } int main(int argc,char const * argv[]) { int fd,n=0,ret =-1; char buf[MAX_BUF]={0}; while(1){ memset(buf,0,sizeof(buf)); n = read_version(VERSION_DEV,buf); if(n > 0) { printf("++++++++++++len=%d:%s\n",n,buf); } else { printf("read n= %d\n",n); } sleep(1); } return 0; }
遇到的问题:
加载显示屏驱动模块时报错
modprobe fbtft_device name=lh133t gpios="reset:145,dc:144" busnum=0
报错
modprobe: FATAL: Module fbtft_device not found in directory /lib/modules/3.4.39-v1.1
后分析发现问题是/lib/modules/3.4.39-v1.1 没有对应的modules.dep依赖文件
需要需执行depmod 更新生成一下modules.dep
在rcS增加depmod命令
v3ssdk/rootfs/etc/init.d sudo vi rcS
最上面增加depmod
此外发现每次更新版本名称后重新编译系统,/lib/modules 下就会编译生成一个新的文件。系统镜像会变大,
建议就留下3.4.39 和新生成的文件夹,其他的删掉
easyboard@V3S:~/corelinux/v3ssdk/rootfs/lib/modules$ ls
3.4.39 3.4.39-01 3.4.39v1.1 3.4.39V1.1
修改内核版本的弊端。
在实际修改其他项目的时候发现,
当内核版本修改后,采用insmod 插入模块都会因为版本和编译时候的版本不一致而报错。
导致修改内核版本后,所以的模块驱动都需要重新编译一次,这是很难受的,最终在项目中,我们是
增加一个config.ini文件单独记录系统修改的版本号。无奈。。。。。