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

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

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

解析Linux內(nèi)核頁(yè)表管理中那些鮮為人知的秘密

Linux閱碼場(chǎng) ? 來(lái)源:Linux內(nèi)核遠(yuǎn)航者 ? 作者:Linux內(nèi)核遠(yuǎn)航者 ? 2021-06-11 16:32 ? 次閱讀

1.開(kāi)場(chǎng)白

環(huán)境:

處理器架構(gòu):arm64

內(nèi)核源碼:linux-5.11

ubuntu版本:20.04.1

代碼閱讀工具:vim+ctags+cscope

通用操作系統(tǒng),通常都會(huì)開(kāi)啟mmu來(lái)支持虛擬內(nèi)存管理,而頁(yè)表管理是在虛擬內(nèi)存管理中尤為重要,本文主要以回答幾個(gè)頁(yè)表管理中關(guān)鍵性問(wèn)題來(lái)解析Linux內(nèi)核頁(yè)表管理,看一看頁(yè)表管理中那些鮮為人知的秘密。

2.頁(yè)表的作用是什么?

1)地址轉(zhuǎn)換

將虛擬地址轉(zhuǎn)換為物理地址

2)權(quán)限管理

管理cpu對(duì)物理頁(yè)的訪問(wèn),如讀寫執(zhí)行權(quán)限

3)隔離地址空間

隔離各個(gè)進(jìn)程的地址空間,使其互不影響,提供系統(tǒng)的安全性

打開(kāi)mmu后,對(duì)沒(méi)有頁(yè)表映射的虛擬內(nèi)存訪問(wèn)或者有頁(yè)表映射但是沒(méi)有訪問(wèn)權(quán)限都會(huì)發(fā)生處理器異常,內(nèi)核選擇殺死進(jìn)程或者panic;通過(guò)頁(yè)表給一段內(nèi)存設(shè)置用戶態(tài)不可訪問(wèn), 這樣可以做到用戶態(tài)的用戶進(jìn)程不能訪問(wèn)內(nèi)核地址空間的內(nèi)容;而由于用戶進(jìn)程各有一套自己的頁(yè)表,所以彼此看不到對(duì)方的地址空間,更別提訪問(wèn),造成每個(gè)進(jìn)程都認(rèn)為自己擁有所有虛擬內(nèi)存的錯(cuò)覺(jué);通過(guò)頁(yè)表給一段內(nèi)存設(shè)置只讀屬性,那么就不容許修改這段內(nèi)存內(nèi)容,從而保護(hù)了這段內(nèi)存不被改寫;對(duì)應(yīng)用戶進(jìn)程地址空間映射的物理內(nèi)存,內(nèi)核可以很方便的進(jìn)行頁(yè)面遷移和頁(yè)面交換,而對(duì)使用虛擬地址的用戶進(jìn)程來(lái)說(shuō)是透明的;通過(guò)頁(yè)表,很容易實(shí)現(xiàn)內(nèi)存共享,使得一份共享庫(kù)很多進(jìn)程都可以映射到自己地址空間使用;通過(guò)頁(yè)表,可以小內(nèi)存加載大應(yīng)用程序運(yùn)行,在運(yùn)行時(shí)按需加載和映射。..

3.頁(yè)表的存放在哪?

頁(yè)表存放在物理內(nèi)存中,打開(kāi)mmu之后,如果需要修改頁(yè)表,需要將頁(yè)表所在的物理地址映射到虛擬地址才能訪問(wèn)頁(yè)表(如內(nèi)核初始化后會(huì)將物理內(nèi)存線性映射,這樣通過(guò)物理地址和虛擬地址的偏移就可以獲得頁(yè)表物理地址對(duì)應(yīng)的虛擬地址)。

4. 頁(yè)表項(xiàng)中存放是虛是實(shí)?

頁(yè)表基地址寄存器和各級(jí)頁(yè)表項(xiàng)中存放的都是物理地址,而不是虛擬地址。

5. 開(kāi)啟mmu后地址轉(zhuǎn)換過(guò)程?

