chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

linux中block驅(qū)動(dòng)的編寫詳解

454398 ? 來源: AI加速 ? 作者: AI加速 ? 2020-11-21 10:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

像IIC、LED、KEY等都屬于字符設(shè)備,這些設(shè)備的驅(qū)動(dòng)是所有驅(qū)動(dòng)類型中最為簡(jiǎn)單的。塊設(shè)備是另外一種不同于字符設(shè)備的類型,這兩類設(shè)備在linux的驅(qū)動(dòng)結(jié)構(gòu)中有很大差異??傮w來說,塊設(shè)備驅(qū)動(dòng)比字符設(shè)備驅(qū)動(dòng)復(fù)雜的多,在IO操作上也表現(xiàn)出很大的不同。緩沖、IO的調(diào)度、請(qǐng)求隊(duì)列等都是和塊設(shè)備驅(qū)動(dòng)相關(guān)的概念。

本章從驅(qū)動(dòng)小白(指本人)的切身實(shí)際出發(fā),先不去了解那些深?yuàn)W的XXX,只從一個(gè)最簡(jiǎn)單的例子開始,對(duì)塊設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)有一個(gè)大體的了解。路漫漫其修遠(yuǎn)兮,驅(qū)動(dòng)是一個(gè)大坑,夠你用10年來填。慢慢學(xué)吧。

1. 塊設(shè)備結(jié)構(gòu)

塊設(shè)備就是指磁盤、CD-ROM等硬件存儲(chǔ)介質(zhì),塊設(shè)備驅(qū)動(dòng)連接了塊設(shè)備和用戶空間,實(shí)現(xiàn)用戶空間對(duì)磁盤的大塊數(shù)據(jù)訪問。整個(gè)子系統(tǒng)如下圖所示,包含虛擬文件系統(tǒng),塊IO調(diào)度層,塊設(shè)備驅(qū)動(dòng)以及具體的塊設(shè)備。塊設(shè)備不同于字符設(shè)備,它是以塊為單位接收輸入和返回輸出,而字符設(shè)備是以字節(jié)為單位。塊設(shè)備支持隨機(jī)訪問,而且其讀寫速度都快于字符設(shè)備,因此驅(qū)動(dòng)的表現(xiàn)也至關(guān)重要。這也是為什么塊設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)和字符設(shè)備的驅(qū)動(dòng)結(jié)構(gòu)被分開來寫。塊是最小的讀寫單位,不同的文件系統(tǒng)有不同大小的塊尺寸,但是它必須是2的指數(shù),同時(shí)不能超過頁大小。通常使用的大小有512字節(jié),1K字節(jié),4K字節(jié)等。

虛擬文件系統(tǒng)(VFS):隱藏了各種硬件的具體細(xì)節(jié),為用戶操作不同的硬件提供了一個(gè)統(tǒng)一的接口。其基于不同的文件系統(tǒng)格式,比如EXT,F(xiàn)AT等。用戶程序?qū)υO(shè)備的操作都通過VFS來完成,在VFS上面就是諸如open、close、write和read的函數(shù)API。

映射層(mapping layer):這一層主要用于確定文件系統(tǒng)的block size,然后計(jì)算所請(qǐng)求的數(shù)據(jù)包含多少個(gè)block。同時(shí)調(diào)用具體文件系統(tǒng)函數(shù)來訪問文件的inode,確定所請(qǐng)求的數(shù)據(jù)在磁盤上面的邏輯地址。

IO調(diào)度器:這部分是linux塊系統(tǒng)中非常關(guān)鍵的部分,其涉及到如何接收用戶請(qǐng)求并能最高效去訪問硬件磁盤中的數(shù)據(jù)。

Block driver:完成和塊設(shè)備的具體交互。


2. 驅(qū)動(dòng)程序詳解

通過編寫一個(gè)vmem_disk驅(qū)動(dòng)來了解block驅(qū)動(dòng)的結(jié)構(gòu),vmem_disk是一種模擬磁盤,其數(shù)據(jù)實(shí)際上存儲(chǔ)在RAM中。它通過vmalloc()分配出來的內(nèi)存空間來模擬出一個(gè)磁盤,以塊設(shè)備方式來訪問這片內(nèi)存?,F(xiàn)在來看其主要結(jié)構(gòu)。

2.1 block_device_operations

Block_device_operations類似于字符設(shè)備驅(qū)動(dòng)中的file_operations結(jié)構(gòu),它是對(duì)塊設(shè)備各種操作的集合,定義代碼如下:

