Linux系統呼叫

2021-07-13 13:36:11 字數 2926 閱讀 2622

一、      實驗目的和要求

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系統有一套標準的系統呼叫介面,然後硬體驅動會去實現這一系列標準的系統呼叫介面,而使用者空間程序只需去呼叫這些標準系統呼叫介面來操作硬體,這樣寫出的應用程式就是易於移植的。...