#include <linux/module.h> 中的module.h預設是在哪個目錄下呢?我在/usr/include/linux下並沒有找到這個檔案。
另外想問一下,不同核心版本的linux標頭檔案是不是一樣的。比如:我在2.6.20核心的系統上,用2.6.10的標頭檔案會不會有問題。
網友回覆:
1
我的 module.h是在 核心編譯好了的目錄下的,不是在/usr/include/linux下,
2
在2.6.20核心的系統上,用2.6.10的標頭檔案應該會有問題,核心的標頭檔案和 當前系統執行的核心不一致。
網友回覆:你引用的是核心下的標頭檔案.
不在/usr/include下.
在: /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 下面... 中間的版本號是不一樣的...你選你的就行了..
網友回覆:請問樓上為什麼是在/usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h呢?我查了一下環境變數,沒有看到關於標頭檔案的環境變數。gcc是如何知道標頭檔案的位置的?
網友回覆:這個問題很好,
你需要看看linux kernel的Makefile檔案了。在什麼地方找標頭檔案,它說了算。:)
網友回覆:你的程式是驅動之類的核心層的吧?
它呼叫的標頭檔案就應該是核心原始碼裡面的include了。一般的系統都把核心原始碼放在/usr/src下面,假如是自己編譯的核心的話,也可以放在別處的。 至於gcc到哪裡去找標頭檔案,就看makefile了,或者直接用gcc命令的話,要加上-I來指定目錄。
網友回覆:樓上,可是我的makefile裡沒有指定include呀,gcc是怎麼找到標頭檔案的?
網友回覆:gcc是怎麼找到標頭檔案的?
================================
回答了這個問題,LZ就明白了一切了,GCC找標頭檔案有三種策略:
1.會在預設情況下指定到/usr/include資料夾(更深層次的是一個相對路徑,GCC可執行程式的路徑是/usr/bin,那麼它在實際工作時指定標頭檔案頭徑是一種相對路徑方法,換算成絕對路徑就是/usr/include)
2.GCC還使用了-I指定路徑的方式,這一點大家都知道
3.還可以使用一個引數來指示GCC不搜尋系統預設路徑,這個引數我忘了,你搜一下就知道了
在
編譯驅動模組時,由於非凡的需求必須強制GCC不搜尋系統預設路徑,也就是不搜尋/usr/include,要自己用-I引數來指定核心標頭檔案路徑,這個
時候必須在Makefile中指定兩個引數,一個是核心標頭檔案路徑,一個是強制GCC不搜尋系統預設路徑。在編譯核心時,必須使用一個引數(強制GCC不
搜尋系統預設路徑),否則就會引起混亂。
另,在驅動程式下面不是。下面是驅動程式的路徑:(注意,這裡已經預先定義好了arm平臺了,所以才會自動去arm相關的底下找)
驅動程式:
#include <linux/***.h> 是在linux-2.6.29/include/linux下面尋找原始檔。
#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面尋找原始檔。
#include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面尋找原始檔。
#include <linux/module.h> //最基本的檔案,支援動態新增和解除安裝模組。Hello World驅動要這一個檔案就可以了
#include <linux/fs.h> //包含了檔案操作相關struct的定義,例如大名鼎鼎的struct file_operations
#include <linux/errno.h> //包含了對返回值的巨集定義,這樣使用者程式可以用perror輸出錯誤資訊。
#include <linux/types.h> //對一些特殊型別的定義,例如dev_t, off_t, pid_t.其實這些型別大部分都是unsigned int型通過一連串的typedef變過來的,只是為了方便閱讀。
#include <linux/cdev.h> //對字元裝置結構cdev以及一系列的操作函式的定義。
#include <linux/wait.h> //等代佇列相關標頭檔案
應用程式:
#include <fcntl.h> //包含了open()函式的flags,mode引數的巨集定義。
驅動程式:
#include <linux/***.h> 是在linux-2.6.29/include/linux下面尋找原始檔。
#include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面尋找原始檔。
#include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面尋找原始檔。
#include <plat/regs-adc.h>在linux-2.6.31_TX2440A20100510\linux-2.6.31_TX2440A\arch\arm\plat-s3c\include\plat
#include <linux/module.h> //最基本的檔案,支援動態新增和解除安裝模組。Hello World驅動要這一個檔案就可以了
#include <linux/fs.h> //包含了檔案操作相關struct的定義,例如大名鼎鼎的struct file_operations
//包含了struct inode 的定義,MINOR、MAJOR的標頭檔案。
#include <linux/errno.h> //包含了對返回值的巨集定義,這樣使用者程式可以用perror輸出錯誤資訊。
#include <linux/types.h> //對一些特殊型別的定義,例如dev_t, off_t, pid_t.其實這些型別大部分都是unsigned int型通過一連串的typedef變過來的,只是為了方便閱讀。
#include <linux/cdev.h> //對字元裝置結構cdev以及一系列的操作函式的定義。//包含了cdev 結構及相關函式的定義。
#include <linux/wait.h> //等代佇列相關標頭檔案//核心等待佇列,它包含了自旋鎖的標頭檔案
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h> //包含了kcalloc、kzalloc記憶體分配函式的定義。
#include <linux/uaccess.h> //包含了copy_to_user、copy_from_user等核心訪問使用者程式記憶體地址的函式定義。
#include <linux/device.h> //包含了device、class 等結構的定義
#include <linux/io.h> //包含了ioremap、iowrite等核心訪問IO記憶體等函式的定義。
#include <linux/miscdevice.h> //包含了miscdevice結構的定義及相關的操作函式。
#include <linux/interrupt.h> //使用中斷必須的標頭檔案
#include <mach/irqs.h> //使用中斷必須的標頭檔案
#include <asm/bitops.h> //包含set_bit等位操作函式,實現Input子系統時可用。
#include <linux/semaphore.h> //使用訊號量必須的標頭檔案
#include <linux/spinlock.h> //自旋鎖
#include <linux/sched.h> //核心等待佇列中要使用的TASK_NORMAL、TASK_INTERRUPTIBLE包含在這個標頭檔案
#include <linux/kfifo.h> //fifo環形佇列
#include <linux/timer.h> //核心定時器
#include <linux/input.h> //中斷處理
標頭檔案主目錄include
標頭檔案目錄中總共有32個.h標頭檔案。其中主目錄下有13個,asm子目錄中有4個,linux子目錄中有10個,sys子目錄中有5個。這些標頭檔案各自的功能如下,具體的作用和所包含的資訊請參見第14章。
<a.out.h>:a.out標頭檔案,定義了a.out執行檔案格式和一些巨集。
<const.h>:常數符號標頭檔案,目前僅定義了i節點中i_mode欄位的各標誌位。
<ctype.h>:字元型別標頭檔案,定義了一些有關字元型別判斷和轉換的巨集。
<errno.h>:錯誤號標頭檔案,包含系統中各種出錯號。(Linus從minix中引進的)。
<fcntl.h>:檔案控制標頭檔案,用於檔案及其描述符的操作控制常數符號的定義。
<signal.h>:訊號標頭檔案,定義訊號符號常量,訊號結構以及訊號操作函式原型。
<stdarg.h>:標準引數標頭檔案,以巨集的形式定義變數引數列表。主要說明了一個型別(va_list)和3個巨集(va_start, va_arg和va_end),用於vsprintf、vprintf、vfprintf函式。
<stddef.h>:標準定義標頭檔案,定義了NULL, offsetof(TYPE, MEMBER)。
<string.h>:字串標頭檔案,主要定義了一些有關字串操作的嵌入函式。
<termios.h>:終端輸入輸出函式標頭檔案,主要定義控制非同步通訊口的終端介面。
<time.h>:時間型別標頭檔案,主要定義了tm結構和一些有關時間的函式原形。
<unistd.h>:Linux標準標頭檔案,定義了各種符號常數和型別,並宣告瞭各種函式。如,定義了__LIBRARY__,則還包括系統呼叫號和內嵌彙編_syscall0()等。
<utime.h>:使用者時間標頭檔案,定義了訪問和修改時間結構以及utime()原型。
(1)體系結構相關標頭檔案子目錄include/asm
這些標頭檔案主要定義了一些與CPU體系結構密切相關的資料結構、巨集函式和變數。共4個檔案。
<asm/io.h>:I/O標頭檔案,以巨集的嵌入彙編程式形式定義對I/O埠操作的函式。
<asm/memory.h>:記憶體拷貝標頭檔案,含有memcpy()嵌入式彙編巨集函式。
<asm/segment.h>:段操作標頭檔案,定義了有關段暫存器操作的嵌入式彙編函式。
<asm/system.h>:系統標頭檔案,定義了設定或修改描述符/中斷門等的嵌入式彙編巨集。
(2)Linux核心專用標頭檔案子目錄include/linux
<linux/config.h>:核心配置標頭檔案,定義鍵盤語言和硬碟型別(HD_TYPE)可選項。
<linux/fdreg.h>:軟碟機標頭檔案,含有軟盤控制器引數的一些定義。
<linux/fs.h>:檔案系統標頭檔案,定義檔案表結構(file,buffer_head,m_inode等)。
<linux/hdreg.h>:硬碟引數標頭檔案,定義訪問硬碟暫存器埠、狀態碼和分割槽表等資訊。
<linux/head.h>:head標頭檔案,定義了段描述符的簡單結構,和幾個選擇符常量。
<linux/kernel.h>:核心標頭檔案,含有一些核心常用函式的原形定義。
<linux/mm.h>:記憶體管理標頭檔案,含有頁面大小定義和一些頁面釋放函式原型。
<linux/sched.h>: 排程程式標頭檔案,定義了任務結構task_struct、初始任務0的資料,
以及一些有關描述符引數設定和獲取的嵌入式彙編函式巨集語句。
<linux/sys.h>:系統呼叫標頭檔案,含有72個系統呼叫C函式處理程式,以"sys_"開頭。
<linux/tty.h>:tty標頭檔案,定義了有關tty_io,序列通訊方面的引數、常數。
(3)系統專用資料結構子目錄include/sys
<sys/stat.h>: 檔案狀態標頭檔案,含有檔案或檔案系統狀態結構stat{}和常量。
<sys/times.h>:定義了程式中執行時間結構tms以及times()函式原型。
<sys/types.h>:型別標頭檔案,定義了基本的系統資料型別。
<sys/utsname.h>:系統名稱結構標頭檔案。
<sys/wait.h>:等待呼叫標頭檔案,定義系統呼叫wait()和waitpid()及相關常數符號。