當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] Linux 內(nèi)核中采用可加載的模塊化設(shè)計(LKMs,Loadable Kernel Modules),一般情況下編譯的Linux 內(nèi)核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內(nèi)核中,其他的

 Linux 內(nèi)核中采用可加載的模塊化設(shè)計(LKMs,Loadable Kernel Modules),一般情況下編譯的Linux 內(nèi)核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內(nèi)核中,其他的代碼可以選擇在內(nèi)核中,或者編譯為內(nèi)核的模塊文件。常見的驅(qū)動程序也是作為內(nèi)核模塊動態(tài)加載的。

模塊相關(guān)命令

lsmod 列出當(dāng)前系統(tǒng)加載的模塊

rmmod 將當(dāng)前模塊卸載

insmod、modprobe 用于加載當(dāng)前模塊。但insmod不會自動解決依存關(guān)系,而modprobe可以根據(jù)模塊間的依存關(guān)系以及 /etc/modules.conf 文件中的內(nèi)容自動插入模塊

mknod 創(chuàng)建相關(guān)模塊

Linux 系統(tǒng)的設(shè)備文件分為三類:塊設(shè)備文件、字符設(shè)備文件和網(wǎng)絡(luò)設(shè)備文件。

· 塊設(shè)備文件通常指一些需要以塊(如512 字節(jié))的方式寫入的設(shè)備,如IDE 硬盤、SCSI硬盤、光驅(qū)等。

· 字符型設(shè)備文件通常指可以直接讀寫,沒有緩沖區(qū)的設(shè)備,如并口、虛擬控制臺等。

· 網(wǎng)絡(luò)設(shè)備文件通常是指網(wǎng)絡(luò)設(shè)備訪問的BSD socket接口,如網(wǎng)卡等。

設(shè)備號設(shè)備號是一個數(shù)字,它是設(shè)備的標(biāo)志。就如前面所述,一個設(shè)備文件(也就是設(shè)備節(jié)點)可以通過mknod命令來創(chuàng)建,其中指定了主設(shè)備號和次設(shè)備號。主設(shè)備號表明某一類設(shè)備,

一般對應(yīng)著確定的驅(qū)動程序;次設(shè)備號一般是用于區(qū)分標(biāo)明不同屬性,例如不同的使用方法,不同的位置,不同的操作等,它標(biāo)志著某個具體的物理設(shè)備。高字節(jié)為主設(shè)備號和底字節(jié)為次設(shè)備號。例如,在系統(tǒng)中的塊設(shè)備IDE 硬盤的主設(shè)備號是3,而多個IDE 硬盤及其各個分區(qū)分別賦予次設(shè)備號1、2、3……

Linux 設(shè)備驅(qū)動程序包含中斷處理程序和設(shè)備服務(wù)子程序兩部分

設(shè)備服務(wù)子程序包含了所有與設(shè)備操作相關(guān)的處理代碼。它從面向用戶進程的設(shè)備文件系統(tǒng)中接受用戶命令,并對設(shè)備控制器執(zhí)行操作。這樣,設(shè)備驅(qū)動程序屏蔽了設(shè)備的特殊性,使用戶可以像對待文件一樣操作設(shè)備。

設(shè)備控制器需要獲得系統(tǒng)服務(wù)時有兩種方式:查詢和中斷。因為Linux 下的設(shè)備驅(qū)動程序是內(nèi)核的一部分,在設(shè)備查詢期間系統(tǒng)不能運行其他代碼,查詢方式的工作效率比較低,所以只有少數(shù)設(shè)備如軟盤驅(qū)動程序采取這種方式,大多設(shè)備以中斷方式向設(shè)備驅(qū)動程序發(fā)出輸入/輸出請求。

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" alt="" src="http://blogimg.chinaunix.net/blog/upfile2/080413193842.jpg" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>

Linux 中的設(shè)備驅(qū)動程序有如下特點。

(1)內(nèi)核代碼:設(shè)備驅(qū)動程序是內(nèi)核的一部分,如果驅(qū)動程序出錯,則可能導(dǎo)致系統(tǒng)崩潰。

