Linux核心態與使用者態程序通訊方法 使用者上下文

2021-06-20 13:33:01 字數 2936 閱讀 3785

執行在使用者上下文環境中的**是可以阻塞的,這樣,便可以使用訊息佇列和 unix 域套接字來實現核心態與使用者態的通訊。但這些方法的資料傳輸效率較低,linux 核心提供 copy_from_user()/copy_to_user() 函式來實現核心態與使用者態資料的拷貝,但這兩個函式會引發阻塞,所以不能用在硬、軟中斷中。一般將這兩個特殊拷貝函式用在類似於系統呼叫一類的函式中,此類函式在使用中往往"穿梭"於核心態與使用者態。此類方法的工作原理路如圖。

核心模組註冊了一組設定套接字選項的函式使得使用者空間程序可以呼叫此組函式對核心態資料進行讀寫。原始碼包含三個檔案,imp1.h 是通用標頭檔案,定義了使用者態和核心態都要用到的巨集。imp1_k.c 是核心模組的源**。imp1_u.c 是使用者態程序的源**。整個示例演示了由乙個使用者態程序向使用者上下文環境傳送乙個字串,內容為"a message from userspace\n"。然後再由使用者上下文環境向使用者態程序傳送乙個字串,內容為"a message from kernel\n"。

1 核心**:

/*imp1_k.c*/

2 #ifndef __kernel__

3 #define __kernel__

4 #endif

5 6 #ifndef module

7 #define module

8 #endif

9 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include "imp1.h"

18 19 #define kmsg "a message from kernel\n"

20 #define kmsg_len sizeof("a message from kernel\n")

21 module_license("dual bsd/gpl");

22 static int data_to_kernel(struct sock *sk, int cmd, void *user,

23 unsigned int len)

24 34 break;

35 }

36 return 0;

37 }

38 39 static int data_from_kernel(struct sock *sk, int cmd, void *user, int *len)

40 47 break;

48 }

49 return 0;

50 }

51 52 static struct nf_sockopt_ops imp1_sockops =

53 ;

62 63 static int __init init(void)

64 67

68 static void __exit fini(void)

69 72

73 module_init(init);

74 module_exit(fini);

75

二 應用層**:

/*imp1_u.c*/

2 #include 3 #include 4 #include 5 #include 6 #include "imp1.h"

7 8 #define umsg "a message from userspace\n"

9 #define umsg_len sizeof("a message from userspace\n")

10 11 char kmsg[64];

12 13 int main(void)

14 24

25 /*call function data_to_kernel()*/

26 setsockopt(sockfd, ipproto_ip, imp1_set, umsg, umsg_len);

27 28 len = sizeof(char)*64;

29 30 /*call function data_from_kernel()*/

31 getsockopt(sockfd, ipproto_ip, imp1_get, kmsg, &len);

32 printf("kmsg: %s", kmsg);

33 34 close(sockfd);

35 return 0;

36 }

三頭檔案:

1 /*imp1.h*/

2 #ifndef __imp1_h__

3 #define __imp1_h__

4 5 #define imp1_ops_basic 128

6 #define imp1_set imp1_ops_basic

7 #define imp1_get imp1_ops_basic

8 #define imp1_max imp1_ops_basic+1

9 10 #endif

~

四 編譯後執行結果:

核心列印:[541380.295993] umsg: a message from userspace

[541390.819256] umsg: a message from userspace

[541392.515414] umsg: a message from userspace

[541393.374753] umsg: a message from userspace

[541393.967123] umsg: a message from userspace

應用程式列印:

/imp1$ sudo ./imp1_u

kmsg: a message from kernel

Linux 核心態與使用者態

使用者態 ring3 執行於使用者態的 則要受到處理器的諸多檢查,它們只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址,且只能對任務狀態段 tss 中i o 許可位圖 i o permission bitmap 中規定的可訪問埠進行直接訪問 核心態 ring0 在處理器的儲存保...

Linux核心態與使用者態

如上圖所示,從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態 或者使用者空間和核心 核心從本質上看是一種軟體 控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資源 儲存資源 i o資源等。為了使上...

linux核心態使用者態

概述 linux系統使用者態和核心態相關知識,linux核心版本為3.10.79。使用者態和核心態定義 核心態 cpu可以訪問記憶體所有資源,包括外圍裝置.可以進行處理器工作模式切換,程式的切換。使用者態 只能受限的訪問記憶體,且不允許訪問外圍裝置,不可以進行處理器模式切換。為什麼分使用者態和核心態...