成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenHarmony LiteOS-A內(nèi)核文檔之學(xué)習(xí)--系統(tǒng)調(diào)用

開發(fā)
OpenHarmony LiteOS-A內(nèi)核實(shí)現(xiàn)態(tài)與內(nèi)核態(tài)的區(qū)分隔離,用戶態(tài)程序不能直接訪問內(nèi)核資源,而系統(tǒng)調(diào)用則為用戶態(tài)程序提供了一種訪問內(nèi)核資源、與內(nèi)核進(jìn)行交互的通道。

[[430551]]

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

OpenHarmony LiteOS-A內(nèi)核實(shí)現(xiàn)態(tài)與內(nèi)核態(tài)的區(qū)分隔離,用戶態(tài)程序不能直接訪問內(nèi)核資源,而系統(tǒng)調(diào)用則為用戶態(tài)程序提供了一種訪問內(nèi)核資源、與內(nèi)核進(jìn)行交互的通道。如下圖所示,用戶程序通過調(diào)用System API(系統(tǒng)API,通常是系統(tǒng)提供的POSIX接口)進(jìn)行內(nèi)核資源訪問與交互請求,POSIX接口內(nèi)部會(huì)觸發(fā)SVC/SWI異常,完成系統(tǒng)從用戶態(tài)到內(nèi)核態(tài)的切換,然后對接到內(nèi)核的Syscall Handler(系統(tǒng)調(diào)用統(tǒng)一處理接口)進(jìn)行參數(shù)解析,最終分發(fā)至具體的內(nèi)核處理函數(shù)。

OpenHarmony LiteOS-A內(nèi)核文檔之學(xué)習(xí)--系統(tǒng)調(diào)用-鴻蒙HarmonyOS技術(shù)社區(qū)

Syscall Handler的具體實(shí)現(xiàn)在kernel/liteos_a/syscall/los_syscall.c中OsArmA32SyscallHandle函數(shù),在進(jìn)入系統(tǒng)軟中斷異常時(shí)會(huì)調(diào)用此函數(shù),并且按照kernel/liteos_a/syscall/syscall_lookup.h中的清單進(jìn)行系統(tǒng)調(diào)用的入?yún)⒔馕觯瑘?zhí)行各系統(tǒng)調(diào)用最終對應(yīng)的內(nèi)核處理函數(shù)。

1. 涉及的系統(tǒng)調(diào)用文件目錄介紹

先介紹下系統(tǒng)調(diào)用相關(guān)的內(nèi)核態(tài)代碼、用戶態(tài)代碼所在的文件目錄。

1.1 syscall/syscall_lookup.h文件

kernel/liteos_a/syscall/syscall_lookup.h文件中維護(hù)內(nèi)核向用戶態(tài)提供的系統(tǒng)調(diào)用接口。文件中包含虛擬文件系統(tǒng)VFS、動(dòng)態(tài)加載DYNLOAD、PIPE、SHELL、LWIP、SECURITY_CAPABILITY等模塊的系統(tǒng)調(diào)用接口,文件內(nèi)容片段如下。每一個(gè)系統(tǒng)調(diào)用有宏函數(shù)SYSCALL_HAND_DEF定義,包含系統(tǒng)調(diào)用編號(hào)、系統(tǒng)調(diào)用處理函數(shù),返回值類型,系統(tǒng)調(diào)用處理參數(shù)數(shù)目,下文詳細(xì)介紹。

  1. ...... 
  2. SYSCALL_HAND_DEF(__NR_write, SysWrite, ssize_t, ARG_NUM_3) 
  3. SYSCALL_HAND_DEF(__NR_open, SysOpen, int, ARG_NUM_7) 
  4. SYSCALL_HAND_DEF(__NR_close, SysClose, int, ARG_NUM_1) 
  5. SYSCALL_HAND_DEF(__NR_creat, SysCreat, int, ARG_NUM_2) 
  6. ...... 

文件syscall/syscall_lookup.h被文件syscall/los_syscall.c中的系統(tǒng)調(diào)用初始化函數(shù)OsSyscallHandleInit調(diào)用,調(diào)用代碼如下。可以看出第一個(gè)參數(shù)是系統(tǒng)調(diào)用函數(shù)編號(hào),編號(hào)定義在文件third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h;第二個(gè)是系統(tǒng)調(diào)用函數(shù),函數(shù)原型聲明在文件kernel/liteos_a/syscall/los_syscall.h,函數(shù)實(shí)現(xiàn)一般在kernel/liteos_a/syscall目錄下的源代碼文件中實(shí)現(xiàn); 第三個(gè)是返回值類型,暫時(shí)沒有使用;第四個(gè)函數(shù)是系統(tǒng)調(diào)用函數(shù)的參數(shù)數(shù)目。

