⑴ linux內核模塊怎麼調用
在編寫linux內核模塊的時候,有時候我們需要調用一隻內核模塊裡面的函數,然而如果是在不同目錄下面編譯生成的內核模塊,此時A模塊去調用B模塊的函數時候會出現函數未定義,無法調用的情況。那麼以前我是在同一個目錄下面,先後寫兩個makefile,然後編譯生成兩個不同的內核模塊,這種方式可以正常實現A模塊調用B模塊裡面的函數,不過非常麻煩。本博文將會針對這種情況提出一種可以同時生成多個內核模塊,不要再次編譯的方面,下面貼出源碼:
內核模塊cal.ko:
#include <linux/mole.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
int add(int a, int b) {
return a+b;
}
int sub(int a, int b) {
return a-b;
}
static int sym_init() {
return 0;
}
static int sym_exit() {
return 0;
}
mole_init(sym_init);
mole_exit(sym_exit);
EXPORT_SYMBOL(add);
EXPORT_SYMBOL(sub);
內核模塊hello.ko
#include <linux/mole.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Mole");
MODULE_ALIAS("a simplest mole");
static int age = 10;
mole_param(age, int, S_IRUGO);//allow all user to use this param
int add(int a, int b);
int sub(int a, int b);
static int hello_init(void)
{
printk("<0>"" Hello World! age = %d\n", add(10, 20));//調用內核模塊cal.ko裡面的add函數
return 0;
}
static void hello_exit(void)
{
printk("<0>""hello exit %d\n", sub(30,10));//調用內核模塊cal.ko裡面的sub函數
}
mole_init(hello_init);
mole_exit(hello_exit);
可以生成多個內核模塊的makefile
ifneq ($(KERNELRELEASE),)
obj-m := cal.o hello.o
cal-objs := operator.o
hello-objs := main.o
else
KDIR := /lib/moles/2.6.32-21-generic/build
all:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
此時在當前目錄執行make就會產生cal.ko和hello.ko兩個內核模塊
⑵ 一個linux系統分多少內核模塊
Linux 僅僅是內核。Linux 操作系統一般指的是 Linux 內核 + 其他軟體。
所以內核模塊,不用說了,就是 Linux 內核的可重載模塊。模塊化設計什麼意思不用說了。
Linux 源代碼要特指,一般說 Linux 源代碼應該是說 Linux 內核源代碼。也就是內核的最核心代碼+外圍模塊的源代碼。(注意模塊是可以獨立開發,獨立存在的。但內核模塊必須被內核載入後才能工作。)
所以一個 Linux 系統是沒辦法分多少內核模塊的,內核模塊是可以變的。
內核模塊既可以隨時用隨載入,不用了就卸載,也可以直接就放到內核中(也就是直接編譯到內核裡面)。可以說內核模塊主要就是驅動,驅動是運行在內核層面的程序。不同的計算機需要不同的驅動,不同的 Linux 內核版本,自帶的驅動也是有很大區別的。
Linux 系統是由各種各樣的「軟體包」(或者叫組件)組成的,而不是內核模塊組成的。因為 Linux 系統是 Linux 內核 + 其他軟體。內核模塊只是 Linux 內核部分的東西。其他軟體包括各種函數庫,各種應用程序,還有用戶界面介面等等。
如果《操作系統原理》明白了,Linux 還是很好理解的。
如果只用 Windows ,是不能理解系統分層的,因為你用 Windows ,只見過他的 GUI ,而沒見過其他的部分。比如 Windows 的 NT 內核是什麼東東,DirectX 11 算什麼,IE 是什麼層級。
⑶ Linux內核模塊包含哪幾部分其中哪些是不可缺少的要素
啟動頭,內存管理,調度管理等是不可缺的。
簡單的講:可以缺少的是驅動部分。實際上linux基本把能用到的驅動都集中起來了(各個廠家的)。大部分電腦只能用到其中一部分
我們實際裁剪內核,主要是調整參數,以及根據機器上的硬體裁剪硬體驅動。所以上面都有用,除了驅動部分包含大量的你機器上沒有的驅動。
⑷ 如何為linux 添加內核模塊
1.1 add .c file
./kernel_imx/drivers/hello_mole/hello.c:
[cpp] view plain
#include <linux/mole.h>
#include <linux/string.h>
static int __init hello_mole_init(void)
{
printk(KERN_DEBUG "hello_mole_init\n");
return 0;
}
static void __exit hello_mole_exit(void)
{
printk(KERN_DEBUG "hello_mole_exit\n");
}
⑸ linux怎麼添加自己的內核模塊
不同發行版和不同版本的Linux略有不同,以CentOS7為例,需要在/etc/sysconfig/moles/目錄中增加一個腳本,在此腳本中載入所需的模塊。注意該腳本文件的許可權為755。
以uinput模塊為例,腳本如下:
#!/bin/sh
if [ ! -c /dev/input/uinput ] ; then
exec /sbin/modprobe uinput >/dev/null 2>&1
fi
⑹ Linux內核是什麼
Linux內核無疑是Linux操作系統的核心。它由以下五個子系統構成
(1)進程調度
(2)內存管理
(3)虛擬文件系統
(4)網路介面
(5)進程之間的通信
⑺ linux內核模塊如何開始和結束
GRLB 載入了內核之後,內核首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬體信息。這時內核終於開始替代 BIOS 接管Linux的啟動過程了。
內核完成再次系統自檢之後,開始採用動態的方式載入每個硬體的模塊,這個動態模塊大家可以想像成硬體的驅動(默認 Linux 硬體的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到內核當中;如果是非重要的功能,比如硬體驅動會編譯為模塊,則在需要時由內核調用。不過,如果沒有被內核硬體,要想驅動,就需要手工安裝個硬體的硬塊了。具體的安裝方法會在後續章節中介紹)。
那麼,Linux 的內核到底放在了哪裡呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。
[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
#內核的配置文件,內核編譯時選擇的功能與模塊
efi
#可擴展固件介面,為英特爾為全新PC固件的體系結構、介面和服務提出的建議標准
grub
#啟動引導程GTUB的數據目錄
initramfe-2.6.32-279.el6.i686.img
#虛擬文件系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分區的備份目錄
symvers-2_6.32-279.el6.i686.gz
#模塊符號信息
System.map-2.6.32-279.el6.i686
#內核功能和內存地址的對應列表
vmlinuz-2.6.32-279.el6.i686
#用於啟動的Linux內核。這個文件是一個壓縮的內核鏡像
我們已經知道,Linux 會把不重要的功能編譯成內核模塊,在需要時再調用,從而保證了內核不會過大。在多數 Linux 中,都會把硬體的驅動程序編譯為模塊, 這些模塊保存在 /lib/moles/ 目錄中。常見的 USB、SATA 和 SCSI 等硬碟設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。
如果 Linux 安裝在 IDE 硬碟之上,並且採用的是默認的 ext3/4 文件系統,那麼內核啟動後載入根分區和模塊的載入都沒有什麼問題,系統會順利啟動。但是如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 文件系統,那麼內核(內核載入入內存是啟動引導程序 GRUB 調用的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 文件系統的驅動的。
SCSI 硬碟和 LVM 文件系統的驅動都放在硬碟的 /lib/moles/ 目錄中,既然內核沒有辦法識別 SCSI 硬碟或 LVM 文件系統,那怎麼可能讀取 /lib/moles/ 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬文件系統來處理這個問題。
initramfe虛擬文件系統
CentOS 6.x 中使用 initramfs 虛擬文件系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動引導程序載入到內存中,然後會解壓縮並在內存中模擬成一個根目錄,並且這個模擬的文件系統能夠提供一個可執行程序,通過該程序來載入啟動過程中所需的內核模塊,比如 USB、SATA. SCSI 硬碟的驅動和 LVM、RAID 文件系統的驅動。
也就是說,通過 initramfs 虛擬文件系統在內存中模擬出一個根目錄,然後在這個模擬根目錄中載入 SCSI 等硬體的驅動,就可以載入真正的根目錄了,之後才能調用 Linux 的第一個進程 /sbin/init。
Initramfs 虛擬文件系統主要有以下優點:
initramfs 隨著其中數據的増減自動増減容量。
在 initramfs 和頁面緩存之間沒有重復數據。
initramfs 重復利用了 Linux caching 的代碼,因此幾乎沒有増加內核尺寸,而 caching 的代碼已經經過良好測試,所以 initramfs 的代碼質量也有保證。
不需要額外的文件系統驅動。
其實大家只需要知道 initramfs 是為了在內核中建立一個模擬根目錄,這個模擬根目錄是為了可以調用 USB、SATA、SCSI、LVM、RAID 等硬碟介面或文件系統的驅動模塊,載入了驅動模塊後才可以載入真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。
[root@localhost~]#mkdir/tmp/initramfs
#建立測試目錄
[root@localhost~]#cp/boot/
initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
#復制initramfs文件
[root@localhost~]#cd/tmp/initramfs/
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:gzipcompressed
data,fromUnix,lastmodified:
WedApr1021:49:342013,maxcompression
#查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包
[root@localhostinitramfs]#mvinitramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
#修改文件的擴展名為.gz
[root@localhostinitramfs]#gunzip
initramfs-2.6.32-279.el6.i686.img.gz
#解壓縮
[root@localhostinitramfs]#ls
initramfs-2.6.32-279.el6.i686.img
[root@localhostinitramfs]#file
initramfs-2.6.32-279.el6.i686.img
initramfe-2.6.32-279.el6.i686.img:ASCIIcpioarchive(SVR4withnoCRC)
#查看文件類型,使用cpio命令的壓縮文件
[root@localhostinitramfs]#cpio-ivc<initramfs-2.6.32-279.el6.i686.img
#解壓縮
[root@localhostinitramfs]#ll
總用量34512
drwxr-xr-x.2rootroot40964月2412:10bin
drwxr-xr-x.2rootroot40964月2412:10cmdline
drwxr-xr-x.3rootroot40964月2412:10dev
-rw-r--r--.1rootroot194月2412:10dracut-004-283.el6
drwxr-xr-x.2rootroot40964月2412:10emergency
drwxr-xr-x.7rootroot40964月2412:10etc
-rwxr-xr-x.1rootroot89624月2412:10init
drwxr-xr-x.2rootroot40964月2412:10initqueue
drwxr-xr-x.2rootroot40964月2412:10initqueue-finished
drwxr-xr-x.2rootroot40964月2412:10initqueue-settled
drwxr-xr-x.2rootroot40964月2412:10
initqueue-timeout
-rw-r--r--.1rootroot352353284月2412:09initramfs-2.6.32-279.el6.i686.img
drwxr-xr-x.9rootroot40964月2412:10lib
…省略部分輸出…
#這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像
關機或者某些進程停止,對應的內核模塊就會結束。更多知識請網路《Linux就該這么學》
⑻ linux內核是什麼,有啥作用 ,
Linux是一種開源電腦操作系統內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統。
操作系統是一個用來和硬體打交道並為用戶程序提供一個有限服務集的低級支撐軟體。一個計算機系統是一個硬體和軟體的共生體,它們互相依賴,不可分割。
計算機的硬體,含有外圍設備、處理器、內存、硬碟和其他的電子設備組成計算機的發動機。但是沒有軟體來操作和控制它,自身是不能工作的。完成這個控制工作的軟體就稱為操作系統,在Linux的術語中被稱為「內核」,也可以稱為「核心」。
Linux內核的主要模塊(或組件)分以下幾個部分:存儲管理、CPU和進程管理、文件系統、設備管理和驅動、網路通信,以及系統的初始化(引導)、系統調用等。
(8)Linux內核模塊擴展閱讀:
Linux內核的特性
1、可移植性
Linux是全球被最廣泛移植的操作系統內核。從掌上電腦iPad到巨型電腦IBM S/390,甚至於微軟出品的游戲機XBOX都可以看到Linux內核的蹤跡。Linux也是IBM超級計算機Blue Gene的操作系統。
2、網路支持
作為一個生產操作系統和開源軟體,Linux 是測試新協議及其增強的良好平台。Linux 支持大量網路協議,包括典型的 TCP/IP,以及高速網路的擴展(大於 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持諸如流控制傳輸協議(SCTP)之類的協議,它提供了很多比 TCP 更高級的特性(是傳輸層協議的接替者)。
3、動態內核
Linux 還是一個動態內核,支持動態添加或刪除軟體組件。被稱為動態可載入內核模塊,它們可以在引導時根據需要(當前特定設備需要這個模塊)或在任何時候由用戶插入。
4、系統管理程序
Linux 最新的一個增強是可以用作其他操作系統的操作系統。該系統對內核進行了修改,稱為基於內核的虛擬機(KVM)。這個修改為用戶空間啟用了一個新的介面,它可以允許其他操作系統在啟用了 KVM 的內核之上運行。除了運行 Linux 的其他實例之外, Microsoft® Windows® 也可以進行虛擬化。惟一的限制是底層處理器必須支持新的虛擬化指令。
⑼ Linux內核模塊的優缺點
利用內核模塊的動態裝載性具有如下優點:
·將內核映象的尺寸保持在最小,並具有最大的靈活性;
·便於檢驗新的內核代碼,而不需重新編譯內核並重新引導。
但是,內核模塊的引入也帶來了如下問題:
·對系統性能和內存利用有負面影響;
·裝入的內核模塊和其他內核部分一樣,具有相同的訪問許可權,因此,差的內核模塊會導致系統崩潰;
·為了使內核模塊訪問所有內核資源,內核必須維護符號表,並在裝入和卸載模塊時修改這些符號表;
·有些模塊要求利用其他模塊的功能,因此,內核要維護模塊之間的依賴性。
·內核必須能夠在卸載模塊時通知模塊,並且要釋放分配給模塊的內存和中斷等資源;
·內核版本和模塊版本的不兼容,也可能導致系統崩潰,因此,嚴格的版本檢查是必需的。
盡管內核模塊的引入同時也帶來不少問題,但是模塊機制確實是擴充內核功能一種行之有效的方法,也是在內核級進行編程的有效途徑。
⑽ LINUX 什麼是內核模塊和普通應用程序有什麼不同
執行方式不同
系統只有一個內核,內核模塊在模塊載入時,將執行代碼載入到內核中,開始執行、生效
運行空間不同
普通應用程序是用戶態,在用戶空間執行,內核模塊在系統內核空間執行。