成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux kernel 在 Git 目錄和 SVN 目錄編譯行為不一致的解決方法

系統 Linux 系統運維
Linux kernel在 SVN 的版本控制下編譯得好好的,但是換成 Git 做版本控制之后,即便是完全一模一樣的兩套目錄樹,編譯出來就是不一樣!難道Linux 編譯結果還跟版本控制環境有關?查了資料,還真是有關……

[[174200]]

近期把開發從 SVN 遷移到了 Git 上。其實一早就遇到一個問題,那就是 Linux kernel,在 SVN 的版本控制下編譯得好好的,但是換成 Git 做版本控制之后,即便是完全一模一樣的兩套目錄樹,編譯出來就是不一樣!

我暈,Linux 編譯結果還跟版本控制環境有關?查了資料,還真是有關……

Reference

Linux內核模塊加載時的版本檢查

修改utsrelease.h 文件里面的版本號后

向linux內核版本號添加字符/為何有時會自動添加“+”號

關于CONFIG_LOCALVERSION_AUTO設置去掉內核版本號SVN后綴

去掉SVN管理kernel編譯后版本自動變化

非開源的驅動程序如何繞過version magic的檢查

繞過linux Driver Vermagic檢查

 

主要知識點歸納

內核基礎版本號

Linux 內核在編譯時,在根目錄的 Makefile 最開頭有幾個宏,決定了編譯出來的 Linux 基本版本號。我用的內核版本比較老,是這樣的:

  1. VERSION = 2 
  2. PATCHLEVEL = 6 
  3. SUBLEVEL = 36 
  4. EXTRAVERSION = 
  5. ... 

而內核代碼在獲得這個基本版本號,則需要包含include/linux/version.h文件:

  1. #define LINUX_VERSION_CODE 132644 
  2. #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) 

其中LINUX_VERSION_CODE就是(2 << 16) + (6 << 8) + (36 << 0)

這個宏很重要,舉個例子:不同的 Linux 內核的 ioctl 函數原型是不同的,但是你的驅動又不想寫兩套,這個時候就應該這么寫:

  1. #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35)) 
  2. static long my_ioctl (struct file *file,  
  3.                       unsigned int req,  
  4.                       unsigned long arg) 
  5. #else 
  6. static int my_ioctl (struct inode *inode,  
  7.                      struct file *file,  
  8.                      unsigned int req,  
  9.                      unsigned long arg) 
  10. #endif 
  11.     // brah brah brah ... 

內核擴展版本號

這里請注意內核的include/vermagic.h文件,有一個VERMAGIC_STRING宏,定義如下:

  1. ... 
  2. #define VERMAGIC_STRING                         \ 
  3.     UTS_RELEASE " "                            \ 
  4.     MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             \ 
  5.     MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS    \ 
  6.     MODULE_ARCH_VERMAGIC 

其中UTS_RELEASE宏來自于include/generated/utsrelease.h文件。

首先,這個文件是自動創建的,你修改了也沒用。

其次,這個版本號的來源很復雜,除了 Linux 基礎版本號(也就是 Makefile 的前三個變量)之外,還依賴很多變量:

  1. Makefile 里面的EXTRAVERSION宏,這是緊跟在基礎版本號后面的
  2. make menuconfig 時指定的CONFIG_LOCALVERSION_AUTO配置宏,決定了到scripts/setlocalversion里面去添加什么樣的附加內容
  3. LOCALVERSION,貌似一般情況下這個宏是沒有定義的

而這個VERMAGIC_STRING有什么用呢?這經常是用在一些自定義的內核模塊里面。如果內核模塊的實現依賴于具體 Linux 內核發行版的話,在 insmod 的時候就需要判斷內核的 VERMAGIC_STRING。很多情況下,這里面會包含很多信息。

比如我遇到問題的內核模塊,其完整的VERMAGIC_STRING就是:“2.6.36+ mod_unload MIPS32_R2 32BIT”

 

Version magic 不匹配問題的解決

我遇到的錯誤是這樣的,內核執行時,網卡無法加載,以致設備沒有網絡。可以看到串口有這么一句錯誤信息:

  1. my_net_adapt: version magic '2.6.36+ mod_unload MIPS32_R2 32BIT ' should be '2.6.36 mod_unload MIPS32_R2 32BIT ' 

根本的解決辦法,是消除掉前面的 magic 里的加號,讓兩個 version magic 變成一模一樣的。但是我找了資料也沒找到為啥。這里要求各路大神了。將就的解決辦法,就是讓兩個 version magic 都加上加號,這樣 magic 檢查就可以通過啦。

查看我的 utsrelease.h 文件,可以看到其內容是 “2.6.36”。那么解決方案就有兩種:

在目錄的 Makefile,改第四個變量為 “EXTRAVERSION = +”。

在 Linux 的根目錄下,創建一個沒有用的 “.git” 空文件夾,讓 setlocalversion 以為這是一個 Git 項目,從而自動加上加號。

第二個方案是基于一個前提的:Linux 根目錄不是我整個工程的根目錄,因而整個工程的 .git 文件夾在別處。

于是,問題解決了。我們測試也確認這臺內核編譯出來是 OK 的。但說實話,具體原因是什么,還要研究研究——為什么在 SVN 下面就沒問題,在 Git 就有問題呢?

責任編輯:武曉燕 來源: segmentfault
相關推薦

2021-04-18 15:01:56

緩存系統數據

2024-05-11 07:37:43

數據Redis策略

2017-06-20 09:42:52

網絡安全法數據隱私法網絡安全

2012-09-24 09:27:52

SVN

2025-04-03 09:51:37

2024-11-18 08:00:00

數據倉庫通用語義層商業智能

2013-03-29 11:16:17

2017-08-25 17:59:41

浮點運算C語言

2010-06-02 10:53:28

MySQL版本

2012-01-11 16:22:35

HTML 5

2022-03-18 10:53:49

數據系統架構

2018-07-15 08:18:44

緩存數據庫數據

2011-02-22 14:02:48

vsftpd

2023-12-22 10:19:19

數據庫鎖機制

2013-12-13 14:46:55

OSPFMTU鄰接關系

2021-05-27 18:06:30

MySQL編碼數據

2024-04-07 09:00:00

MySQL

2018-07-08 07:38:28

數據庫緩存數據

2020-07-20 14:06:38

數據庫主從同步服務

2022-03-16 15:54:52

MySQL數據format
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一级做a爰片久久毛片潮喷 | 日韩第一页 | 久久99精品视频 | 久久免费看 | 91精品久久久久久综合五月天 | 国产日韩欧美一区二区 | 夜久久| 在线观看国产wwwa级羞羞视频 | 日本成人福利视频 | 黄色毛片一级 | cao在线 | 五月香婷婷| 亚洲一区二区视频在线观看 | 久久国产精品久久 | 成人欧美一区二区三区1314 | 成人国内精品久久久久一区 | www.婷婷亚洲基地 | 无码日韩精品一区二区免费 | 日韩一区二区在线视频 | 我想看一级黄色毛片 | 亚洲精品国产一区 | 99re视频在线 | 国产精品久久精品 | 成人av片在线观看 | 欧美在线一区二区三区 | av毛片在线免费观看 | 国产精品久久久久久久久久久久久 | 欧美日韩综合视频 | 97伦理影院 | 午夜国产羞羞视频免费网站 | 欧美不卡视频 | 日韩在线视频观看 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 国产一级片在线观看视频 | 免费看国产a | 欧美一区二区三区在线观看 | 久久精品亚洲精品国产欧美 | 欧洲视频一区 | 亚洲人成在线观看 | 精品国产99 | 精品亚洲一区二区 |