下面看下宏函數(shù)的代碼,⑴處把定義的系統(tǒng)調(diào)用函數(shù)都維護(hù)在全局?jǐn)?shù)組g_syscallHandle。⑵處由于參數(shù)數(shù)量不會(huì)特別大,記錄系統(tǒng)調(diào)用處理函數(shù)參數(shù)數(shù)目的全局?jǐn)?shù)組g_syscallNArgs的類型是UINT8,每4個(gè)bit位維護(hù)一個(gè)系統(tǒng)調(diào)用的參數(shù)數(shù)目。

  1. ... 
  2. static UINTPTR g_syscallHandle[SYS_CALL_NUM] = {0}; 
  3. static UINT8 g_syscallNArgs[(SYS_CALL_NUM + 1) / NARG_PER_BYTE] = {0}; 
  4. ... 
  5. void OsSyscallHandleInit(void) 
  6. #define SYSCALL_HAND_DEF(id, fun, rType, nArg)                                             \ 
  7.     if ((id) < SYS_CALL_NUM) {                                                             \ 
  8. ⑴      g_syscallHandle[(id)] = (UINTPTR)(fun);                                            \ 
  9. ⑵      g_syscallNArgs[(id) / NARG_PER_BYTE] |= ((id) & 1) ? (nArg) << NARG_BITS : (nArg); \ 
  10.     }                                                                                      \ 
  11.  
  12.     #include "syscall_lookup.h" 
  13. #undef SYSCALL_HAND_DEF 
  14.  
  15. LOS_MODULE_INIT(OsSyscallHandleInit, LOS_INIT_LEVEL_KMOD_EXTENDED); 

1.2 syscall/los_syscall.h文件

kernel/liteos_a/syscall/los_syscall.h文件中維護(hù)內(nèi)核的系統(tǒng)調(diào)用對接函數(shù)聲明。函數(shù)實(shí)現(xiàn)一般在目錄/kernel/liteos_a/syscall下的源代碼文件中。該文件主要被如下源文件include使用。

  1. ./kernel/liteos_a/fs/vfs/vfs_cmd/vfs_shellcmd.c:50:#include "los_syscall.h" 
  2. ./kernel/liteos_a/kernel/extended/blackbox/los_blackbox_core.c:46:#include "los_syscall.h" 
  3. ./kernel/liteos_a/kernel/user/src/los_user_init.c:33:#include "los_syscall.h" 
  4. ./kernel/liteos_a/syscall/fs_syscall.c:49:#include "los_syscall.h" 
  5. ./kernel/liteos_a/syscall/los_syscall.c:38:#include "los_syscall.h" 
  6. ./kernel/liteos_a/syscall/net_syscall.c:37:#include "los_syscall.h" 

1.3 系統(tǒng)調(diào)用函數(shù)編號(hào)

維護(hù)系統(tǒng)調(diào)用編號(hào)文件有2個(gè),需要分別在用戶態(tài)和內(nèi)核態(tài)維護(hù)系統(tǒng)調(diào)用函數(shù)編號(hào)。除了文件porting/liteos_a/kernel/include/bits/syscall.h中多個(gè)幾個(gè)參數(shù)數(shù)目的宏定義外,下述兩個(gè)文件的內(nèi)容基本相同。

  • third_party/musl/porting/liteos_a/user/arch/arm/bits/syscall.h.in
  • third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h

2. 系統(tǒng)調(diào)用開發(fā)示例

當(dāng)需要新增一個(gè)系統(tǒng)調(diào)用接口時(shí),可以參考下述步驟:

  • 在LibC庫中確定并添加新增的系統(tǒng)調(diào)用號(hào)。
  • 在LibC庫中新增用戶態(tài)的函數(shù)接口聲明及實(shí)現(xiàn)。
  • 在內(nèi)核系統(tǒng)調(diào)用頭文件中確定并添加新增的系統(tǒng)調(diào)用號(hào)及對應(yīng)內(nèi)核處理函數(shù)的聲明。
  • 在內(nèi)核中新增該系統(tǒng)調(diào)用對應(yīng)的內(nèi)核處理函數(shù)。

2.1 在LibC庫中確定并添加新增的系統(tǒng)調(diào)用號(hào)

編輯文件porting/liteos_a/user/arch/arm/bits/syscall.h.in,如下所示,其中⑴處的__NR_new_syscall_sample為新增系統(tǒng)調(diào)用號(hào)。需要注意同時(shí)更新下⑵處的編號(hào)。

  1.   /* OHOS customized syscalls, not compatible with ARM EABI */ 
  2.     #define __NR_OHOS_BEGIN         500 
  3.     #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) 
  4.     ...... 
  5.     #define __NR_sysconf            (__NR_OHOS_BEGIN + 21) 
  6. ⑴  #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 22) /* 新增的系統(tǒng)調(diào)用號(hào) __NR_new_syscall_sample:522 */ 
  7. ⑵  #define __NR_syscallend         (__NR_OHOS_BEGIN + 23) 