(2)內(nèi)核接口:設(shè)備驅(qū)動程序必須為內(nèi)核或者其子系統(tǒng)提供一個標(biāo)準接口。比如,一個終端驅(qū)動程序必須為內(nèi)核提供一個文件I/O 接口;一個SCSI設(shè)備驅(qū)動程序應(yīng)該為SCSI子系統(tǒng)提供一個SCSI設(shè)備接口,同時SCSI子系統(tǒng)也必須為內(nèi)核提供文件的I/O 接口及緩沖區(qū)。

(3)內(nèi)核機制和服務(wù):設(shè)備驅(qū)動程序使用一些標(biāo)準的內(nèi)核服務(wù),如內(nèi)存分配等。

(4)可裝載:大多數(shù)的Linux 操作系統(tǒng)設(shè)備驅(qū)動程序都可以在需要時裝載進內(nèi)核,在不需要時從內(nèi)核中卸載。

(5)可設(shè)置:Linux 操作系統(tǒng)設(shè)備驅(qū)動程序可以集成為內(nèi)核的一部分,并可以根據(jù)需要把其中的某一部分集成到內(nèi)核中,這只需要在系統(tǒng)編譯時進行相應(yīng)的設(shè)置即可。

(6)動態(tài)性:在系統(tǒng)啟動且各個設(shè)備驅(qū)動程序初始化后,驅(qū)動程序?qū)⒕S護其控制的設(shè)備。

如果該設(shè)備驅(qū)動程序控制的設(shè)備不存在也不影響系統(tǒng)的運行,那么此時的設(shè)備驅(qū)動程序只是多占用了一點系統(tǒng)內(nèi)存罷了。

驅(qū)動開發(fā)時卻沒有main 函數(shù),模塊在調(diào)用insmod命令時被加載,此時的入口點是init_module函數(shù),通常在該函數(shù)中完成設(shè)備的注冊。同樣,模塊在調(diào)rmmod

函數(shù)時被卸載,此時的入口點是cleanup_module函數(shù),在該函數(shù)中完成設(shè)備的卸載。在設(shè)備完成注冊加載之后,用戶的應(yīng)用程序就可以對該設(shè)備進行一定的操作,如read、write等,而驅(qū)動程序就是用于實現(xiàn)這些操作,在用戶應(yīng)用程序調(diào)用相應(yīng)入口函數(shù)時執(zhí)行相關(guān)的操作,init_module入口點函數(shù)則不需要完成其他如read、write之類功能。

設(shè)備驅(qū)動程序的入口點,它是一個在中定義的struct file結(jié)構(gòu),這是一個內(nèi)核結(jié)構(gòu),不會出現(xiàn)在用戶空間的程序中,它定義了常見文件I/O 函數(shù)的入口。

struct file_operations {

loff_t (*llseek) (struct file *, loff_t, int);

ssize_t (*read) (struct file *filp, char *buff, size_t count, loff_t *offp);

ssize_t (*write) (struct file *filp, const char *buff, size_t count, loff_t *offp);

int (*readdir) (struct file *, void *, filldir_t);

unsigned int (*poll) (struct file *, struct poll_table_struct *);

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned

long);

int (*mmap) (struct file *, struct vm_area_struct *);

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

int (*flush) (struct file *);

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

int (*fsync) (struct file *, struct dentry *);

int (*fasync) (int, struct file *, int);

int (*check_media_change) (kdev_t dev);

int (*revalidate) (kdev_t dev);

int (*lock) (struct file *, int, struct file_lock *);

};

每個設(shè)備的驅(qū)動程序不一定要實現(xiàn)其中所有的函數(shù)操作,若不需要定義實現(xiàn)時,則只需將其設(shè)為NULL即可。[!--empirenews.page--]

struct inode提供了關(guān)于設(shè)備文件/dev/driver(假設(shè)此設(shè)備名為driver)的信息。struct file 提供關(guān)于被打開的文件信息,主要用于與文件系統(tǒng)對應(yīng)的設(shè)備驅(qū)動程序使用。struct file 較為重要,這里列出了它的定義:

