一、 實驗目的和要求
1. 學習linux核心的配置和編譯;
2. 深入理解linux系統呼叫;
3. 理解arm和x86的cpu模式(系統模式、使用者模式)的不同;
4. 掌握核心模組的編寫方法。
二、 實驗器材
1. linux實驗板卡一塊;
2. 5v/1a電源乙個;
3. microusb線一根
4. macos一台
5. use-ttl串列埠線一根
6. 乙太網線一根
7. 交叉編譯軟體
三、 實驗內容和原理
2.在核心中加入新的系統呼叫,具體功能沒有要求,能輸出除錯資訊即可;
3.修改核心**配置,編譯核心;
4.將編譯好的核心裝載到板卡啟動;
5.編寫c**,用兩種方法做系統呼叫,測試;
a) 嵌入彙編**,用r9傳引數;
b) 用syscall()函式;
6.編寫核心模組,在模組載入和解除安裝時能通過核心列印函式輸出提示資訊;
7.通過insmod和lsmod等命令測試核心模組。
四、 實驗過程和資料記錄
2. 在核心中加入新的系統呼叫
新的系統呼叫需要在原始碼系統呼叫表arch/arm/kernel/call.s中新增,由於223號系統呼叫在syscall_table中沒有使用,所以可以修改為我們的呼叫。
之後修改makefile,使得自定義的系統呼叫實現鏈結到核心裡去。
3. 修改核心**配置,編譯核心
我們採用交叉編譯的方式編譯核心,中提供了數套較差編譯工具鏈,我們使用gcc-linaro-arm-linux-gnueabihf-raspbian作為我們編譯核心的工具。
在編譯前,我們先檢視樹莓派核心的版本
首先將其新增到path,之後設定.config檔案,其中的bcm2709_defconfig為raspberry2代3代的預設配置檔案,直接使用即可。
make bcm2709_defconfig arch=arm cross_compile=arm-linux-gnueabihf-
make arch=arm cross_compile=arm-linux-gnueabihf-zlmage modules dtbs
編譯完成後,安裝相關檔案到樹莓派sd卡上,生成核心映象kernel7.img
sudo make arch=arm cross_compile=arm-linux-gnueabihf-
install_mod_path=mnt/ext4 modules_install
sudo scripts/mkknlimg arch/arm/boot/zlmage mnt/fat32/kernel7.img
安裝4.4.11版本的核心後,可以看到其核心已經更新
4. 編寫c**,用兩種方式做系統呼叫
a) 方法一:嵌入彙編**,用r0傳引數
#include
int main()
__asm__ __volatile__(「mov r0. #12」);
__asm__ __volatile__(「swi 0x900000+223\n\t」);
return 0;
通過r0暫存器,傳入12為引數
b) 方法二:用syscall()函式呼叫
#include
#include
int main()
int arg=123;
syscall(223,arg);
return 0;
傳入syscall引數為123。
5. linux核心模組
linux核心模組能更方便地呼叫核心功能,而無需重新編譯核心。其中初始化核心模組時會預設呼叫init_module,從核心中移除時會預設呼叫cleanup_module,下面編寫這兩個函式。
#include
#include
int init_moduel(void)
printk(「hello! inserting module\n」);
void cleanup_module(void)
printk(「bye! removing module\n」);
module_license(「gpl」);
編譯後,生成字尾為ko的核心模組,使用insmod插入核心模組時,可以看到核心日誌中帶有初始化的資訊提示,通過lsmod可以看到其已經載入到核心中,rmmod後可以看到移除後的核心訊息提示。
linux 系統呼叫
使用者應用可以通過兩種方式使用系統呼叫。第一種方式是通過c庫函式,包括系統呼叫在c庫中的封裝函式和其他普通函式。圖5.2 使用系統呼叫的兩種方式 第二種方式是使用 syscall巨集。2.6.18版本之前的核心,在include asm i386 unistd.h檔案中定義有7個 syscall巨集...
Linux系統呼叫
linux系統呼叫 系統呼叫 system call 是使用者空間訪問核心的唯一手段,除異常和陷入外,他們是核心唯一的合法入口。通常情況下應用程式是通過應用程式設計介面api來訪問函式,而不是直接使用系統呼叫來程式設計。作業系統通常是通過中斷從使用者態切換到核心態。中斷就是乙個硬體或軟體請求,要求c...
linux系統呼叫
系統呼叫在使用者空間程序 應用程式 和硬體裝置之間新增了乙個中間層,這樣做的好處在於將使用者空間程序和硬體裝置進行隔離。linux系統有一套標準的系統呼叫介面,然後硬體驅動會去實現這一系列標準的系統呼叫介面,而使用者空間程序只需去呼叫這些標準系統呼叫介面來操作硬體,這樣寫出的應用程式就是易於移植的。...