虛擬地址轉(zhuǎn)換物理地址的過(guò)程:打開(kāi)mmu后,cpu訪問(wèn)的都是虛擬地址,當(dāng)cpu訪問(wèn)一個(gè)虛擬地址的時(shí)候,會(huì)通過(guò)cpu內(nèi)部的mmu來(lái)查詢物理地址,mmu首先通過(guò)虛擬地址在tlb中查找,如果找到相應(yīng)表項(xiàng),直接獲得物理地址;如果tlb沒(méi)有找到,就會(huì)通過(guò)虛擬地址從頁(yè)表基地址寄存器保存的頁(yè)表基地址開(kāi)始查詢多級(jí)頁(yè)表,最終查詢到找到相應(yīng)表項(xiàng),會(huì)將表項(xiàng)緩存到tlb中,然后從表項(xiàng)中獲得物理地址。

6. Linux內(nèi)核為何使用多級(jí)頁(yè)表?

1)使用一級(jí)頁(yè)表結(jié)構(gòu)優(yōu)劣:

優(yōu)勢(shì):

只需要2次訪問(wèn)內(nèi)存(一次訪問(wèn)頁(yè)表,一次訪問(wèn)數(shù)據(jù)),效率高,實(shí)現(xiàn)簡(jiǎn)單

劣勢(shì):

需要連續(xù)的大塊內(nèi)存存放每個(gè)進(jìn)程的頁(yè)表(如32位系統(tǒng)每個(gè)進(jìn)程需要4M頁(yè)表),浪費(fèi)內(nèi)存,虛擬內(nèi)存越大頁(yè)表越大,內(nèi)存碎片化的時(shí)候很難分配到連續(xù)大塊內(nèi)存,大多數(shù)虛擬內(nèi)存并沒(méi)有使用。

2)使用多級(jí)頁(yè)表結(jié)構(gòu)優(yōu)劣:

優(yōu)勢(shì):

1.節(jié)省內(nèi)存

2.可以按需分配各級(jí)頁(yè)表

3.可以離散存儲(chǔ)頁(yè)表

劣勢(shì):

需要遍歷多級(jí)頁(yè)表,需要多次訪問(wèn)內(nèi)存,實(shí)現(xiàn)復(fù)雜度高點(diǎn)

3)Linux內(nèi)核綜合考慮:

典型的以時(shí)間換空間,可以將各級(jí)頁(yè)表放到物理內(nèi)存的任何地方,無(wú)論是硬件遍歷還是內(nèi)核遍歷,比一級(jí)頁(yè)表更復(fù)雜,但是為了節(jié)省內(nèi)存,內(nèi)核選擇多級(jí)頁(yè)表結(jié)構(gòu)。

7.減小多級(jí)頁(yè)表遍歷的優(yōu)化?

1)mmu中添加tlb

來(lái)緩存最近訪問(wèn)的頁(yè)表表項(xiàng),根據(jù)程序的時(shí)間和空間的局部性原理,tlb能有很高的命中率。

2)使用巨型頁(yè)

減少訪存次數(shù)(如使用1G或2M巨型頁(yè)),可以減少tlb miss和缺頁(yè)異常。

8. 硬件做了哪些事情?

遍歷頁(yè)表,將va轉(zhuǎn)換為pa,頁(yè)面權(quán)限管理

涉及到的硬件為:

mmu

->功能:查詢tlb或者遍歷頁(yè)表

tlb

->功能:緩存最近轉(zhuǎn)換的頁(yè)表?xiàng)l目

頁(yè)表基地址寄存器 如ttbr0_el1 ttbr1_el1

->功能:存放頁(yè)表基地址(物理地址)作為mmu遍歷多級(jí)頁(yè)表的起點(diǎn)

mmu進(jìn)行多級(jí)頁(yè)表遍歷時(shí)當(dāng)發(fā)現(xiàn)虛擬地址的最高bit為1時(shí)使用 ttbr1_el1作為遍歷起點(diǎn),最高bit為0時(shí)使用 ttbr0_el1作為遍歷起點(diǎn)。

9. 軟件做了哪些事情?

1)應(yīng)用程序

訪問(wèn)虛擬內(nèi)存即可如執(zhí)行指令、讀寫內(nèi)存, 沒(méi)有權(quán)限管理頁(yè)表

不管虛擬內(nèi)存如何轉(zhuǎn)換為物理內(nèi)存,對(duì)應(yīng)用來(lái)說(shuō)透明。

2)Linux內(nèi)核

填寫頁(yè)表,將頁(yè)表基地址告訴mmu

