Linux內核編程之helloworld

2021-02-13 全棧大表哥

Linux內核紛繁複雜,知識點多如牛毛,令人望而卻步。萬事開頭難,所以開好頭很重要。下面舉一個Linux編程的小例子,以消除新手對Linux內核的恐懼。

一、準備操作Linux作業系統:

最簡單的方式是安裝Linux虛擬機或者使用Docker。我的測試環境是一臺CentOS7虛擬機,版本如下:

uname -r
3.10.0-1062.9.1.el7.x86_64

二、安裝內核開發包

yum install kernel-devel

三、編寫hellworld模塊

#include <linux/module.h>

static int __init hello_init(void) {
      printk("init...\n");
      return 0;
}


static void __exit hello_exit(void) {
      printk("end...\n");
}

module_init(hello_init);
module_exit(hello_exit);

定義了兩個函數:hello_init和hello_exit,並被兩個宏分別調用。當使用insmod命令加載內核模塊時,hello_init會被調用,當使用rmmod命令卸載模塊時,hello_exit會被調用。

以上調用規則是Linux內核模塊編程的標準格式。

四、編寫Makefile文件

obj-m += test.o
test-y = main.o
all:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

obj-m表示該文件作為模塊編譯,模塊的名稱是test。test-y表示名稱是test的模塊依賴的文件。

五、編譯內核模塊

make
make -C /lib/modules/3.10.0-1062.9.1.el7.x86_64/build M=/home/kali/kernel/m1 modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1062.9.1.el7.x86_64'
CC [M] /home/kali/kernel/m1/main.o
LD [M] /home/kali/kernel/m1/test.o
Building modules, stage 2.
MODPOST 1 modules
CC     /home/kali/kernel/m1/test.mod.o
LD [M] /home/kali/kernel/m1/test.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1062.9.1.el7.x86_64'

當前模塊下的文件內容:

main.c  main.o  Makefile  modules.order  Module.symvers  test.ko  test.mod.c  test.mod.o  test.o

六、加載內核

insmod test.ko
dmesg
[2619842.844016] init...

七、卸載內核

rmmod test
dmesg
[2619842.844016] init...
[2619847.829591] end...

通過dmesg命令,可以看到內核分別列印了hello_init和hello_exit輸出的信息。


小結

上述代碼為了展示內核模塊的編寫過程,對代碼進行了最大限度的精簡。通過上述操作,我們可以在內核空間對內核提供的函數進行測試。


