日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android內(nèi)卡掛載之FUSE文件系統(tǒng)

審校 | 孫淑娟

在阿瓦提等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司 網(wǎng)站設(shè)計制作按需網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),阿瓦提網(wǎng)站建設(shè)費用合理。

一、簡介

FUSE(Filesystem in Userspace),是一種用戶空間文件系統(tǒng)。用戶可以通過FUSE文件系統(tǒng)操作內(nèi)卡。FUSE主要實現(xiàn)代碼位于用戶空間中,而不需要重新編譯到內(nèi)核,用戶空間開發(fā)者可以通過FUSE的接口直接訪問內(nèi)核空間,不需要了解文件系統(tǒng)的內(nèi)幕和內(nèi)核模塊編程的知識,這給用戶空間開發(fā)者帶來了眾多便利。

二、FUSE文件系統(tǒng)架構(gòu)

1.FUSE內(nèi)核模塊(內(nèi)核態(tài))實現(xiàn)VFS 接口(FUSE文件驅(qū)動注冊、supper block、dentry、inode的維護),接收請求傳遞給LibFUSE,LibFUSE 再傳遞給用戶程序的接口進行操作。

2.LibFUSE模塊(用戶態(tài))實現(xiàn)文件系統(tǒng)主要框架,比如對實現(xiàn)的文件系統(tǒng)操作進行封裝、mount管理、通過設(shè)備/dev/fuse與內(nèi)核模塊通信。

3.用戶程序模塊(用戶態(tài))當(dāng)內(nèi)卡掛載成功后,對內(nèi)卡進行讀寫操作。

這種架構(gòu)的設(shè)計可以讓用戶通過FUSE在用戶空間來定制自己的文件系統(tǒng),將文件系統(tǒng)從內(nèi)核剝離出來,大大縮減了開發(fā)的難度。本文將著重介紹libfuse如何掛載內(nèi)卡。

三、內(nèi)卡的掛載

3.1 內(nèi)卡掛載與分區(qū)掛載的不同

分區(qū)掛載是掛載到內(nèi)核實地文件系統(tǒng),例如userdata分區(qū)掛載f2fs到 /data目錄下。內(nèi)卡掛載是掛載用戶空間文件系統(tǒng),如dev/fuse 掛載fuse到mnt/user/0/emulated目錄下。

上圖mnt/user/0/emulated和/data/media/0下的內(nèi)容是一樣的。原因是這兩個目錄是綁定的關(guān)系,說明內(nèi)卡是userdata的一部分。這部分空間是用戶可以直接操作的。

在手機的文件管理器中也可以看到同樣的目錄:

3.2 內(nèi)卡掛載和綁定

VoldNativeService::mount接收到framwork層發(fā)送的mount請求后調(diào)用vol->mount,從而執(zhí)行VolumeBase::mount這個父類。真正的實現(xiàn)是在子類內(nèi)卡會調(diào)用EmulatedVolume::doMount執(zhí)行掛載。

1.VoldNativeService::mount

mountFlags決定掛載的是內(nèi)卡還是SD卡,為3時掛載內(nèi)卡,為2時掛載SD卡。內(nèi)卡的mountUserId為0,SD卡的mountUserId是卡本身的guid。最終會執(zhí)行vol->mount()。

binder::Status VoldNativeService::mount(
  const std::string& volId, int32_t mountFlags, int32_t mountUserId,
  const android::sp& callback) {
  ENFORCE_SYSTEM_OR_ROOT;
  CHECK_ARGUMENT_ID(volId);
  ACQUIRE_LOCK;
 
  auto vol = VolumeManager::Instance()->findVolume(volId);
  if (vol == nullptr) {
  return error("Failed to find volume " + volId);
  }
 
  vol->setMountFlags(mountFlags);
  vol->setMountUserId(mountUserId);
 
  vol->setMountCallback(callback);
  int res = vol->mount();
  vol->setMountCallback(nullptr);
 
  if (res != OK) {
  return translate(res);
  }
 
  return translate(OK);
 }

2.vol->mount