內(nèi)核初始化建立內(nèi)核頁(yè)表,實(shí)現(xiàn)缺頁(yè)異常等機(jī)制為用戶任務(wù)按需分配并映射頁(yè)表。

當(dāng)然,內(nèi)核也可以遍歷頁(yè)表,如缺頁(yè)異常時(shí)遍歷進(jìn)程頁(yè)表。

10. 內(nèi)核中涉及到的頁(yè)表基地址?

內(nèi)核:

idmap_pg_dir 恒等映射頁(yè)表(va=pa 映射2M)

init_pg_dir 粗粒度內(nèi)核頁(yè)表

swapper_pg_dir 主內(nèi)核頁(yè)表

用戶:

tsk->mm->pgd用戶進(jìn)程fork的時(shí)候分配私有的pgd頁(yè),用于保存pgd表項(xiàng)(僅僅分配了第一級(jí)頁(yè)表)。

11. 頁(yè)表填寫/切換時(shí)機(jī)

1)內(nèi)核頁(yè)表填充

內(nèi)核初始化過(guò)程:

物理地址 -> 恒等映射(建立恒等映射頁(yè)表和粗粒度內(nèi)核頁(yè)表) ->打開(kāi)mmu -> paging_init(建立細(xì)粒度的內(nèi)核頁(yè)表和內(nèi)存線性映射) -> 。..

恒等映射階段:

將恒等映射頁(yè)表idmap_pg_dir 地址保存到ttbr0_el1

將 粗粒度內(nèi)核頁(yè)表init_pg_dir 地址保存到ttbr1_el1

paging_init階段:

將內(nèi)核主頁(yè)表swapper_pg_dir 地址保存到ttbr1_el1

paging_init之后丟棄idmap_pg_dir 和init_pg_dir 頁(yè)表的使用。

2)用戶頁(yè)表填充

訪問(wèn)時(shí)缺頁(yè)填充:

用戶進(jìn)程訪問(wèn)已經(jīng)申請(qǐng)的虛擬內(nèi)存時(shí),發(fā)生缺頁(yè),缺頁(yè)處理程序中為進(jìn)程分配各級(jí)頁(yè)表等物理頁(yè)并建立頁(yè)表映射關(guān)系。

進(jìn)程切換時(shí)切換進(jìn)程頁(yè)表:

switch_mm的時(shí)候切換tsk->mm->pgd到ttbr0_el1以及asid 到ttbr1_el1,從而完成了進(jìn)程地址空間切換。

12.頁(yè)表遍歷過(guò)程

下面以arm64處理器架構(gòu)多級(jí)頁(yè)表遍歷作為結(jié)束(使用4級(jí)頁(yè)表,頁(yè)大小為4K):

Linux內(nèi)核中 可以將頁(yè)表擴(kuò)展到5級(jí),分別是頁(yè)全局目錄(Page Global Directory, PGD), 頁(yè)4級(jí)目錄(Page 4th Directory, P4D), 頁(yè)上級(jí)目錄(Page Upper Directory, PUD),頁(yè)中間目錄(Page Middle Directory, PMD),直接頁(yè)表(Page Table, PT),而支持arm64的linux使用4級(jí)頁(yè)表結(jié)構(gòu)分別是 pgd, pud, pmd, pt ,arm64手冊(cè)中將他們分別叫做L0,L1,L2,L3級(jí)轉(zhuǎn)換表,所以一下使用L0-L3表示各級(jí)頁(yè)表。

tlb miss時(shí),mmu會(huì)進(jìn)行多級(jí)頁(yè)表遍歷遍歷過(guò)程如下:

1.mmu根據(jù)虛擬地址的最高位判斷使用哪個(gè)頁(yè)表基地址寄存器作為起點(diǎn):當(dāng)最高位為0時(shí),使用ttbr0_el1作為起點(diǎn)(訪問(wèn)的是用戶空間地址);當(dāng)最高位為1時(shí),使用ttbr1_el1作為起點(diǎn)(訪問(wèn)的是內(nèi)核空間地址)mmu從相應(yīng)的頁(yè)表基地址寄存器中獲得L0轉(zhuǎn)換表基地址。

2.找到L0級(jí)轉(zhuǎn)換表,然后從虛擬地址中獲得L0索引,通過(guò)L0索引找到相應(yīng)的表項(xiàng)(arm64中稱為L(zhǎng)0表描述符,內(nèi)核中叫做PGD表項(xiàng)),從表項(xiàng)中獲得L1轉(zhuǎn)換表基地址。