相關焦點

  • 嵌入式開發Linux驅動篇——驅動編譯到內核
    ,3、不編譯),與之對應的還有bool(1、編譯到內核,2、不編譯)「Led Support for GPIO Led」 是make menuconfig顯示的名字 depends on LEDS_CLASShelloworld準備第一步,複製.c文件到指定位置首先是打開我們linux源碼的char文件位置 cd /work
  • Windows 網絡編程:驅動程序之 Hello World
    ,我們要做的很多事情也需要在內核下完成,要想在內核中實現功能就需要編寫驅動模塊。Windows作業系統是一個開放式的作業系統,這個開放式並不是指其開放原始碼,而是指通過其提供的接口可以很容易和方便地對其內核進行擴展。要開發Windows下的驅動程序時,需要下載安裝Windows下的驅動開發包,即WDK (Windows Driver Kit),該開發包免費提供下載,裡面附帶了開發驅動的頭文件、幫助文檔、工具及大量的文檔等內容。
  • 12種程式語言的Hello World
    > 英文 | https://javascript.plainenglish.io/hello-world-in
  • 淺談Linux內核源碼中Makefile、Kconfig和.config文件
    3、.config參考:linux-3.4.2/.config通過前倆個文件的分析,.config的含義已經很清晰:內核編譯參考文件,查看裡面內容可以知道哪些驅動被編譯進內核。 以上可能有點抽象,下面舉例說明:寫一個簡單的入口函數輸出hello world的驅動並編譯進內核。步驟:(1)在drivers目錄下新建hello文件夾,裡面實現hello.c、Makefile、Kconfig。
  • Rust實用教程之 - Hello world
    Rust是一門非常有特點的現代化系統程式語言: 高性能,無GC, 靜態類型、內存安全、函數式,借鑑了C++, Haskell, Scala
  • 如何用 Rust 編寫一個 Linux 內核模塊 | Linux 中國
    我對 Rust 用於作業系統內核並不信服(雖然系統編程不僅限於內核),但同時,毫無疑問,C 有很多局限性。在最新的對 Rust support 的 RFC 郵件的回覆中,他更是說:所以我對幾個個別補丁做了回應,但總體上我不討厭它。沒有用他特有的回覆方式來反擊,應該就是暗自喜歡了吧。
  • 12 種主流程式語言輸出「 Hello World 」,你真的都會了嗎?
    以下為譯文:剛開始學編程,或者學習一門新的程式語言時,我們編寫的第一個程序往往很簡單,而且往往這個程序就是輸出一個簡單的文本。如果你很好奇並想知道如何使用最流行的12種程式語言來輸出Hello world的話,那麼我們就開始吧。首先申明一點:本文中提及的最受歡迎的程式語言的排名來自GitHub和Tiobe,具體的數據來源點擊這裡(https://stackify.com/popular-programming-languages-2018/#wpautbox_about)。
  • 12 種主流程式語言輸出「 Hello World 」,把我給難住了!
    在我們剛開始打開編程世界的時候,往往寫的第一個程序都是簡單的文本輸出,而這個最簡單的文本就是「Hello world!」。你可能只了解你當前學的程式語言如何輸出「Hello world!」,但你知道其他12種當前熱門程式語言是如何輸出「Hello world!」 的嗎?今天就為大家整理了一篇。首先申明一點:本文中提及的最受歡迎的程式語言的排名來自GitHub和Tiobe,具體的數據來源點擊這裡(https://stackify.com/popular-programming-languages-2018/#wpautbox_about)。
  • Visual Studio2019集成ffmpeg之hello world
    ├─libavfilter│  ├─libavformat│  ├─libavutil│  ├─libpostproc│  ├─libswresample│  └─libswscale├─lib #連結庫文件└─presets三、創建項目目錄├─bin     #程序執行和調試目錄├─
  • 「Hello World」
    本人 12 年畢業,做過幾十個大大小小項目,熟悉 Android 、Python、C#、C、C++、Shell、Dart 等程式語言拼寫Top 10 程式語言從最大的同性交友網站最新公布的年報來看,今年,C#和 Shell 排名上升。在存儲庫貢獻者中,Python 首次超過 Java,成為 GitHub 上 第二受歡迎的語言。學習一門新的語言,我們寫的一行代碼一般都是從「Hello World」開始的,你知道這 10 種語言的 Hello World 嗎?下面我們就一一看下他們都是怎麼寫的。
  • 25種著名程式語言編寫您的第一個程序Hello World
    」 ——每個程式設計師在開始學習任何程式語言時編寫的第一個程序。「Hello World !」被認為是幾乎所有計算機語言中最簡單的程序之一,它向用戶輸出或顯示「Hello, World !」。它通常是用於工作程序的程式語言的基本語法的範例,用來向入門程式設計師介紹程式語言。從本文中,您將學習如何用25種不同的著名程式語言編寫您的第一個程序——「Hello World !」程序。
  • 逆向工廠(一):從hello world開始
    Windbg不僅可以調試應用程式,還可以 對內核進行調試。結合Microsoft的Symbol Server,可以獲取系統符號文件,便於應用程式和內核的調試。Windbg支持的平臺包括X86、IA64、AMD64。Windbg 安裝空間小,具有圖形操作界面,但其最強大的地方是有豐富的調試指令。
  • Hello World CUDA!
    #include#include "cuda_runtime.h" __global__ void helloKernel(){}int main(){helloKernel <<>> ();printf("Hello,World");
  • 入門級的HelloWorld經歷了哪些過程
    那麼生成的 hello.obj 文件是什麼呢?用 WinHex 打開 hello.obj 來進行查看。裡面是滿滿的的二進位文件,在右側可以看到字符串 Hello world 。int main(){ #line 1 "test.bmp"printf("Hello world\r\n");return (int)3.14;#line 6 "hello.c"}        main()        main() 叫做程序入口是不對的。
  • 用 50 種程式語言寫「Hello,World!」
    ; return 0;}Smalltalk 是一種面向對象的,具有反身性和動態類型的程式語言,發明於 1972 年,當時主要是受到 Lisp 語言的啟發。Smalltalk 是最早一批具有集成開發環境的程式語言之一。Transcript show: 'Hello, world!'; cr.
  • 用 50 種程式語言寫「Hello,World!」程序
    這是一個計算機世界的編程時光之旅。對很多人來說,每當學習一門新的程式語言,寫下的第一行代碼可能都是「Hello,World!「。因此,」Hello,World!" 已經成為一段經典程序。在職業生涯中,所有程式設計師都至少完成過一段「Hello,World!" 程序。
  • 自製 os 極簡教程:史上最難的 hello world
    這個 hello world 要做什麼要做的效果就是,把你寫的作業系統代碼,也就是一堆 0101..組成的二進位數,寫到硬碟上的某個位置,把這塊硬碟插在電腦上,按下電腦的開機鍵,最終在黑黑的屏幕上輸出一個 hello world 字符串。
  • Hello World 的真正意義是什麼?
    編寫Hello,World程序已成為編程界的一種傳統,然而與許多傳統一樣,很多人雖然這麼做卻沒有意識到其中真正的目的或價值。因此就有人產生了一個腦洞,能不能把 Hello World 用所有程式語言都寫一遍。
  • 50 種不同程式語言的「Hello World」,你知多少?
    main(){  putstr("Hello world!*n");  return(0);}8. Pascal - 1970Pascal是創建於1970年的命令式程式語言。Smalltalk - 1972特別是受到Lisp語言的啟發,Smalltalk是一種面向對象、自反性和動態類型的程式語言,發明於1972年。Smalltalk是最早擁有集成開發環境的程式語言之一。Transcript show: 'Hello, world!'; cr.
  • 【Linux】shell高級編程視頻教程(含經典案例)
    shell是你(用戶)和Linux(或者更準確的說,是你和Linux內核)之間的接口程序。你在提示符下輸入的每個命令都由shell先解釋然後傳給Linux內核。 說到底,Shell是用戶與內核進行交互操作的一種接口,目前最流行的Shell稱為bash Shell      Shell是解釋執行的腳本語言,所謂腳本語言就是不用編譯就可以直接執行的語言。在Shell中可以調用Linux系統命令。