struct block_device_operations {
    int (*open) (struct block_device *, fmode_t);
    int (*release) (struct gendisk *, fmode_t);
    int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
    int (*direct_access) (struct block_device *, sector_t,void **, unsigned long *);
    int (*media_changed) (struct gendisk *);
    int (*revalidate_disk) (struct gendisk *);
    int (*getgeo)(struct block_device *, struct hd_geometry *);
    struct module *owner;
};

1) 打開和釋放

int (*open)(struct inode *inode ,struct file *filp);

int (*release)(struct inode *inode ,struct file *filp);

這個(gè)和字符設(shè)備驅(qū)動(dòng)類似,當(dāng)設(shè)備被打開和關(guān)閉時(shí)將調(diào)用它們。

2) IO控制

int (*ioctl)(struct inode *inode,struct file *filp uusignwd intcmd,unsigned long arg)

這個(gè)和字符設(shè)備驅(qū)動(dòng)中的ioctrl類似,也是用于系統(tǒng)調(diào)用。塊設(shè)備包含大量的標(biāo)準(zhǔn)請(qǐng)求,這些標(biāo)準(zhǔn)請(qǐng)求由linux通用塊設(shè)備層處理,因此大部分ioctrl函數(shù)相當(dāng)短。

3) 介質(zhì)改變

int (*check_media_change) (kdev_t);

int (*revalidate) (kdev_t);

像磁盤、CD-ROM等塊設(shè)備是可插拔的,因此需要有個(gè)函數(shù)來檢測(cè)設(shè)備是否存在。當(dāng)介質(zhì)發(fā)生改變,使用revalidate_disk來響應(yīng),給驅(qū)動(dòng)一個(gè)機(jī)會(huì)進(jìn)行必要的工作來使介質(zhì)準(zhǔn)備好。

4) 獲得驅(qū)動(dòng)信息

int (*getgeo)(struct block_device   *,struct hd_geometry *);

該函數(shù)根據(jù)驅(qū)動(dòng)器的幾何信息填充一個(gè)hd_geometry結(jié)構(gòu)體,hd_geometry包含磁頭、扇區(qū)、柱面等信息。

所以我們要填充這個(gè)結(jié)構(gòu)體信息,并定義其對(duì)應(yīng)函數(shù)。填充如下:

static struct block_device_operations vmem_fops={
         .owner=THIS_MODULE,
         .getgeo=vmem_getgeo,
         .ioctl=vmem_ioctl,
         .open=vmem_open,
         .release=vmem_release,
};

我們只定義了open、release、ioctrl、getgeo函數(shù)。為了簡(jiǎn)化這個(gè)驅(qū)動(dòng),我們把open、release、ioctrl函數(shù)的具體內(nèi)容也都省略了,只是給出一個(gè)定義,沒有任何有效內(nèi)容。但是hd_geometry的信息需要填充,所以getgeo函數(shù)定義如下:

static int vmem_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{
         geo->cylinders=1;
         geo->heads=1;
         geo->sectors=BLK_SIZE/SECTOR_SIZE;
         return 0;
}

定義了使用的塊設(shè)備的柱面、磁頭和扇區(qū)個(gè)數(shù)。

2.2 gendisk結(jié)構(gòu)體

在linux內(nèi)核中,用gendisk結(jié)構(gòu)體來表示一個(gè)獨(dú)立的磁盤設(shè)備。就像字符設(shè)備驅(qū)動(dòng)中使用cdev結(jié)構(gòu)體一樣,它也包含主次設(shè)備號(hào),需要分配內(nèi)存,釋放結(jié)構(gòu)體和初始化操作。

1) 分配gendisk

分配函數(shù)為:

struct gendisk *alloc_disk(int minors);

2) 增加gendisk

這個(gè)是用于注冊(cè)磁盤設(shè)備,函數(shù)為:

void add_disk(struct gendisk *gd);

3) 釋放gendisk

當(dāng)不再需要使用磁盤時(shí)候,需要釋放這個(gè)結(jié)構(gòu)體,也即釋放其分配的內(nèi)存。

void del_gendisk(struct gendisk *gd);

以上這些函數(shù)在快設(shè)備初始化和關(guān)閉驅(qū)動(dòng)中調(diào)用。

2.3 請(qǐng)求處理