struct file {

mode_t f_mode;/*標(biāo)識文件是否可讀或可寫,F(xiàn)MODE_READ或FMODE_WRITE*/

dev_t f_rdev; /* 用于/dev/tty */

off_t f_pos; /* 當(dāng)前文件位移 */

unsigned short f_flags; /* 文件標(biāo)志,如O_RDONLY、O_NONBLOCK和O_SYNC */

unsigned short f_count; /* 打開的文件數(shù)目 */

unsigned short f_reada;

struct inode *f_inode; /*指向inode的結(jié)構(gòu)指針 */

struct file_operations *f_op;/* 文件索引指針 */

};

設(shè)備驅(qū)動程序主要組成

(1)設(shè)備注冊

設(shè)備注冊使用函數(shù)register_chrdev,調(diào)用該函數(shù)后就可以向系統(tǒng)申請主設(shè)備號,如果register_chrdev操作成功,設(shè)備名就會出現(xiàn)在/proc/devices 文件里。

register_chrdev等函數(shù)語法要點所需頭文件 #i nclude 函數(shù)原型 int register_chrdev(unsigned int major, const char *name,struct file_operations *fops) major:設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號 如果為0 則系統(tǒng)為此驅(qū)動程序動態(tài)地分配一個主設(shè)備號函數(shù)傳入值 name:設(shè)備名 fops:對各個調(diào)用的入口點函數(shù)返回值 成功:如果是動態(tài)分配主設(shè)備號,此返回所分配的主設(shè)備號 且設(shè)備名就會出現(xiàn)在/proc/devices文函數(shù)返回值 件里

出錯:-1

(2)設(shè)備解除注冊

在關(guān)閉設(shè)備時,通常需要解除原先的設(shè)備注冊,此時可使用函數(shù)unregister_chrdev,此后該設(shè)備就會從/proc/devices 里消失。

unregister_chrdev等函數(shù)語法要點

所需頭文件 #i nclude

函數(shù)原型 int unregister_chrdev(unsigned int major, const char *name)

major:設(shè)備的主設(shè)備號,必須和注冊時的主設(shè)備號相同。

函數(shù)傳入值 name:設(shè)備名

函數(shù)返回值 成功:0,且設(shè)備名從/proc/devices文件里消失。

出錯:-1

(3)打開設(shè)備

打開設(shè)備的接口函數(shù)是open,根據(jù)設(shè)備的不同,open函數(shù)完成的功能也有所不同,但通常情況下在open函數(shù)中要完成如下工作。

· 遞增計數(shù)器。

· 檢查特定設(shè)備的特殊情況。

· 初始化設(shè)備。

· 識別次設(shè)備號

其中遞增計數(shù)器是用于設(shè)備計數(shù)的。由于設(shè)備在使用時通常會打開較多次數(shù),也可以由不同的進程所使用,所以若有一進程想要關(guān)閉該設(shè)備,則必須保證其他設(shè)備沒有使用該設(shè)備。因此使用計數(shù)器就可以很好地完成這項功能。

這里,實現(xiàn)計數(shù)器操作的是用在中定義的3 個宏如下。

· MOD_INC_USE_COUNT:計數(shù)器加一。

· MOD_DEC_USE_COUNT:計數(shù)器減一。

· MOD_IN_USE:計數(shù)器非零時返回真。

另外,當(dāng)有多個物理設(shè)備時,就需要識別次設(shè)備號來對各個不同的設(shè)備進行不同的操作,在有些驅(qū)動程序中并不需要用到。

雖然這是對設(shè)備文件執(zhí)行的第一個操作,但卻不是驅(qū)動程序一定要聲明的操作。若這個函數(shù)的入口為NULL,那么設(shè)備的打開操作將永遠成功,但系統(tǒng)不會通知驅(qū)動程序。

(4)釋放設(shè)備

釋放設(shè)備的接口函數(shù)是release。要注意釋放設(shè)備和關(guān)閉設(shè)備是完全不同的。當(dāng)一個進程釋放設(shè)備時,其他進程還能繼續(xù)使用該設(shè)備,只是該進程暫時停止對該設(shè)備的使用;而當(dāng)一個進程關(guān)閉設(shè)備時,其他進程必須重新打開此設(shè)備才能使用。

