0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用戶空間接口是什么

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 作者:蝸窩科技 ? 2023-09-11 16:01 ? 次閱讀

/sys/power/state

state 是 sysfs 中一個(gè)文件,為 Generic PM
的核心接口,在“kernel/power/main.c”中實(shí)現(xiàn),用于將系統(tǒng)置于指定的 Power State。

讀取該文件,返回當(dāng)前系統(tǒng)支持的 Power State,形式為字符串。在內(nèi)核中,有兩種類型的 Power
State,一種是 Hibernate
相關(guān)的,名稱為“disk”,除“disk”之外,內(nèi)核在"/kernel/power/suspend.c"中通過(guò)數(shù)組的形式定義了另外 3 個(gè)
state,如下:

const char *const pm_states[PM_SUSPEND_MAX] = {
    [PM_SUSPEND_FREEZE]     = "freeze",
    [PM_SUSPEND_STANDBY]    = "standby",
    [PM_SUSPEND_MEM]        = "mem",
};

這些 Power State 的解釋如下:

  1. freeze:不涉及具體的
    Hardware 或 Driver,只是凍結(jié)所有的進(jìn)程,包括用戶空間進(jìn)程及內(nèi)核線程
  2. standby
  3. mem,即通常所講的 Sleep
    功能,STR,Suspend to RAM。
  4. disk,即
    Hibernate 功能,STD,Suspend to Disk。

寫入特定的 Power State 字符串,將會(huì)把系統(tǒng)置為該模式。

/sys/power/wakeup_count

該接口只和 Sleep 功能有關(guān),因此由“CONFIG_PM_SLEEP”宏定義控制。它的存在,是為了解決
Sleep 和 Wakeup 之間的同步問(wèn)題。

系統(tǒng)睡眠后,可以通過(guò)保留的 Wakeup source 喚醒系統(tǒng)。而在 CPU 體系中,喚醒系統(tǒng)就是喚醒
CPU,而喚醒 CPU 的唯一途徑,就是 Wakeup source 產(chǎn)生中斷(內(nèi)核稱作 Wakeup event)。而內(nèi)核要保證在多種狀態(tài)下,Sleep/Wakeup
的行為都能正常,如下:

▆ 系統(tǒng)處于 sleep 狀態(tài)時(shí),產(chǎn)生了 Wakeup event。此時(shí)應(yīng)該直接喚醒系統(tǒng)。這沒(méi)有問(wèn)題。

▆ 系統(tǒng)在進(jìn)入 sleep 的過(guò)程中,產(chǎn)生了
Wakeup event。此時(shí)應(yīng)該放棄進(jìn)入 sleep。

這一點(diǎn)就不那么容易做到了。例如,當(dāng) Wakeup event
發(fā)生在“/sys/power/state”被寫之后、內(nèi)核執(zhí)行 freeze 操作之前。此時(shí)用戶空間程序依舊可以處理 Wakeup
event,或者只是部分處理。而內(nèi)核卻以為該 Event 已經(jīng)被處理,因此并不會(huì)放棄此次 sleep 動(dòng)作。

這就會(huì)造成,Wakeup event 發(fā)生后,用戶空間程序已經(jīng)后悔了,不想睡了,但最終還是睡下去了。直到下一個(gè)
Wakeup event 到來(lái)。

為了解決上面的問(wèn)題,內(nèi)核提供 wakeup_count 機(jī)制,配合“/sys/power/state”,以實(shí)現(xiàn)
Sleep 過(guò)程中的同步。該機(jī)制的操作行為如下:

▆ wakeup_count 是內(nèi)核用來(lái)保存當(dāng)前
wakeup event 發(fā)生的計(jì)數(shù)。

▆ 用戶空間程序在寫入
state 切換狀態(tài)之前,應(yīng)先讀取 wakeup_count 并把獲得的 count 寫回給 wakeup_count。

▆ 內(nèi)核會(huì)比對(duì)寫回的 count 和當(dāng)前的 count 是否一致,如果不一致,說(shuō)明在讀取/寫回操作之間,產(chǎn)生了新的的
wakeup event,內(nèi)核就會(huì)返回錯(cuò)誤。

▆ 用戶空間程序檢測(cè)到寫入錯(cuò)誤之后,不能繼續(xù)后的動(dòng)作,需要處理響應(yīng)的 event 并伺機(jī)再次讀取/寫回
wakeup_count。

▆ 如果內(nèi)核比對(duì)一致,會(huì)記錄 write wakeup_count 成功時(shí)的 event 快照,后面繼續(xù)
suspend 動(dòng)作時(shí),會(huì)檢查是否和快照相符,如果不符,會(huì)終止 suspend。