每個(gè)塊設(shè)備驅(qū)動(dòng)的核心是它的請(qǐng)求函數(shù),實(shí)際的工作,至少如設(shè)備的啟動(dòng),都是在這個(gè)函數(shù)里完成的。塊設(shè)備驅(qū)動(dòng)程序的request函數(shù)有以下原型:

void request(request_queue_t *queue);

當(dāng)內(nèi)核需要驅(qū)動(dòng)程序處理讀取、寫入以及其它對(duì)設(shè)備的操作時(shí),就會(huì)調(diào)用該函數(shù)。在其返回前,request函數(shù)不必完成所有隊(duì)列中的請(qǐng)求。事實(shí)上,對(duì)大多數(shù)真實(shí)設(shè)備而言,它可能沒有完成任何請(qǐng)求。

每個(gè)設(shè)備都有一個(gè)請(qǐng)求隊(duì)列,這是因?yàn)閷?duì)磁盤數(shù)據(jù)實(shí)際傳入和傳出發(fā)生的時(shí)間,與內(nèi)核請(qǐng)求的時(shí)間相差很大,因此內(nèi)核需要有一定靈活性,以安排在適當(dāng)時(shí)刻(比如把影響相鄰磁盤扇區(qū)的請(qǐng)求分成一組)進(jìn)行傳輸。

我們用一個(gè)簡(jiǎn)單的request函數(shù):

static void vmem_request(struct request_queue *q){
         struct request *req;
         uint64_t pos=0;
         ssize_t size=0;
         struct bio_vec bvec;
         int rv=0;
         struct req_iterator iter;
         void *kaddr=NULL;
         while((req=blk_fetch_request(q)) != NULL){
                   spin_unlock_irq(q->queue_lock);
                   pos=blk_rq_pos(req)*SECTOR_SIZE;
                   size=blk_rq_bytes(req);
                   if(pos+size>vdev->size){
                            printk(KERN_WARNING "beyond addr/n");
                            rv=-EIO;
                            goto skip;
                   }
                   rq_for_each_segment(bvec, req, iter){
                            kaddr=kmap(bvec.bv_page);
                            rv=vmem_transfer(vdev, pos, bvec.bv_len, kaddr+bvec.bv_offset, rq_data_dir(req));
                            if(rv<0)
                                     goto skip;
                   pos+=bvec.bv_len;
                   kunmap(bvec.bv_page);
                   }
         skip:
                   blk_end_request_all(req, rv);
                   spin_lock_irq(q->queue_lock);
         }
}

Blk_fetch_request從請(qǐng)求隊(duì)列中獲取一個(gè)請(qǐng)求,當(dāng)沒有請(qǐng)求需要時(shí),返回NULL。然后while中的程序開始處理這個(gè)請(qǐng)求。當(dāng)請(qǐng)求隊(duì)列創(chuàng)建的時(shí)候,request函數(shù)綁定了它,并且提供了一個(gè)自旋鎖。當(dāng)調(diào)用request函數(shù)時(shí),該鎖由內(nèi)核控制。因此request函數(shù)是一個(gè)原子上下文中運(yùn)行的。因此在獲得request時(shí),需要通過spin_unlock_irq函數(shù)來解鎖。

然后通過blk_rq_pos和blk_rq_bytes來獲得請(qǐng)求中的位置和大小。rq_for_each_segment是一個(gè)宏定義,其遍歷一個(gè)請(qǐng)求中的所有bio。這里插入一下對(duì)bio的介紹:

從本質(zhì)上講,一個(gè)request結(jié)構(gòu)是作為一個(gè)bio結(jié)構(gòu)的鏈表實(shí)現(xiàn)的。Bio結(jié)構(gòu)是在底層對(duì)部分塊設(shè)備IO請(qǐng)求的描述。Bio結(jié)構(gòu)體定義如下:

