修改、获取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文件单独记录系统修改的版本号。无奈。。。。。

 

posted @ 2023-02-13 15:04  大龄小凡  阅读(1724)  评论(0编辑  收藏  举报