▆ 用戶空間程序檢測(cè)到寫入正確后,可以繼續(xù)對(duì) state 的寫入,以便發(fā)起一次狀態(tài)切換。而此時(shí)是安全的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5088

    文章

    19158

    瀏覽量

    306495
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8669

    瀏覽量

    151551
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11329

    瀏覽量

    209972
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux用戶空間與內(nèi)核空間的區(qū)別?

    為的分為兩個(gè)部分--用戶空間與內(nèi)核空間。用戶空間地址分布從0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3G
    發(fā)表于 06-05 04:35

    什么是板間接口信號(hào)?

    什么是板間接口信號(hào)?什么是星-點(diǎn)接地?
    發(fā)表于 04-09 06:18

    USB接口怎么實(shí)現(xiàn)間接的數(shù)據(jù)讀寫?

    利用FTDI公司的FT232AM完成RS232和USB之間的接口轉(zhuǎn)換,然后再對(duì)USB接口實(shí)現(xiàn)間接的數(shù)據(jù)讀寫。
    發(fā)表于 04-26 06:41

    用戶空間與內(nèi)核通信方式是什么

    用戶空間與內(nèi)核通信方式有哪些?系統(tǒng)調(diào)用,提供特定的用戶空間與內(nèi)核空間的信息傳遞。信號(hào),內(nèi)核空間
    發(fā)表于 12-20 08:06

    用戶空間如何訪問(wèn)內(nèi)核空間?

    訪問(wèn)。嵌入式Linux:C開(kāi)發(fā)“會(huì)看使用說(shuō)明書(shū)”用戶空間不能隨便訪問(wèn)內(nèi)核空間3、用戶空間如何訪問(wèn)內(nèi)核空間
    發(fā)表于 12-27 06:15

    TD-SCDMA RTT的空間接口技術(shù)綜述

    TD-SCDMA RTT的空間接口技術(shù)綜述:
    發(fā)表于 05-21 13:22 ?20次下載
    TD-SCDMA RTT的<b class='flag-5'>空間接口</b>技術(shù)綜述

    空間數(shù)據(jù)插件技術(shù)研究

    利用數(shù)據(jù)庫(kù)技術(shù)來(lái)管理海量的空間數(shù)據(jù),有兩種方法:一種是在數(shù)據(jù)庫(kù)和用戶應(yīng)用系統(tǒng)間建立中間層,稱為空間數(shù)據(jù)引擎SDE,利用SDE作為中間接口使數(shù)據(jù)庫(kù)操作系統(tǒng)能存儲(chǔ)和管理空
    發(fā)表于 08-07 09:56 ?9次下載

    過(guò)程計(jì)算系統(tǒng)和技術(shù)過(guò)程之間接口的說(shuō)明 GB12058-89

    過(guò)程計(jì)算系統(tǒng)和技術(shù) 過(guò)程之間接口的說(shuō)明 GB12058-89 本標(biāo)準(zhǔn)是供所有從事過(guò)程接口設(shè)計(jì)、生產(chǎn)、銷售以及應(yīng)用方面人員使用的規(guī)范。包含了這些接口規(guī)范所需要的
    發(fā)表于 04-30 11:56 ?11次下載

    用戶接口電路

    用戶接口電路是完成用戶交換機(jī)和模擬用戶中繼線之間接口功能的部件。
    發(fā)表于 05-27 09:43 ?37次下載

    模塊間接口設(shè)計(jì)不匹配問(wèn)題

    模塊間接口設(shè)計(jì)不匹配引起的問(wèn)題   如果沒(méi)有一個(gè)技術(shù)能力很強(qiáng)的集成者,往往在模塊間容易出現(xiàn)設(shè)計(jì)上的錯(cuò)誤。這種情況是災(zāi)難性的,雙方都是在
    發(fā)表于 11-21 14:01 ?729次閱讀

    用戶空間和內(nèi)核空間通訊-Netlink 上

    Alan Cox在內(nèi)核1.3版本的開(kāi)發(fā)階段最先引入了Netlink,剛開(kāi)始時(shí)Netlink是以字符驅(qū)動(dòng)接口的方式提供內(nèi)核與用戶空間的雙向數(shù)據(jù)通信;
    發(fā)表于 04-29 15:32 ?597次閱讀

    需要了解linux內(nèi)核空間用戶空間的基本原理

    linux驅(qū)動(dòng)程序一般工作在內(nèi)核空間,但也可以工作在用戶空間。下面我們將詳細(xì)解析,什么是內(nèi)核空間,什么是用戶
    發(fā)表于 05-06 16:13 ?740次閱讀

    Linux用戶空間與內(nèi)核空間

    應(yīng)用程序運(yùn)行在用戶空間,而Linux 驅(qū)動(dòng)屬于內(nèi)核的一部分,因此驅(qū)動(dòng)運(yùn)行于內(nèi)核空間。當(dāng)我們?cè)?b class='flag-5'>用戶空間想要實(shí)現(xiàn)對(duì)內(nèi)核的操作,比如使用open
    發(fā)表于 05-20 10:58 ?1037次閱讀
    Linux<b class='flag-5'>用戶</b><b class='flag-5'>空間</b>與內(nèi)核<b class='flag-5'>空間</b>

    什么是futex?Futex用戶和內(nèi)核空間接口API是什么?

    編者按:對(duì)于Linux系統(tǒng)編程來(lái)說(shuō),競(jìng)爭(zhēng)和同步是繞不開(kāi)的話題。之前分享過(guò)Java的對(duì)象鎖,有讀者說(shuō)自己不做Java不太能理解,這次分享Linux中很基礎(chǔ)的同步機(jī)制:futex,內(nèi)容包括基本接口定義和對(duì)于優(yōu)先級(jí)反轉(zhuǎn)的處理,希望對(duì)大家的技術(shù)成長(zhǎng)有幫助。
    的頭像 發(fā)表于 05-20 16:56 ?4352次閱讀
    什么是futex?Futex<b class='flag-5'>用戶</b>和內(nèi)核<b class='flag-5'>空間接口</b>API是什么?

    Suspend是什么意思 過(guò)程概述

    Suspend 功能 源碼目錄 1)PM Core /kernel/ power /main.c ---- 提供用戶空間接口(/ sys /power/ state) /kernel/ power
    的頭像 發(fā)表于 09-11 16:08 ?751次閱讀
    Suspend是什么意思 過(guò)程概述