OpenHarmony LiteOS-A內核文檔之學習--系統調用(1)

      網友投稿 938 2025-03-31

      OpenHarmony LiteOS-A內核文檔之學習–系統調用

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

      Syscall Handler的具體實現在kernel/liteos_a/syscall/los_syscall.c中OsArmA32SyscallHandle函數,在進入系統軟中斷異常時會調用此函數,并且按照kernel/liteos_a/syscall/syscall_lookup.h中的清單進行系統調用的入參解析,執行各系統調用最終對應的內核處理函數。

      1. 涉及的系統調用文件目錄介紹

      先介紹下系統調用相關的內核態代碼、用戶態代碼所在的文件目錄

      1.1 syscall/syscall_lookup.h文件

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

      ...... SYSCALL_HAND_DEF(__NR_write, SysWrite, ssize_t, ARG_NUM_3) SYSCALL_HAND_DEF(__NR_open, SysOpen, int, ARG_NUM_7) SYSCALL_HAND_DEF(__NR_close, SysClose, int, ARG_NUM_1) SYSCALL_HAND_DEF(__NR_creat, SysCreat, int, ARG_NUM_2) ......

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

      下面看下宏函數的代碼,⑴處把定義的系統調用函數都維護在全局數組g_syscallHandle。⑵處由于參數數量不會特別大,記錄系統調用處理函數參數數目的全局數組g_syscallNArgs的類型是UINT8,每4個bit位維護一個系統調用的參數數目。

      ... static UINTPTR g_syscallHandle[SYS_CALL_NUM] = {0}; static UINT8 g_syscallNArgs[(SYS_CALL_NUM + 1) / NARG_PER_BYTE] = {0}; ... void OsSyscallHandleInit(void) { #define SYSCALL_HAND_DEF(id, fun, rType, nArg) \ if ((id) < SYS_CALL_NUM) { \ ⑴ g_syscallHandle[(id)] = (UINTPTR)(fun); \ ⑵ g_syscallNArgs[(id) / NARG_PER_BYTE] |= ((id) & 1) ? (nArg) << NARG_BITS : (nArg); \ } \ #include "syscall_lookup.h" #undef SYSCALL_HAND_DEF } LOS_MODULE_INIT(OsSyscallHandleInit, LOS_INIT_LEVEL_KMOD_EXTENDED);

      1.2 syscall/los_syscall.h文件

      kernel/liteos_a/syscall/los_syscall.h文件中維護內核的系統調用對接函數聲明。函數實現一般在目錄/kernel/liteos_a/syscall下的源代碼文件中。該文件主要被如下源文件include使用。

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

      1.3 系統調用函數編號

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

      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. 系統調用開發示例

      當需要新增一個系統調用接口時,可以參考下述步驟:

      在LibC庫中確定并添加新增的系統調用號。

      在LibC庫中新增用戶態的函數接口聲明及實現。

      在內核系統調用頭文件中確定并添加新增的系統調用號及對應內核處理函數的聲明。

      在內核中新增該系統調用對應的內核處理函數。

      2.1 在LibC庫中確定并添加新增的系統調用號

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

      /* OHOS customized syscalls, not compatible with ARM EABI */ #define __NR_OHOS_BEGIN 500 #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) ...... #define __NR_sysconf (__NR_OHOS_BEGIN + 21) ⑴ #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 22) /* 新增的系統調用號 __NR_new_syscall_sample:522 */ ⑵ #define __NR_syscallend (__NR_OHOS_BEGIN + 23)

      2.2 在LibC庫中新增用戶態的函數接口聲明及實現。

      OpenHarmony LiteOS-A內核文檔之學習--系統調用(1)

      系統調用提供基礎的用戶態程序與內核的交互功能,不建議開發者直接使用系統調用接口,推薦使用內核提供的對外POSIX接口。需要在LibC庫中新增用戶態接口的聲明與實現。為了簡化,我們在現成的一個源文件里增加一函數實現代碼,如third_party/musl/porting/liteos_a/user/src/aio/aio.c文件中增加:

      /* 新增系統調用用戶態的接口實現 */ void newSyscallSample(int num) { printf("user mode: num = %d\n", num); __syscall(SYS_new_syscall_sample, num); return; }

      IoT 輕量級操作系統 LiteOS

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:將excel轉換成vcf的方法步驟圖
      下一篇:無代碼通用開發平臺源碼(無代碼軟件開發平臺)
      相關文章
      亚洲三级电影网站| 亚洲精品午夜国产VA久久成人| 亚洲AV区无码字幕中文色| 亚洲伊人久久精品影院| 亚洲成人一区二区| 亚洲国产精品成人网址天堂| 四虎亚洲国产成人久久精品| 亚洲AV日韩AV无码污污网站| 亚洲av无码专区在线观看下载| 亚洲日本VA中文字幕久久道具| 亚洲 欧洲 日韩 综合在线| 91丁香亚洲综合社区| 亚洲成a人片在线看| 亚洲最大的成人网站| 亚洲乱码日产精品一二三| 亚洲爆乳少妇无码激情| 国产亚洲视频在线| 亚洲精品国产成人影院| 亚洲一区无码中文字幕| 亚洲VA成无码人在线观看天堂| 亚洲AV日韩AV天堂久久 | 91亚洲自偷手机在线观看| 97亚洲熟妇自偷自拍另类图片 | heyzo亚洲精品日韩| 国产L精品国产亚洲区久久| 国产aⅴ无码专区亚洲av麻豆| 亚洲中文无韩国r级电影| 亚洲人成人一区二区三区| 亚洲av无码不卡一区二区三区| 久久亚洲私人国产精品| 亚洲人成网站在线观看播放动漫 | 在线观看亚洲精品专区| 久久精品国产亚洲AV不卡| 国产亚洲高清不卡在线观看| 亚洲AV第一页国产精品| 亚洲在成人网在线看| 亚洲精品国产高清在线观看| 亚洲国产精品13p| 国产V亚洲V天堂无码久久久| 亚洲综合在线成人一区| 亚洲熟妇AV一区二区三区宅男|