vol是VolumeBase的實例,VolumeBase的mount方法由具體的子類EmulatedVolume、PublicVolume、PrivateVolume等實現(xiàn)。執(zhí)行操作之后會發(fā)送應(yīng)答消息給MountService。將掛載的結(jié)果上報給framwork層。

status_t VolumeBase::mount() {
  if ((mState != State::kUnmounted) && (mState != State::kUnmountable)) {
  LOG(WARNING) << getId() << " mount requires state unmounted or unmountable";
  return -EBUSY;
  }
  setState(State::kChecking);
  status_t res = doMount();
  setState(res == OK ? State::kMounted : State::kUnmountable);
 
  if (res == OK) {
  doPostMount();
  }
  return res;
 }

3.EmulatedVolume::doMount ()

內(nèi)卡會走到EmulatedVolume這個子類進行掛載,SD卡則會走PublicVolume掛載。在EmulatedVolume函數(shù)里建立了四個/mnt/runtime路徑并設(shè)置了不同的權(quán)限,原因是控制不同權(quán)限APP訪問。然后利用掛載命名空間實現(xiàn)了掛載點的隔離,用戶在不同掛載命名空間的進程,看到的目錄層次不同。MountUserFuse是掛載FUSE的實現(xiàn),內(nèi)卡和SD卡都會走這個流程。著重看一下MountUserFuse函數(shù)的實參,如果掛載的是內(nèi)卡,user_id則為0,getInternalPath()為/data/media,label為emulated。

status_t EmulatedVolume::doMount() {
  std::string label = getLabel();
  bool isVisible = getMountFlags() & MountFlags::kVisible;
  mSdcardFsDefault = StringPrintf("/mnt/runtime/default/%s", label.c_str());
  mSdcardFsRead = StringPrintf("/mnt/runtime/read/%s", label.c_str());
  mSdcardFsWrite = StringPrintf("/mnt/runtime/write/%s", label.c_str());
  mSdcardFsFull = StringPrintf("/mnt/runtime/full/%s", label.c_str());
 
  setInternalPath(mRawPath);
  setPath(StringPrintf("/storage/%s", label.c_str()));

………………………………
res = MountUserFuse(user_id, getInternalPath(), label, &fd);

…………………………..
}

4.MountUserFuse();

如下函數(shù)中只粘貼了重要的部分。fuse_path是掛載路徑mnt/user/0/emulated。隨后調(diào)用mount函數(shù)調(diào)用內(nèi)核接口進行掛載,將/dev/fuse 掛載到/mnt/user/0/emulated。

status_t MountUserFuse(userid_t user_id, const std::string& absolute_lower_path,
  const std::string& relative_upper_path, android::base::unique_fd* fuse_fd) {

std::string fuse_path(
  StringPrintf("%s/%s", pre_fuse_path.c_str(), relative_upper_path.c_str()));

result = TEMP_FAILURE_RETRY(mount("/dev/fuse", fuse_path.c_str(), "fuse",
  MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME | MS_LAZYTIME,
  opts.c_str()));
}

掛載成功后可以用mount命令去查看,截圖如下:

四、總結(jié)

本文介紹了內(nèi)卡對FUSE的掛載,將創(chuàng)建好的FUSE設(shè)備掛載到內(nèi)置存儲空間關(guān)聯(lián)目錄。對于內(nèi)置存儲空間的訪問變成了先訪問FUSE文件系統(tǒng),再訪問f2fs文件系統(tǒng)。對于FUSE而言,在內(nèi)核空間和用戶空間來回切換會增加性能開銷,所以對FUSE的性能優(yōu)化至關(guān)重要。

作者介紹

陳豪,社區(qū)編輯,具有6年工作經(jīng)驗的高級系統(tǒng)工程師。擅長技能有Linux內(nèi)嵌匯編語言,Python,C,C++,Java,Linux內(nèi)核分析,智能機器人軟件設(shè)計等。

參考鏈接

??https://blog.csdn.net/kongxinsun/article/details/79587305??

??https://blog.csdn.net/bob_fly1984/article/details/80720807??


網(wǎng)站欄目:Android內(nèi)卡掛載之FUSE文件系統(tǒng)
網(wǎng)頁鏈接:http://www.5511xx.com/article/ccegcph.html