3.找到L1級(jí)轉(zhuǎn)換表,然后從虛擬地址中獲得L1索引,通過(guò)L1索引找到相應(yīng)的表項(xiàng)(arm64中稱為L(zhǎng)1表描述符,內(nèi)核中叫做PUD表項(xiàng)),從表項(xiàng)中獲得L2轉(zhuǎn)換表基地址。

4.找到L2級(jí)轉(zhuǎn)換表,然后從虛擬地址中獲得L2索引,通過(guò)L2索引找到相應(yīng)的表項(xiàng)(arm64中稱為L(zhǎng)2表描述符,內(nèi)核中叫做PUD表項(xiàng)),從表項(xiàng)中獲得L3轉(zhuǎn)換表基地址。

5.找到L3級(jí)轉(zhuǎn)換表,然后從虛擬地址中獲得L3索引,通過(guò)L3索引找到頁(yè)表項(xiàng)(arm64中稱為頁(yè)描述符,內(nèi)核中叫做頁(yè)表項(xiàng))。

6.從頁(yè)表項(xiàng)中取出物理頁(yè)幀號(hào)然后加上物理地址偏移(VA[11,0])獲得最終的物理地址。

原文標(biāo)題:Linux內(nèi)核頁(yè)表管理-那些鮮為人知的秘密

文章出處:【微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(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)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1346

    瀏覽量

    40152
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11161

    瀏覽量

    208468