struct bio { 
    sector_t bi_sector;//該bio結(jié)構(gòu)所要傳輸?shù)牡谝粋€(gè)(512字節(jié))扇區(qū):磁盤的位置 
    struct bio *bi_next;    //請(qǐng)求鏈表 
    struct block_device *bi_bdev;//相關(guān)的塊設(shè)備 
    unsigned long bi_flags//狀態(tài)和命令標(biāo)志 
    unsigned long bi_rw; //讀寫 
    unsigned short bi_vcnt;//bio_vesc偏移的個(gè)數(shù) 
    unsigned short bi_idx;    //bi_io_vec的當(dāng)前索引 
    unsigned short bi_phys_segments;//結(jié)合后的片段數(shù)目 
    unsigned short bi_hw_segments;//重映射后的片段數(shù)目 
    unsigned int bi_size;    //I/O計(jì)數(shù) 
    unsigned int bi_hw_front_size;//第一個(gè)可合并的段大小; 
    unsigned int bi_hw_back_size;//最后一個(gè)可合并的段大小 
    unsigned int bi_max_vecs;    //bio_vecs數(shù)目上限 
    struct bio_vec *bi_io_vec;    //bio_vec鏈表:內(nèi)存的位置 
    bio_end_io_t *bi_end_io;//I/O完成方法 
    atomic_t bi_cnt; //使用計(jì)數(shù) 
    void *bi_private; //擁有者的私有方法 
    bio_destructor_t *bi_destructor;    //銷毀方法 
}; 

與bio對(duì)應(yīng)的數(shù)據(jù)每次存放的內(nèi)存不一定是連續(xù)的,bio_vec結(jié)構(gòu)體用于描述與這個(gè)bio對(duì)應(yīng)的所有內(nèi)存,它并不總是在一個(gè)頁面里,因此需要一個(gè)向量。IO調(diào)度算法將連續(xù)的bio合并成一個(gè)request,然后可以改善讀寫磁盤的性能。


遍歷bio的時(shí)候,就可以定義一個(gè)transfer函數(shù)來完成bio的數(shù)據(jù)轉(zhuǎn)移了。Rq_data_dir獲得從request中得到數(shù)據(jù)傳輸方向,返回值0表示從設(shè)備讀數(shù)據(jù),非0表示寫數(shù)據(jù)。Transfer中就可以通過簡(jiǎn)單的memcpy來完成數(shù)據(jù)拷貝:

static int vmem_transfer(struct vmem_device *vdev, uint64_t pos, ssize_t size, void *buffer, int write)
{
         if(write)
                   memcpy(vdev->buf+pos, buffer, size);
         else
                   memcpy(buffer, vdev->buf+pos, size);
         return 0;
}

如果一個(gè)請(qǐng)求不是文件系統(tǒng)請(qǐng)求,就將請(qǐng)求傳遞給end_request。當(dāng)處理非文件系統(tǒng)請(qǐng)求時(shí),傳遞0表示不能成功完成該請(qǐng)求。

2.4 設(shè)備初始化

在塊設(shè)備初始化階段,與字符設(shè)備類似?;具^程如下:

1) 注冊(cè)塊設(shè)備

vmem_major=register_blkdev(0, "VMEM");

第一個(gè)參數(shù)0表示由內(nèi)核自動(dòng)分配主設(shè)備號(hào),如果成功注冊(cè)就返回這個(gè)主設(shè)備號(hào),如果注冊(cè)失敗就返回負(fù)值。

2) 定義設(shè)備結(jié)構(gòu)體

這個(gè)設(shè)備結(jié)構(gòu)體是自己定義的,一般包含gendisk、設(shè)備號(hào)、請(qǐng)求隊(duì)列等。

struct vmem_device {
         struct gendisk *disk;
         struct request_queue *que;
         void *buf;
         spinlock_t lock;
         ssize_t size;
};

3) vmem_dev結(jié)構(gòu)體分配和buf分配

         vdev=kzalloc(sizeof(struct vmem_device), GFP_KERNEL);
         if(!vdev){
                   printk(KERN_WARNING "vmem_device: unable to allocate mem/n");
                   goto out;
         }
         vdev->size=BLK_SIZE;
         vdev->buf=vmalloc(vdev->size);
         if(vdev->buf==NULL){
                   printk(KERN_WARNING "failed to vmalloc vdev->buf/n");
                   goto out_dev;
         }

Buf就是一個(gè)虛擬的磁盤。

4) 初始化請(qǐng)求隊(duì)列

vdev->que=blk_init_queue(vmem_request, &vdev->lock);

5) 分配磁盤

disk=alloc_disk(1);

6) 填充vmem_dev結(jié)構(gòu)體中的信息。

         vdev->disk=disk;
         disk->major=vmem_major;
         disk->first_minor=1;
         disk->fops=&vmem_fops;
         disk->queue=vdev->que;
         disk->private_data=vdev;
         sprintf(disk->disk_name, "VMEM");

7)注冊(cè)磁盤

         set_capacity(disk, BLK_SIZE/SECTOR_SIZE);

         add_disk(disk);

3.實(shí)驗(yàn)