2.2 在LibC庫中新增用戶態(tài)的函數(shù)接口聲明及實(shí)現(xiàn)。

系統(tǒng)調(diào)用提供基礎(chǔ)的用戶態(tài)程序與內(nèi)核的交互功能,不建議開發(fā)者直接使用系統(tǒng)調(diào)用接口,推薦使用內(nèi)核提供的對外POSIX接口。需要在LibC庫中新增用戶態(tài)接口的聲明與實(shí)現(xiàn)。為了簡化,我們在現(xiàn)成的一個(gè)源文件里增加一函數(shù)實(shí)現(xiàn)代碼,如third_party/musl/porting/liteos_a/user/src/aio/aio.c文件中增加:

  1. /* 新增系統(tǒng)調(diào)用用戶態(tài)的接口實(shí)現(xiàn) */ 
  2. void newSyscallSample(int num) 
  3.      printf("user mode: num = %d\n", num); 
  4.      __syscall(SYS_new_syscall_sample, num); 
  5.      return

2.3 在內(nèi)核系統(tǒng)調(diào)用頭文件中新增系統(tǒng)調(diào)用號(hào)

在內(nèi)核系統(tǒng)調(diào)用頭文件中新增系統(tǒng)調(diào)用號(hào),如下所示,在third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h文件中,__NR_new_syscall_sample為新增系統(tǒng)調(diào)用號(hào)。用戶態(tài)代碼和內(nèi)核態(tài)代碼增加系統(tǒng)調(diào)用號(hào)方式相同,編號(hào)相同。

  1. /* OHOS customized syscalls, not compatible with ARM EABI */ 
  2. #define __NR_OHOS_BEGIN         500 
  3. #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) 
  4. ... 
  5. #define __NR_sysconf            (__NR_OHOS_BEGIN + 21) 
  6. #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 22) /* 新增的系統(tǒng)調(diào)用號(hào) __NR_new_syscall_sample:522 */ 
  7. #define __NR_syscallend         (__NR_OHOS_BEGIN + 23) 
  8. ... 

在kernel/liteos_a/syscall/syscall_lookup.h中,增加一行,如下。

  1. ... 
  2. /* 當(dāng)前現(xiàn)有的系統(tǒng)調(diào)用清單 */ 
  3. SYSCALL_HAND_DEF(__NR_chown, SysChown, int, ARG_NUM_3) 
  4. SYSCALL_HAND_DEF(__NR_chown32, SysChown, int, ARG_NUM_3) 
  5. #ifdef LOSCFG_SECURITY_CAPABILITY 
  6. SYSCALL_HAND_DEF(__NR_ohoscapget, SysCapGet, UINT32, ARG_NUM_2) 
  7. SYSCALL_HAND_DEF(__NR_ohoscapset, SysCapSet, UINT32, ARG_NUM_1) 
  8. #endif 
  9. /* 新增系統(tǒng)調(diào)用 */ 
  10. SYSCALL_HAND_DEF(__NR_new_syscall_sample, SysNewSyscallSample, void, ARG_NUM_1) 
  11. ... 

2.4 在內(nèi)核中新增系統(tǒng)調(diào)用對應(yīng)的處理函數(shù)

需要在內(nèi)核中新增系統(tǒng)調(diào)用函數(shù)聲明及函數(shù)實(shí)現(xiàn),并加入編譯構(gòu)建文件。首先,如下所示,在kernel/liteos_a/syscall/los_syscall.h中,SysNewSyscallSample為新增系統(tǒng)調(diào)用的內(nèi)核處理函數(shù)聲明。

  1. ... 
  2. /* 當(dāng)前現(xiàn)有的系統(tǒng)調(diào)用內(nèi)核處理函數(shù)聲明清單 */ 
  3. ... 
  4. extern int SysTimerGettime64(timer_t timerID, struct itimerspec64 *value); 
  5. ... 
  6. /* 新增的系統(tǒng)調(diào)用內(nèi)核處理函數(shù)聲明 */ 
  7. extern void SysNewSyscallSample(int num); 
  8. ... 

然后在kernel/liteos_a/syscall目錄下新建個(gè)源文件syscall_demo.c,新增系統(tǒng)調(diào)用的內(nèi)核處理函數(shù)實(shí)現(xiàn)如下。

  1. #include "los_printf.h" 
  2. /* 新增系統(tǒng)調(diào)用內(nèi)核處理函數(shù)的實(shí)現(xiàn) */ 
  3. void SysNewSyscallSample(int num) 
  4.     PRINTK("kernel mode: num = %d\n", num); 
  5.     return