釋放設(shè)備時要完成的工作如下。

· 遞減計數(shù)器MOD_DEC_USE_COUNT。

· 在最后一次釋放設(shè)備操作時關(guān)閉設(shè)備。

(5)讀寫設(shè)備

讀寫設(shè)備的主要任務(wù)就是把內(nèi)核空間的數(shù)據(jù)復(fù)制到用戶空間,或者從用戶空間復(fù)制到內(nèi)核空間,也就是將內(nèi)核空間緩沖區(qū)里的數(shù)據(jù)復(fù)制到用戶空間的緩沖區(qū)中或者相反。這里首先解釋一個read和write函數(shù)的入口函數(shù),如下表所示。

read、write函數(shù)語法要點

所需頭文件 #i nclude

函數(shù)原型 ssize_t (*read) (struct file *filp, char *buff, size_t count, loff_t *offp)

ssize_t (*write) (struct file *filp, const char *buff, size_t count, loff_t *offp)

filp:文件指針

函數(shù)傳入值 buff:指向用戶緩沖區(qū)

count:傳入的數(shù)據(jù)長度

offp:用戶在文件中的位置

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

雖然這個過程看起來很簡單,但是內(nèi)核空間地址和應(yīng)用空間地址是有很大區(qū)別的,其中之一就是用戶空間的內(nèi)存是可以被換出的,因此可能會出現(xiàn)頁面失效等情況。所以就不能使用諸如memcpy 之類的函數(shù)來完成這樣的操作。在這里就要使用copy_to_user 或copy_from_user 函數(shù),它們就是用來實現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換的。copy_to_user 和copy_from_user 的格式如下表

所需頭文件 #i nclude

函數(shù)原型 Unsigned long copy_to_user(void *to, const void *from, unsigned long count)

Unsigned long copy_from_user(void *to, const void *from, unsigned long count)

To:數(shù)據(jù)目的緩沖區(qū)

函數(shù)傳入值 From:數(shù)據(jù)源函數(shù)傳入值 緩沖區(qū)

count:數(shù)據(jù)長度

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

失敗:-EFAULT

這兩個函數(shù)不僅實現(xiàn)了用戶空間和內(nèi)核空間的數(shù)據(jù)轉(zhuǎn)換,而且還會檢查用戶空間指針的有效性。如果指針無效,那么就不進行復(fù)制

(6)獲取內(nèi)存

在應(yīng)用程序中獲取內(nèi)存通常使用函數(shù)malloc,但在設(shè)備驅(qū)動程序中動態(tài)開辟內(nèi)存可以有基于內(nèi)存地址和基于頁面為單位兩類。其中,基于內(nèi)存地址的函數(shù)有kmalloc,注意的是,kmalloc函數(shù)返回的是物理地址,而malloc 等返回的是線性地址,因此在驅(qū)動程序中不能使用malloc函數(shù)。與malloc()不同,kmalloc()申請空間有大小限制。長度是2的整次方,并且不會對所獲取的內(nèi)存空間清零。

基于頁為單位的內(nèi)存有函數(shù)族有如下。

· get_zeroed_page:獲得一個已清零頁面。[!--empirenews.page--]

· get_free_page:獲得一個或幾個連續(xù)頁面。

· get_dma_pages:獲得用于DMA傳輸?shù)捻撁妗?/p>

與之相對應(yīng)的釋放內(nèi)存用也有kfree或free_pages 族。

kmalloc 函數(shù)語法要點

所需頭文件 #i nclude

函數(shù)原型 void *kmalloc(unsigned int len,int flags)

Len:希望申請的字節(jié)數(shù)

GFP_KERNEL:內(nèi)核內(nèi)存的通常分配方法,可能引起睡眠

GFP_BUFFER:用于管理緩沖區(qū)高速緩存

函數(shù)傳入值 flags GFP_ATOMIC:為中斷處理程序或其他運行于進程上下文之外的代碼分

配內(nèi)存,且不會引起睡眠

