色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

文件系統-一切皆文件的設計理念

冬至子 ? 來源:編程外星人 ? 作者:怪蛙 ? 2023-10-11 10:10 ? 次閱讀

在這一節中,我們來一起學習和完成文件樹中最后一個關鍵性內容——一切皆文件的設計理念。

所謂一切皆文件就是指計算機操作系統將一切計算機的可用資源都映射成文件形式向使用者提供統一的操作方式。我們在第一節時已經有了明確的講述,在這一節中我們來看一下具體的設計理念和實現方法。我們在操作系統中為用戶構建的虛擬系統中,樹的每一個節點都是一個文件,而這些文件雖然有著不同的類型和功能,如普通文件、鍵盤、鼠標、打印機、顯示器、內存頁、操作系統調度狀態等等,但卻有著相同的文件操作接口。對于用戶而言普通文件的操作通常只有“打開”、“關閉”、“讀取”、“寫入”這幾個操作,而對于較為特殊的文件,通常還需要加入“輸入輸出控制”、“嘗試獲取數據”這兩個操作,因此對于虛擬文件系統中的文件我們可以為其定義這樣6個通用的操作:

  • open()
  • close()
  • read()
  • write()
  • ioctl()
  • poll()
    `
    這6個函數是目前操作系統中對文件操作的函數,當然有的操作系統還實現了一些其它的操作函數,我們不一一列舉,只是針對這6個最具有代表性的函數進行說明。用戶對文件樹中的文件進程上面6個操作,也就是說每一個文件節點中應該有這6個函數的實現方法。具體來說,我們在虛擬文件樹中注冊一個設備節點時,這個設備節點就是虛擬文件樹中的一個文件,我們可以為此設備節點的結構體加入上述6個函數指針:
typedef struct file_operations_s
{
  int (*open)(void);
  int (*close)(void);
  size_t (*read)(void *, size_t);
  size_t (*write)(const void *, size_t);
  int (*ioctl)(unsigned int, unsigned long);
  int (*poll)(unsigned int);
} file_operations_s;


typedef struct vfs_node_s
{
  struct vfs_node_s *sibling;
  struct vfs_node_s *child;
  char name[NODE_NAME_SIZE];
  struct file_operations_s ops;
} vfs_node_s;

在這里我們定義了一個結構體struct file_operations_s,這個結構體中定義了6個函數指針,用于表示這個文件的通用的6個操作。而具體的實現由注冊這個設備節點的具體驅動程序來實現。接下來我們來實現當用戶對某一個文件進行這6個操作時,虛擬文件系統的具體實現方法:

//打開文件
int open(char *path, int oflag, int mode)
{
  vfs_node_s *node = fs_get_node(path);
  pcb_s *pcb = sche_curr_pcb();
  node- >ops.open();
  uint32_t ind = fcntl_first_empty(pcb);
  //申請節點
  fcntl_alloc(pcb, ind);
  pcb- >fnodes[ind] = node;
  return ind;
}


//關閉文件
int close(int fd)
{
  pcb_s *pcb = sche_curr_pcb();
  vfs_node_s *node = pcb- >fnodes[fd];
  int ret = node- >ops.close();
  pcb- >fnodes[fd] = NULL;
  fcntl_free(pcb, fd);
  return ret;
}


//讀取文件內容
size_t read(int fd, void *buf, size_t count)
{
  pcb_s *pcb = sche_curr_pcb();
  vfs_node_s *node = pcb- >fnodes[fd];
  return node- >ops.read(NULL, buf, count);
}


//寫入文件內容
size_t write(int fd, void *buf, size_t count)
{
  pcb_s *pcb = sche_curr_pcb();
  vfs_node_s *node = pcb- >fnodes[fd];
  return node- >ops.write(NULL, buf, count);
}


//輸入輸出控制
int ioctl(int fd, unsigned int cmd, unsigned long arg)
{
  pcb_s *pcb = sche_curr_pcb();
  vfs_node_s *node = pcb- >fnodes[fd];
  return node- >ops.ioctl(NULL, cmd, arg);
}


//嘗試獲取資源
int poll(int fd, unsigned int ms)
{
  pcb_s *pcb = sche_curr_pcb();
  vfs_node_s *node = pcb- >fnodes[fd];
  return node- >ops.poll(ms);
}

最后,我們來具體看一下如何編寫一個驅動程序,并將這個驅動程序注冊為虛擬文件系統中的一個設備節點,即文件。用戶又如何通過通用的操作來實現對此設備的控制。

最簡單的,我們可以通過對一個GPIO引腳的拉高拉低來實現一個LED燈的亮和滅,使用Cortex-M3處理下的實現方式有兩步,第一步:初始化GPIO引腳;第二步:對GPIO進行拉高或拉低,從而達到LED亮和滅的操作。具體實現程序如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

接下來,當我們需要點亮LED燈時,對PC4引腳拉低;當需要熄滅時,對PC4引腳拉高,于是程序如下:

//點亮,拉低
GPIO_WriteBit(GPIOC, GPIO_Pin_4, 0);


//熄滅,拉高
GPIO_WriteBit(GPIOC, GPIO_Pin_4, 1);

對于驅動程序而言,我們不希望用戶在使用LED時編寫較為復雜的、直接操作硬件的代碼,而是希望操作系統為用戶提供一個通用的操作接口函數,于是我們就可以編寫一個驅動程序,并向操作系統注冊一個"/dev/led"設備節點,而"/dev/led"這個文件就是一個設備文件,它的內部由驅動開發人員完成與硬件交互的功能,對使用人員則只提供open()、close()、read()、write()、ioctl()、poll()等操作函數。對于LED燈來說,驅動程序比較簡單我們只實現其open()、close()、ioctl()這3個函數。有興趣的讀者可以自行實現read()、write()、poll()等函數:

#define LED_IOCTL_ON (0)
#define LED_IOCTL_OFF (0)


void led_drv_init(void)
{
  file_operations_s ops = {0};
  ops.open = led_open;
  ops.close = led_close;
  ops.read = NULL;
  ops.write = NULL;
  ops.ioctl = led_ioctl;
  ops.poll = NULL;
  fs_register_dev("/dev/led", ops);
}


int led_open(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  return 0;
}


int led_close(void)
{
  return 0;
}


int led_ioctl(void, unsigned int cmd, unsigned long arg)
{
  switch (cmd)
  {
  case LED_IOCTL_ON:
    GPIO_WriteBit(GPIOC, GPIO_Pin_4, 0);
    break;


  case LED_IOCTL_OFF:
    GPIO_WriteBit(GPIOC, GPIO_Pin_4, 1);
    break;

  default:
    break;
  }
  return 0;
}

這樣我們就編寫了一個LED燈的驅動程序,并在操作系統中注冊為"/dev/led"設備節點,即文件。用戶可以通過以下方式來操作這個LED設備:

int fd = open("/dev/led");


//點亮
ioctl(fd, LED_IOCTL_ON);
//熄滅
ioctl(fd, LED_IOCTL_OFF);


close(fd);

對于用戶而言,操作這個硬件LED燈就與操作普通文件一樣,通過open()函數打開這個文件,通過ioctl這個函數對這個文件進行相關的控制,使用完畢之后再通過close()函數關閉此文件,于是,硬件與用戶之間就減少了很多特定的功能操作,用戶也不必關心硬件設備的具體實現細節,只需要對這個設備文件進行通用操作即可。而對于編寫驅動程序的人員來說,只需要將硬件相關的程序和操作封裝到驅動程序內部即可,無需暴露給用戶。這樣就實現了“一切皆文件”的設計理念。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led燈
    +關注

    關注

    22

    文章

    1592

    瀏覽量

    108026
  • 計算機
    +關注

    關注

    19

    文章

    7500

    瀏覽量

    88018
  • Cortex-M3
    +關注

    關注

    9

    文章

    270

    瀏覽量

    59489
  • GPIO
    +關注

    關注

    16

    文章

    1204

    瀏覽量

    52123
  • PCB
    PCB
    +關注

    關注

    1

    文章

    1808

    瀏覽量

    13204
收藏 人收藏

    評論

    相關推薦

    嵌入式Linux根文件系統概述

    Linux中一切文件! 是指:在Linux系統中,各個部分都可把它看成是文件,包括了所有的
    發表于 12-16 06:37

    Linux文件系統課程

    本章學習目標理解什么是文件系統了解文件系統工作原理理解Fedora Core Linux文件系統的結構掌握Fedora Core Linux文件系統的類型、權限和修改方法掌握如何安裝、
    發表于 04-10 17:07 ?0次下載

    NTFS文件系統,NTFS文件系統是什么意思

    NTFS文件系統,NTFS文件系統是什么意思 NTFS是Windows NT以及之后的Windows 2000、Windows XP、Windows Server 2003、Windows Server 2008
    發表于 03-29 10:38 ?5971次閱讀

    XfS文件系統,XfS文件系統是什么意思

    XfS文件系統,XfS文件系統是什么意思 XfS文件系統是SGI開發的高級日志文件系統,XFS極具伸縮性,非常健壯。所幸的是SGI將其移植到了Lin
    發表于 03-29 10:39 ?4261次閱讀

    FatFs文件系統使用

    STM系列FatFs文件系統使用文件,希望對大家有幫助。
    發表于 11-06 18:10 ?8次下載

    文件系統是什么?淺談EXT文件系統歷史

    在先前關于Linux文件系統的文章中,我很想去深入地討論更多EXT文件系統的特性的信息。所以,首先讓我們來回答這個問題:什么是文件系統文件系統
    發表于 06-28 09:03 ?5710次閱讀
    <b class='flag-5'>文件系統</b>是什么?淺談EXT<b class='flag-5'>文件系統</b>歷史

    比起 Windows,怎樣解讀 Linux 的文件系統與目錄結構?

    在 Windows 系統中, 一切東西都是存放在硬盤上的。啟動系統后,先確定硬盤,再確定硬盤上的分區以及每個分區所對應文件系統,最后是存放在某個分區特定的
    發表于 04-25 18:49 ?748次閱讀

    linux文件系統中的虛擬文件系統設計詳解

    Linux 中允許眾多不同的文件系統共存,如 ext2, ext3, vfat 等。通過使用同文件 I/O 系統 調用即可對 Linux 中的任意
    發表于 04-02 14:37 ?1823次閱讀
    linux<b class='flag-5'>文件系統</b>中的虛擬<b class='flag-5'>文件系統</b>設計詳解

    如何區別Linux文件系統呢?

    虛擬文件系統種神奇的抽象,它使得 “一切文件” 哲學在 Linux 中成為了可能。
    的頭像 發表于 08-09 18:00 ?3707次閱讀

    Linux文件系統與持久性內存

    1、Linux 虛擬文件系統介紹 在 Linux 系統一切文件,除了通常所說的狹義的文件以外
    的頭像 發表于 11-26 14:34 ?2533次閱讀
    Linux<b class='flag-5'>文件系統</b>與持久性內存

    Linux中文件系統分類方法

    Linux個重要的哲學是:一切文件。而文件文件系統是密切相關的,本篇筆記我們來
    的頭像 發表于 02-17 09:30 ?2148次閱讀

    嵌入式Linux開發之文件系統目錄結構介紹

    、與windows區別Linux不像windows有盤符的概念,只有個根目錄概念,所有文件系統(硬盤、U盤、CDROM、網絡文件系統)都以個子目錄掛根目錄下某
    發表于 11-01 16:31 ?3次下載
    嵌入式Linux開發之<b class='flag-5'>文件系統</b>目錄結構介紹

    FATFS文件系統詳解

    文件系統負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。即在磁盤上組織
    發表于 11-29 09:51 ?29次下載
    FATFS<b class='flag-5'>文件系統</b>詳解

    FATFS文件系統原版文件下載

    FATFS文件系統原版文件下載
    發表于 06-25 09:02 ?0次下載

    Linux的文件系統特點

    Linux的文件系統特點 文件系統要有嚴格的組織形式,使得文件能夠以塊為單位進行存儲。 文件系統中也要有索引區,用來方便查找
    的頭像 發表于 11-09 14:48 ?1202次閱讀
    Linux的<b class='flag-5'>文件系統</b>特點
    主站蜘蛛池模板: music radio在线收听| 最新高清无码专区| 国产 浪潮AV性色四虎| 欧美性猛交AAA片| xxww69| 日本黄色官网| WRITEAS检查身体| 人妻美妇疯狂迎合| 草莓视频在线播放视频| 日本无吗高清| 国产精品色无码AV在线观看| 无码人妻少妇色欲AV一区二区 | 在线观看国产人视频免费中国| 嗨嗨快播电影| 13一18TV处流血TV| 欧美gv明星| 高清国语自产拍免费| 性欧美FREE少妇XXX| 久久国产加勒比精品无码| 伊人久综合| 秋霞电影伦网理最新在线看片 | 成人影院午夜久久影院| 婷婷激情综合色五月久久竹菊影视| 国产女人视频免费观看| 伊人AV一区二区三区夜色撩人| 蜜臀AV精品久久无码99| 扒开女生尿口| 亚洲精品视频在线观看视频| 理论片午午伦夜理片影院| 潮 喷女王cytherea| 小荡娃奶真大| 男神插曲女生软件完整版| 国产成人精品免费视频软件| 亚洲人成无码久久久AAA片| 男插女高潮一区二区| 国产精品18久久久久久白浆.| 伊人大香线蕉影院在线播放| 人人澡人人擦人人免费| 精品粉嫩BBWBBZBBW| 被黑人群jian又粗又大H| 夜夜骑夜夜欢|