原文標(biāo)題:Linux內(nèi)核頁(yè)表管理-那些鮮為人知的秘密

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    Linux系統(tǒng),驅(qū)動(dòng)程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序的編寫 驅(qū)
    的頭像 發(fā)表于 08-30 15:02 ?287次閱讀

    Linux內(nèi)核測(cè)試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負(fù)責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)
    的頭像 發(fā)表于 08-13 13:42 ?341次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測(cè)試技術(shù)

    Linux內(nèi)核頁(yè)映射的基礎(chǔ)知識(shí)

    大家在看內(nèi)核代碼時(shí)會(huì)經(jīng)??吹囊陨闲g(shù)語(yǔ),但在ARM的芯片手冊(cè)并沒(méi)有用到這些術(shù)語(yǔ),而是使用L1,L2,L3頁(yè)這種術(shù)語(yǔ)。
    的頭像 發(fā)表于 08-07 15:53 ?469次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b><b class='flag-5'>頁(yè)</b><b class='flag-5'>表</b>映射的基礎(chǔ)知識(shí)

    Linux內(nèi)核的頁(yè)面分配機(jī)制

    Linux內(nèi)核是如何分配出頁(yè)面的,如果我們站在CPU的角度去看這個(gè)問(wèn)題,CPU能分配出來(lái)的頁(yè)面是以物理頁(yè)面為單位的。也就是我們計(jì)算機(jī)中常講的分頁(yè)機(jī)制。本文就看下Linux
    的頭像 發(fā)表于 08-07 15:51 ?185次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的頁(yè)面分配機(jī)制

    使用 PREEMPT_RT 在 Ubuntu 構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡(jiǎn)介盟通技術(shù)干貨Motrotech如果需要在Linux實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將Linux轉(zhuǎn)變?yōu)镽T
    的頭像 發(fā)表于 04-12 08:36 ?1795次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>

    Linux內(nèi)核內(nèi)存管理內(nèi)核非連續(xù)物理內(nèi)存分配

    的主要優(yōu)點(diǎn)是避免了外部碎片,而缺點(diǎn)是需要修改內(nèi)核頁(yè)。顯然,非連續(xù)內(nèi)存區(qū)域的大小必須是4096的倍數(shù)。Linux使用非連續(xù)物理內(nèi)存區(qū)的場(chǎng)景有幾種:(1)為swap區(qū)分配數(shù)據(jù)結(jié)構(gòu);(2)
    的頭像 發(fā)表于 02-23 09:44 ?802次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>內(nèi)存<b class='flag-5'>管理</b>之<b class='flag-5'>內(nèi)核</b>非連續(xù)物理內(nèi)存分配

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配器

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請(qǐng)求。該分配器必須具有足夠的空閑頁(yè)幀,以便滿足各種內(nèi)存大小請(qǐng)求。
    的頭像 發(fā)表于 02-21 09:29 ?815次閱讀

    linux內(nèi)核主要由哪幾個(gè)部分組成,作用是什么

    Linux內(nèi)核主要由以下幾個(gè)部分組成: 進(jìn)程管理Linux內(nèi)核負(fù)責(zé)管理和調(diào)度系統(tǒng)
    的頭像 發(fā)表于 01-22 14:34 ?2440次閱讀

    Linux內(nèi)核內(nèi)存管理架構(gòu)解析

    內(nèi)存管理子系統(tǒng)可能是linux內(nèi)核中最為復(fù)雜的一個(gè)子系統(tǒng),其支持的功能需求眾多,如頁(yè)面映射、頁(yè)面分配、頁(yè)面回收、頁(yè)面交換、冷熱頁(yè)面、緊急頁(yè)面、頁(yè)面碎片管理、頁(yè)面緩存、頁(yè)面統(tǒng)計(jì)等,而且對(duì)
    的頭像 發(fā)表于 01-04 09:24 ?590次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>內(nèi)存<b class='flag-5'>管理</b>架構(gòu)<b class='flag-5'>解析</b>

    Linux內(nèi)核RCU的用法

    Linux內(nèi)核,RCU最常見(jiàn)的用途是替換讀寫鎖。在20世紀(jì)90年代初期,Paul在實(shí)現(xiàn)通用RCU之前,實(shí)現(xiàn)了一種輕量級(jí)的讀寫鎖。后來(lái),為這個(gè)輕量級(jí)讀寫鎖原型所設(shè)想的每個(gè)用途,最終都使用RCU來(lái)實(shí)現(xiàn)了。
    的頭像 發(fā)表于 12-27 09:56 ?1550次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>RCU的用法

    獲取Linux內(nèi)核源碼的方法

    (ELF1/ELF1S開(kāi)發(fā)板及顯示屏)Linux內(nèi)核是操作系統(tǒng)中最核心的部分,它負(fù)責(zé)管理計(jì)算機(jī)硬件資源,并提供對(duì)應(yīng)用程序和其他系統(tǒng)組件的訪問(wèn)接口,控制著計(jì)算機(jī)的內(nèi)存、處理器、設(shè)備驅(qū)動(dòng)程序和文件系統(tǒng)等
    的頭像 發(fā)表于 12-13 09:49 ?587次閱讀
    獲取<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>源碼的方法

    內(nèi)核的電源管理

    之前介紹的電源管理機(jī)制基本都是在Linux實(shí)現(xiàn)的,可以看到很復(fù)雜,各種框架,明明一個(gè)操作非要轉(zhuǎn)來(lái)轉(zhuǎn)去,而且在內(nèi)核里面實(shí)現(xiàn),跟內(nèi)核的各種框架
    的頭像 發(fā)表于 11-29 09:33 ?776次閱讀
    微<b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的電源<b class='flag-5'>管理</b>

    MMU多級(jí)頁(yè)映射過(guò)程

    空間,也有相應(yīng)的頁(yè)負(fù)責(zé)虛擬地址到物理地址之間的轉(zhuǎn)換。MMU查詢的過(guò)程,用戶進(jìn)程的一級(jí)頁(yè)的基址存放在TTBR0。操作系統(tǒng)的
    的頭像 發(fā)表于 11-26 16:28 ?873次閱讀
    MMU多級(jí)<b class='flag-5'>頁(yè)</b><b class='flag-5'>表</b>映射過(guò)程

    Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

    1.前言 伙伴系統(tǒng)作為內(nèi)核最基礎(chǔ)的物理頁(yè)內(nèi)存分配器,具有高效、實(shí)現(xiàn)邏輯簡(jiǎn)介等優(yōu)點(diǎn),其原理頁(yè)也盡可能降低內(nèi)存外部碎片產(chǎn)生,但依然無(wú)法杜絕碎片問(wèn)題。外部碎片帶來(lái)的最大影響就是內(nèi)存足夠,但是卻無(wú)法滿足內(nèi)存
    的頭像 發(fā)表于 11-11 11:17 ?1206次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>內(nèi)存規(guī)整總結(jié)

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對(duì)系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的
    的頭像 發(fā)表于 11-10 14:58 ?463次閱讀
    <b class='flag-5'>Linux</b> 內(nèi)存<b class='flag-5'>管理</b>總結(jié)