最后,在文件kernel/liteos_a/syscall/BUILD.gn中增加對syscall_demo.c源文件的編譯管理。

  1. import("//kernel/liteos_a/liteos.gni"
  2.  
  3. module_switch = defined(LOSCFG_KERNEL_SYSCALL) 
  4. module_name = get_path_info(rebase_path("."), "name"
  5. kernel_module(module_name) { 
  6.   sources = [ 
  7.     "fs_syscall.c"
  8. ...... 
  9.     "syscall_demo.c" 
  10.   ] 

2.5 調(diào)用并驗(yàn)證

參考官網(wǎng)Hello World示例,修改示例applications/sample/camera/apps/src/helloworld.c,增加系統(tǒng)調(diào)用內(nèi)容newSyscallSample(10)。

  1. #include <stdio.h> 
  2. #include "syscall.h" 
  3.  
  4. /* 新增系統(tǒng)調(diào)用用戶態(tài)的接口實(shí)現(xiàn) */ 
  5. void newSyscallSample(int num) 
  6.      printf("user mode: num = %d\n", num); 
  7.      __syscall(SYS_new_syscall_sample, num); 
  8.      return
  9.  
  10. int main(int argc, char **argv) 
  11.     printf("\n************************************************\n"); 
  12.     printf("\n\t\tHello OHOS!\n"); 
  13.     printf("\n************************************************\n\n"); 
  14.     newSyscallSample(10); 
  15.     return 0; 

在工程根目錄,hb set選擇產(chǎn)品ipcamera_hispark_taurus,然后hb build構(gòu)建,使用Device Tool工具燒錄Hi3516開發(fā)板,運(yùn)行在串口得到輸出結(jié)果如下。用戶態(tài)接口與內(nèi)核態(tài)接口均有輸出,證明系統(tǒng)調(diào)用已使能。

OpenHarmony LiteOS-A內(nèi)核文檔之學(xué)習(xí)--系統(tǒng)調(diào)用-鴻蒙HarmonyOS技術(shù)社區(qū)

3. 小結(jié)

本文學(xué)習(xí)小型系統(tǒng)內(nèi)核開發(fā)-系統(tǒng)調(diào)用官網(wǎng)文檔,并在Hi3516開發(fā)板上實(shí)際驗(yàn)證操作,通過動(dòng)手更好的掌握了系統(tǒng)調(diào)用。

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2020-09-17 17:41:24

Liteos-a鴻蒙Linux

2020-11-13 09:45:36

Liteos-a

2022-12-07 15:56:33

procfsLiteOS-A

2023-02-01 16:28:30

Linux內(nèi)核鴻蒙

2021-12-29 16:13:03

鴻蒙HarmonyOS應(yīng)用

2021-05-24 14:28:34

鴻蒙HarmonyOS應(yīng)用

2020-10-22 10:08:06

韋東山STM32MP157鴻蒙

2020-10-19 10:28:58

liteos-a移植STM32MP157

2023-02-01 16:38:53

2023-04-10 09:44:22

內(nèi)核鼠標(biāo)調(diào)試鴻蒙

2011-07-05 18:10:14

PHP

2011-07-07 16:41:04

PHP

2011-08-05 14:48:06

iPhone應(yīng)用 異步隊(duì)列

2021-03-15 15:18:16

鴻蒙HarmonyOS應(yīng)用

2020-11-02 11:42:17

鴻蒙Liteos-a

2020-10-16 09:47:34

鴻蒙Liteos-a移植

2011-07-07 17:48:36

PHP

2021-06-03 08:03:13

網(wǎng)絡(luò)

2011-07-20 10:30:29

C語言

2019-08-13 10:34:26

鴻蒙OS跨平臺(tái)Linux內(nèi)核
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久天天 | 亚洲国产欧美一区二区三区久久 | 亚洲97 | www.欧美| 一区二区三区av | 天天夜夜操 | 三级免费 | 色综合久久天天综合网 | 亚洲午夜视频在线观看 | 精品国产乱码久久久久久牛牛 | 国产在线成人 | 看特级黄色片 | 国产精品色综合 | 网站国产| 色视频www在线播放国产人成 | 午夜精品91 | 亚洲成人精品在线 | 91国内精精品久久久久久婷婷 | 国产精产国品一二三产区视频 | 国产成人在线一区 | 中文字幕国产视频 | 国产丝袜一区二区三区免费视频 | 免费久草| 精品伊人久久 | 国产精品毛片一区二区在线看 | 国产成人精品一区二区三区四区 | 黄色av大片 | 精品无码久久久久久国产 | 国产伦精品一区二区三区照片91 | 亚洲精品综合一区二区 | 亚洲精品国产成人 | 天天干天天干 | 成人自拍视频 | 久草网站 | 中文字幕在线电影观看 | 婷婷久久一区 | 亚洲精品在线免费观看视频 | 久夜精品| 美国一级黄色片 | 99色播| 国产精品久久久久久一区二区三区 |