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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

文件系統(tǒng)-一切皆文件的設(shè)計(jì)理念

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

在這一節(jié)中,我們來一起學(xué)習(xí)和完成文件樹中最后一個(gè)關(guān)鍵性內(nèi)容——一切皆文件的設(shè)計(jì)理念。

所謂一切皆文件就是指計(jì)算機(jī)操作系統(tǒng)將一切計(jì)算機(jī)的可用資源都映射成文件形式向使用者提供統(tǒng)一的操作方式。我們?cè)诘谝还?jié)時(shí)已經(jīng)有了明確的講述,在這一節(jié)中我們來看一下具體的設(shè)計(jì)理念和實(shí)現(xiàn)方法。我們?cè)诓僮飨到y(tǒng)中為用戶構(gòu)建的虛擬系統(tǒng)中,樹的每一個(gè)節(jié)點(diǎn)都是一個(gè)文件,而這些文件雖然有著不同的類型和功能,如普通文件、鍵盤、鼠標(biāo)、打印機(jī)、顯示器、內(nèi)存頁、操作系統(tǒng)調(diào)度狀態(tài)等等,但卻有著相同的文件操作接口。對(duì)于用戶而言普通文件的操作通常只有“打開”、“關(guān)閉”、“讀取”、“寫入”這幾個(gè)操作,而對(duì)于較為特殊的文件,通常還需要加入“輸入輸出控制”、“嘗試獲取數(shù)據(jù)”這兩個(gè)操作,因此對(duì)于虛擬文件系統(tǒng)中的文件我們可以為其定義這樣6個(gè)通用的操作:

  • open()
  • close()
  • read()
  • write()
  • ioctl()
  • poll()
    `
    這6個(gè)函數(shù)是目前操作系統(tǒng)中對(duì)文件操作的函數(shù),當(dāng)然有的操作系統(tǒng)還實(shí)現(xiàn)了一些其它的操作函數(shù),我們不一一列舉,只是針對(duì)這6個(gè)最具有代表性的函數(shù)進(jìn)行說明。用戶對(duì)文件樹中的文件進(jìn)程上面6個(gè)操作,也就是說每一個(gè)文件節(jié)點(diǎn)中應(yīng)該有這6個(gè)函數(shù)的實(shí)現(xiàn)方法。具體來說,我們?cè)谔摂M文件樹中注冊(cè)一個(gè)設(shè)備節(jié)點(diǎn)時(shí),這個(gè)設(shè)備節(jié)點(diǎn)就是虛擬文件樹中的一個(gè)文件,我們可以為此設(shè)備節(jié)點(diǎn)的結(jié)構(gòu)體加入上述6個(gè)函數(shù)指針:
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;

在這里我們定義了一個(gè)結(jié)構(gòu)體struct file_operations_s,這個(gè)結(jié)構(gòu)體中定義了6個(gè)函數(shù)指針,用于表示這個(gè)文件的通用的6個(gè)操作。而具體的實(shí)現(xiàn)由注冊(cè)這個(gè)設(shè)備節(jié)點(diǎn)的具體驅(qū)動(dòng)程序來實(shí)現(xiàn)。接下來我們來實(shí)現(xiàn)當(dāng)用戶對(duì)某一個(gè)文件進(jìn)行這6個(gè)操作時(shí),虛擬文件系統(tǒng)的具體實(shí)現(xiàn)方法:

//打開文件
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);
  //申請(qǐng)節(jié)點(diǎn)
  fcntl_alloc(pcb, ind);
  pcb- >fnodes[ind] = node;
  return ind;
}


//關(guān)閉文件
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;
}


//讀取文件內(nèi)容
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);
}


//寫入文件內(nèi)容
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);
}

最后,我們來具體看一下如何編寫一個(gè)驅(qū)動(dòng)程序,并將這個(gè)驅(qū)動(dòng)程序注冊(cè)為虛擬文件系統(tǒng)中的一個(gè)設(shè)備節(jié)點(diǎn),即文件。用戶又如何通過通用的操作來實(shí)現(xiàn)對(duì)此設(shè)備的控制。

最簡(jiǎn)單的,我們可以通過對(duì)一個(gè)GPIO引腳的拉高拉低來實(shí)現(xiàn)一個(gè)LED燈的亮和滅,使用Cortex-M3處理下的實(shí)現(xiàn)方式有兩步,第一步:初始化GPIO引腳;第二步:對(duì)GPIO進(jìn)行拉高或拉低,從而達(dá)到LED亮和滅的操作。具體實(shí)現(xiàn)程序如下:

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);

接下來,當(dāng)我們需要點(diǎn)亮LED燈時(shí),對(duì)PC4引腳拉低;當(dāng)需要熄滅時(shí),對(duì)PC4引腳拉高,于是程序如下:

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


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

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

#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;
}

這樣我們就編寫了一個(gè)LED燈的驅(qū)動(dòng)程序,并在操作系統(tǒng)中注冊(cè)為"/dev/led"設(shè)備節(jié)點(diǎn),即文件。用戶可以通過以下方式來操作這個(gè)LED設(shè)備:

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


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


close(fd);

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

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

    關(guān)注

    22

    文章

    1595

    瀏覽量

    109362
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7632

    瀏覽量

    90192
  • Cortex-M3
    +關(guān)注

    關(guān)注

    9

    文章

    276

    瀏覽量

    60119
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1275

    瀏覽量

    53588
  • PCB
    PCB
    +關(guān)注

    關(guān)注

    1

    文章

    2020

    瀏覽量

    13204
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式Linux根文件系統(tǒng)概述

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

    Linux文件系統(tǒng)課程

    本章學(xué)習(xí)目標(biāo)理解什么是文件系統(tǒng)了解文件系統(tǒng)工作原理理解Fedora Core Linux文件系統(tǒng)的結(jié)構(gòu)掌握Fedora Core Linux文件系統(tǒng)的類型、權(quán)限和修改方法掌握如何安裝、
    發(fā)表于 04-10 17:07 ?0次下載

    NTFS文件系統(tǒng),NTFS文件系統(tǒng)是什么意思

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

    XfS文件系統(tǒng),XfS文件系統(tǒng)是什么意思

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

    FatFs文件系統(tǒng)使用

    STM系列FatFs文件系統(tǒng)使用文件,希望對(duì)大家有幫助。
    發(fā)表于 11-06 18:10 ?8次下載

    文件系統(tǒng)是什么?淺談EXT文件系統(tǒng)歷史

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

    比起 Windows,怎樣解讀 Linux 的文件系統(tǒng)與目錄結(jié)構(gòu)?

    在 Windows 系統(tǒng)中, 一切東西都是存放在硬盤上的。啟動(dòng)系統(tǒng)后,先確定硬盤,再確定硬盤上的分區(qū)以及每個(gè)分區(qū)所對(duì)應(yīng)文件系統(tǒng),最后是存放在某個(gè)分區(qū)特定的
    發(fā)表于 04-25 18:49 ?842次閱讀

    linux文件系統(tǒng)中的虛擬文件系統(tǒng)設(shè)計(jì)詳解

    Linux 中允許眾多不同的文件系統(tǒng)共存,如 ext2, ext3, vfat 等。通過使用同文件 I/O 系統(tǒng) 調(diào)用即可對(duì) Linux 中的任意
    發(fā)表于 04-02 14:37 ?2026次閱讀
    linux<b class='flag-5'>文件系統(tǒng)</b>中的虛擬<b class='flag-5'>文件系統(tǒng)</b>設(shè)計(jì)詳解

    如何區(qū)別Linux文件系統(tǒng)呢?

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

    Linux文件系統(tǒng)與持久性內(nèi)存

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

    Linux中文件系統(tǒng)分類方法

    Linux個(gè)重要的哲學(xué)是:一切文件。而文件文件系統(tǒng)是密切相關(guān)的,本篇筆記我們來
    的頭像 發(fā)表于 02-17 09:30 ?2340次閱讀

    嵌入式Linux開發(fā)之文件系統(tǒng)目錄結(jié)構(gòu)介紹

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

    FATFS文件系統(tǒng)詳解

    文件系統(tǒng)負(fù)責(zé)管理和存儲(chǔ)文件信息的軟件機(jī)構(gòu)稱為文件管理系統(tǒng),簡(jiǎn)稱文件系統(tǒng)。即在磁盤上組織
    發(fā)表于 11-29 09:51 ?30次下載
    FATFS<b class='flag-5'>文件系統(tǒng)</b>詳解

    FATFS文件系統(tǒng)原版文件下載

    FATFS文件系統(tǒng)原版文件下載
    發(fā)表于 06-25 09:02 ?0次下載

    Linux的文件系統(tǒng)特點(diǎn)

    Linux的文件系統(tǒng)特點(diǎn) 文件系統(tǒng)要有嚴(yán)格的組織形式,使得文件能夠以塊為單位進(jìn)行存儲(chǔ)。 文件系統(tǒng)中也要有索引區(qū),用來方便查找個(gè)
    的頭像 發(fā)表于 11-09 14:48 ?1532次閱讀
    Linux的<b class='flag-5'>文件系統(tǒng)</b>特點(diǎn)
    主站蜘蛛池模板: 欲香欲色天天综合和网 | 老牛天天晚上夜噜噜噜 | 37pao成人国产永久免费视频 | 日本高清免费一本在线观看 | 三级aa久久 | 国产在线观看免费 | 女教师公车痴汉在线播放 | 玖玖热视频一区二区人妻 | 久色乳综合思思在线视频 | 色久久一个亚洲综合网 | 青青娱乐网 | 国产精品96久久久久久AV网址 | 最新高清无码专区 | 5566精品资源在线播放 | 韩国女人高潮嗷嗷叫视频 | 伊人久久精品AV一区二区 | 国产精品久久久久久影院 | 粗壮挺进邻居人妻无码 | 色小妹影院 | 嗯啊快拔出来我是你老师视频 | 女子初尝黑人巨嗷嗷叫 | 久久青草在线视频精品 | 99视频精品国产在线视频 | 973午夜伦伦电影论片 | 乳交高H糙汉宠文 | 狠狠色狠色综合曰曰 | 日韩人妻双飞无码精品久久 | 自慰弄湿白丝袜 | 日韩免费一区 | 91精品国产品国语在线不卡 | 日本亚洲精品色婷婷在线影院 | 午夜福到在线2019 | 国产精品一区二区在线播放 | 一日本道伊人久久综合影 | 日韩精品欧美在线视频在线 | 51国产偷自视频在线视频播放 | 无人在线观看免费高清视频播放 | 国产亚洲精品第一区香蕉 | 国内精品视频久久久久免费 | 国产全肉乱妇杂乱视频 | 亚洲国产在线2o20 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品