GFP_USER:用戶分配內(nèi)存,可能引起睡眠

GFP_HIGHUSER:優(yōu)先高端內(nèi)存分配

_GFP_DMA:DMA數(shù)據(jù)傳輸請求內(nèi)存

_GFP_HIGHMEN:請求高端內(nèi)存

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

失?。?EFAULT

kfree函數(shù)的語法格式

所需頭文件 #i nclude

函數(shù)原型 void kfree(void * obj)

函數(shù)傳入值 obj:要釋放的內(nèi)存指針

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

失敗:-EFAULT

get_free_ page類函數(shù)語法要點

unsigned long get_zeroed_page(int flags)

unsigned long __get_free_page(int flags)

函數(shù)原型 unsigned long __get_free_page(int flags,unsigned long order)

unsigned long __get_dma_page(int flags,unsigned long order)

函數(shù)傳入值 flags:同kmalloc

order:要請求的頁面數(shù),以2為底的對數(shù)

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

失?。?EFAULT

free_page類函數(shù)語法要點

所需頭文件 #i nclude

函數(shù)原型 unsigned long free_page(unsigned long addr)

unsigned long free_page(unsigned long addr)

函數(shù)傳入值 flags:同kmalloc

order:要請求的頁面數(shù),以2為底的對數(shù)

函數(shù)返回值 成功:寫入的數(shù)據(jù)長度

失?。?EFAULT

printk類函數(shù)語法要點

所需頭文件 #i nclude

函數(shù)原型 int printk(const char * fmt,…)

KERN_EMERG:緊急時間消息

KERN_ALERT:需要立即采取動作的情況

KERN_CRIT:臨界狀態(tài),通常涉及嚴重的硬件或軟件操作失敗

KERN_ERR:錯誤報告

函數(shù)傳入值 fmt: KERN_WARNING:對可能出現(xiàn)的問題提出警告

日志級別 KERN_NOTICE:有必要進行提示的正常情況

KERN_INFO:提示性信息

KERN_DEBUG:調(diào)試信息

…:如printf一樣的格式說明

函數(shù)返回值 成功:0

失?。?1

這些不同優(yōu)先級的信息可以輸出到控制臺上、/var/log/messages 里。其中,對輸出給控制臺的信息有一個特定的優(yōu)先級console_loglevel。若優(yōu)先級小于這個整數(shù)值時,則消息才能顯示到控制臺上,否則,消息會顯示在/var/log/messages 里。若不加任何優(yōu)先級選項,則消息默認輸出到/var/log/messages 文件中。

要開啟klogd和syslogd服務(wù),消息才能正常輸出。

proc 文件系統(tǒng)

/proc 文件系統(tǒng)是一個偽文件系統(tǒng),它是一種內(nèi)核和內(nèi)核模塊用來向進程發(fā)送信息的機制。這個偽文件系統(tǒng)讓用戶可以和內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)進行交互,獲取有關(guān)進程的有用信息,在運行時通過改變內(nèi)核參數(shù)改變設(shè)置。與其他文件系統(tǒng)不同,/proc存在于內(nèi)存之中而不是硬盤上。讀者可以通過“ls”查看/proc文件系統(tǒng)的內(nèi)容。

/proc文件系統(tǒng)主要目錄內(nèi)容

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" alt="" src="http://blogimg.chinaunix.net/blog/upfile2/080413215654.jpg" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>

除此之外,還有一些是以數(shù)字命名的目錄,它們是進程目錄。系統(tǒng)中當(dāng)前運行的每一個進程都有對應(yīng)的一個目錄在/proc下,以進程的PID 號為目錄名,它們是讀取進程信息的接口。進程目錄的結(jié)構(gòu)如下

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" alt="" src="http://blogimg.chinaunix.net/blog/upfile2/080413215720.jpg" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>

用戶可以使用cat命令來查看其中的內(nèi)容。

可以看到,/proc文件系統(tǒng)體現(xiàn)了內(nèi)核及進程運行的內(nèi)容,在加載模塊成功后,讀者可以使用查看/proc/device文件獲得相關(guān)設(shè)備的主設(shè)備號。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