修改、获取Linux内核版本信息的方法

  • 修改、获取Linux内核版本信息的方法已关闭评论
  • 80 次浏览
  • A+
所属分类: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 //在括号中输入要增加的扩展信息

修改、获取Linux内核版本信息的方法

 

 

 

 

方法二:

 打开内核跟目录下的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 errorn",__FUNCTION__);         return -1;     }     fp = open(dev,O_RDONLY);     if(fp == -1){         printf("open dev failedn");         ret = fp;         goto err0;     }      ret = read(fp,buff,512);     if(ret < 0)     {         printf("Read errorn");         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:%sn",n,buf);          }          else          {             printf("read n= %dn",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文件单独记录系统修改的版本号。无奈。。。。。