我們注冊(cè)驅(qū)動(dòng),并看到在dev下面有VMEM設(shè)備,這個(gè)就是我們的虛擬磁盤設(shè)備文件。


然后將其格式化為ext2文件系統(tǒng):


接下來我們就可以將其掛載并創(chuàng)建文件了。


總結(jié)

最后總結(jié)一下linux中block驅(qū)動(dòng)的編寫過程:

1) 填充request函數(shù),這個(gè)函數(shù)在請(qǐng)求隊(duì)列初始化中將喝隊(duì)列綁定;

2) 定義vdev結(jié)構(gòu)體,其中包含gendisk、request_queue等結(jié)構(gòu);

3) 定義設(shè)備初始化函數(shù),并完成對(duì)disk的分配,注冊(cè),請(qǐng)求隊(duì)列初始化工作;

4) 填充block_device_operations結(jié)構(gòu)體;

5) 定義設(shè)備退出函數(shù),主要是釋放結(jié)構(gòu)體;

編輯:hfy


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

    關(guān)注

    88

    文章

    11628

    瀏覽量

    217981
  • 驅(qū)動(dòng)程序
    +關(guān)注

    關(guān)注

    19

    文章

    868

    瀏覽量

    49958
  • Block
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    15114
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux驅(qū)動(dòng)開發(fā)的必備知識(shí)

    、內(nèi)核模塊編程: 掌握內(nèi)核模塊的編寫、編譯、加載和卸載方法。 了解內(nèi)核模塊的初始化和清理函數(shù)的編寫。 5、設(shè)備驅(qū)動(dòng)框架: 熟悉字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備等驅(qū)動(dòng)框架。 能夠根據(jù)
    發(fā)表于 12-04 07:58

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解

    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板Linux驅(qū)動(dòng)開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出詳解
    的頭像 發(fā)表于 11-21 13:25 ?659次閱讀
    【迅為工業(yè)RK3568穩(wěn)定可靠】itop-3568開發(fā)板<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)實(shí)戰(zhàn):RK3568內(nèi)核模塊符號(hào)導(dǎo)出<b class='flag-5'>詳解</b>

    【免費(fèi)送書】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)開發(fā),一直給人門檻較高的印象,主要因內(nèi)核機(jī)制抽象、需深度理解硬件原理、開發(fā)調(diào)試難度大所致。2021年,一本講解驅(qū)動(dòng)開發(fā)的專著問世即獲市場(chǎng)青睞,暢銷近萬冊(cè)——這便是《Li
    的頭像 發(fā)表于 11-18 08:06 ?439次閱讀
    【免費(fèi)送書】成為硬核<b class='flag-5'>Linux</b>開發(fā)者:《<b class='flag-5'>Linux</b> 設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)(第 2 版)》

    【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    數(shù)據(jù)采集與緩沖區(qū)功能。GPIO是嵌入式基礎(chǔ)硬件接口,本篇章講解 如何編寫GPIO控制器驅(qū)動(dòng)程序,以及如何在GPIO控制器啟用IRQ芯片 。文中強(qiáng)調(diào)棄用舊的整數(shù)接口,改用基于描述符的GPIO接口;同時(shí)說明
    發(fā)表于 11-17 17:52

    Linux系統(tǒng)中網(wǎng)絡(luò)配置詳解

    網(wǎng)絡(luò)配置是Linux系統(tǒng)運(yùn)維的核心技能之一。正確理解和配置子網(wǎng)掩碼、網(wǎng)關(guān)等網(wǎng)絡(luò)參數(shù),直接影響系統(tǒng)的網(wǎng)絡(luò)連通性和性能。本文將深入探討Linux系統(tǒng)中網(wǎng)絡(luò)配置的方方面面,為運(yùn)維工程師提供全面的技術(shù)指導(dǎo)。
    的頭像 發(fā)表于 07-17 11:01 ?877次閱讀

    詳解Linux系統(tǒng)的服務(wù)管理

    Linux,無論何時(shí)當(dāng)你安裝任何帶有服務(wù)和守護(hù)進(jìn)程的包,系統(tǒng)默認(rèn)會(huì)把這些服務(wù)的初始化及 systemd腳本添加進(jìn)去,不過此時(shí)它們并沒有被啟用。
    的頭像 發(fā)表于 05-23 15:10 ?626次閱讀
    <b class='flag-5'>詳解</b><b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>中</b>的服務(wù)管理

    itop-3568開發(fā)板驅(qū)動(dòng)開發(fā)指南-實(shí)驗(yàn)程序的編寫

    驅(qū)動(dòng)例程\\\\02。 本章實(shí)驗(yàn)將編寫 Linux 下的驅(qū)動(dòng)傳參實(shí)例代碼,通過“insmod”命令進(jìn)行參數(shù)的傳遞,并將相應(yīng)的參數(shù)打印到串口終端上。
    發(fā)表于 05-19 10:26

    Linux環(huán)境再升級(jí):PLIN驅(qū)動(dòng)程序正式發(fā)布

    PLIN驅(qū)動(dòng)程序現(xiàn)已正式發(fā)布,本文將展示如何安裝PLIN驅(qū)動(dòng)程序,以及如何在Linux環(huán)境下進(jìn)行基本的PLIN通信操作,確保您能夠快速掌握并應(yīng)用這一新工具。
    的頭像 發(fā)表于 04-21 15:29 ?795次閱讀
    <b class='flag-5'>Linux</b>環(huán)境再升級(jí):PLIN<b class='flag-5'>驅(qū)動(dòng)</b>程序正式發(fā)布

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動(dòng)的分類

    內(nèi)核模塊嵌入到Linux內(nèi)核,位于內(nèi)核空間。它們直接與內(nèi)核進(jìn)行交互,通過內(nèi)核提供的接口與硬件設(shè)備進(jìn)行通信和控制。用戶空間的應(yīng)用程序通過系統(tǒng)調(diào)用和設(shè)備文件接口與設(shè)備驅(qū)動(dòng)進(jìn)行交互。設(shè)備驅(qū)動(dòng)
    發(fā)表于 03-12 10:20

    飛凌嵌入式ElfBoard ELF 1板卡-Linux驅(qū)動(dòng)模塊之helloworld驅(qū)動(dòng)

    驅(qū)動(dòng)程序的基本結(jié)構(gòu)和加載過程。源碼編寫(一)首先包含頭文件#include // 包含模塊相關(guān)函數(shù)的頭文件#include // 包含內(nèi)核相關(guān)函數(shù)的頭文件#include// 包含初始化和清理函數(shù)
    發(fā)表于 03-12 10:15

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動(dòng)的分類

    內(nèi)核模塊嵌入到Linux內(nèi)核,位于內(nèi)核空間。它們直接與內(nèi)核進(jìn)行交互,通過內(nèi)核提供的接口與硬件設(shè)備進(jìn)行通信和控制。用戶空間的應(yīng)用程序通過系統(tǒng)調(diào)用和設(shè)備文件接口與設(shè)備驅(qū)動(dòng)進(jìn)行交互。設(shè)備驅(qū)動(dòng)
    發(fā)表于 03-10 17:00

    電力電子的坐標(biāo)變換詳解

    電力電子的坐標(biāo)變換詳解 clark變換&park變換
    發(fā)表于 02-17 15:28 ?1次下載

    迅為RK3568開發(fā)板驅(qū)動(dòng)指南Linux通用SPI設(shè)備驅(qū)動(dòng)

    迅為RK3568開發(fā)板驅(qū)動(dòng)指南Linux通用SPI設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 01-23 11:02 ?3433次閱讀
    迅為RK3568開發(fā)板<b class='flag-5'>驅(qū)動(dòng)</b>指南<b class='flag-5'>Linux</b><b class='flag-5'>中</b>通用SPI設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>

    迅為RK3568開發(fā)板SPI驅(qū)動(dòng)指南-mcp2515驅(qū)動(dòng)編寫:讀寄存器函數(shù)

    迅為RK3568開發(fā)板SPI驅(qū)動(dòng)指南-mcp2515驅(qū)動(dòng)編寫:讀寄存器函數(shù)
    的頭像 發(fā)表于 01-20 14:43 ?1505次閱讀
    迅為RK3568開發(fā)板SPI<b class='flag-5'>驅(qū)動(dòng)</b>指南-mcp2515<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>編寫</b>:讀寄存器函數(shù)

    Linux grep命令詳解

    Linux grep命令是一種非常常用的文本搜索工具,它可以在給定的文件搜索匹配的字符串,并輸出匹配的行。grep是全稱“global search regular expression print”,可以識(shí)別正則表達(dá)式,并使用正則表達(dá)式進(jìn)行搜索。
    的頭像 發(fā)表于 12-25 09:39 ?1794次閱讀