Linux 核心編譯 新增系統呼叫

2021-08-25 21:49:37 字數 1747 閱讀 7702

主機:ubuntu 11.04

現在核心版本:2.6.38.9

編譯的目標核心版本:2.6.39

編譯成功後修改核心,新增個系統呼叫,並重新編譯核心,編寫c程式,呼叫自己新增的系統呼叫

首先編譯核心

2、解壓核心到任意目錄(這裡不用必須解壓到/usr/src/下,linus也說不必那樣做,況且自己也試驗成功)

3、進入核心目錄

4、首先配置make menuconfig配置裁剪核心(如果沒有什麼必要可以複製/boot/config-***,這是現在的核心配置)

cp /boot/config-*** ./.config

5、開始編譯,可以執行make all,當然也可以分步完成

make dep

make clean

make bzimahe

make modules

6、安裝核心驅動

make modules_install

7、安裝核心

make install

8、生成引導映象檔案,並將其複製到/boot目錄下

mkinitramfs -o initrd.img-2.6.39 2.6.39

cp initrd.img-2.6.39

9、最後更新grub

update-grub2

啟動新的核心,成功。

下面是新增系統呼叫。

1、首先開啟檔案./arch/x86/include/asm/unistd_32.h

在最後新增系統呼叫號,如下:

#define __nr_name_to_handle_at 341

#define __nr_open_by_handle_at 342

#define __nr_clock_adjtime 343

#define __nr_syncfs 344

#define __nr_my_call 345 /*this is added by yan,this is a test for system call*/

2、開啟./arch/x86/kernel/syscall_table_32.s

末尾新增系統呼叫的函式位址項,如下:

.long sys_prlimit64 /* 340 */

.long sys_name_to_handle_at

.long sys_open_by_handle_at

.long sys_clock_adjtime

.long sys_syncfs

.long sys_my_call

3、開啟./include/linux/syscalls.h新增系統呼叫函式的宣告

asmlinkage long sys_my_call(int num); /*this is added by yan*/

注意新增位置,因為其中有選擇編譯#ifdef和#ifndef

4、開啟./kernel/sys.c檔案新增

syscall_define1(my_call,int,num)

這函式是巨集定義,在./include/linux/syscalls.h裡。

5、重新編譯核心,這次只需編譯核心,驅動部分沒有改變不用再編譯一遍,以節省時間。

執行make bzimage,然後參考上面的核心編譯步驟即可。

測試**:

#include #include #include #define __nr_my_sys_call 345 int main(void)

編譯執行

結果如下:

Linux核心編譯及新增系統呼叫

1 總體設計思路 系統呼叫的本質是呼叫核心函式,以核心態執行程式。為了在核心態下執行,本實驗針對linux的核心進行修改,增加自定義系統呼叫函式實現使用者態程式對任意程序的nice值進行修改或者讀取來進行測試。2 主要函式的介面設計 核心態程式 syscall define3 mysetnice,p...

Linux編譯核心 4 2 6 並新增系統呼叫

1.檢視系統核心版本 ubuntu 12.04 uname a或者cat proc version 將壓縮包linux 4.2.6.tar.gz 放至 usr src中後解壓 sudo cp linux 4.2.6.tar.gz usr src tar zxvf linux 4.2.6.tar.gz...

核心新增系統呼叫

在 windows 下新增系統呼叫不像 linux 那樣容易,windows 系統呼叫與使用者程式之間還有 ntdll.dll 層,而這一層微軟沒有提供源 但是我們從系統呼叫的實現機制出發,不管是在 linux 還是windows 系統呼叫的實現都是通過中斷來實現的,可以利用中斷的方式呼叫新新增的系...