首頁 系統教程 Linux 底層硬體設備驅動插入鍊錶的順序(驅動)

底層硬體設備驅動插入鍊錶的順序(驅動)

Apr 02, 2024 am 09:10 AM
驅動 硬體設備 linux作業系統 系統版本

哪些是驅動:

驅動就是將底層硬體設備的操作進行封裝,並向下層提供函數插口。

裝置分類:

linux系統將設備分為3類:字元設備、區塊設備、網路設備。

字元設備:指只能一個位元組一個位元組讀寫的設備,不能隨機讀取設備顯存中的某一數據,讀取資料須要根據先後次序。字元設備是面向流的裝置linux 驅動程式 開發,常見的字元裝置有鼠標、鍵盤、串列埠、控制台和LED裝置等。塊設備:指可以從設備的任意位置讀取一定厚度資料的設備。塊設備包括硬盤、磁碟、U盤和SD卡等。網路設備:網路設備可以是一個硬體設備,如網卡;但也可以是一個純粹的軟體設備,例如回環插口(lo).一個網路插口負責發送和接收資料封包。驅動認知:

先看一張圖,圖中描述了流程,有助於了解驅動。

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

#使用者狀態:

內核狀態:

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

linux 驱动 开发_驱动开发和嵌入式开发的差别_驱动开发是干什么的

##驅動數組:管理所有設備的驅動,添加或查找,添加是發生在我們編撰完驅動程序,加載到核心。查找是在呼叫驅動程序,由應用層用戶空間去尋找使用open函數。驅動插入數組的次序由設備號檢索,就是說主設備號和次設備號不僅能分辨不同種類的設備和不同類型的設備,能夠起到將驅動程序加載到數組的某個位置,在下邊介紹的驅動程式碼的開發無非就是新增驅動​​(新增裝置號、裝置名稱和裝置驅動函數)和呼叫驅動。

補充:

每位系統呼叫都對應一個系統呼叫號,而係統呼叫號就對應核心中的對應處理函數。所有系統呼叫都是透過中斷0x80來觸發的。使用系統呼叫時,透過eax暫存器將系統呼叫號碼傳遞到內核,系統呼叫的入參透過ebx、ecx…依序傳遞到內核和函數一樣,系統呼叫的回傳值保存在eax中,所有要從eax中取出字元裝置驅動程式工作原理

字元裝置驅動程式運作原理在linux的世界裡一切皆文件,所有的硬體裝置操作到應用層就會被具象成文件的操作。我們曉得倘若應用層要存取硬體設備,它必將要呼叫到硬體對應的驅動程式。 Linux核心有這麼多驅動程序,應用如何能夠精確的呼叫到底層的驅動程式?

補充:

(1)當open函數開啟裝置檔案時,可以依據裝置檔案對應的structinode結構體所描述的訊息,可以曉得接出來要操作的裝置類型(字元裝置還是區塊裝置),都會指派一個structfile結構體。

(2)依據structinode結構體上面記錄的設備號,可以找到對應的驅動程式。這兒以字元設備為例。在Linux作業系統中每位字元設備都有一個structcdev結構體。此結構體描述了字元設備所有訊息,其中最重要的一項是字元設備的操作函數插口。

linux 驱动 开发_驱动开发是干什么的_驱动开发和嵌入式开发的差别

#(3)找到structcdev結構體後,linux核心都會將structcdev結構體所在的顯存空間首位址記錄在structinode結構體i_cdev成員中,將structcdev結構體中的記錄的函數操作插口位址記錄在structfile結構體的f_ops成員中。

(4)任務完成,VFS層會為應用程式傳回一個檔案描述符(fd)。這個fd是和structfile結構體對應的。接出來下層應用程式就可以透過fd找到structfile,之後在structfile找到操作字元設備的函數插口file_operation了。

其中,cdev_init和cdev_add在驅動程式的入口函數中就早已被調用,分別完成字元裝置與file_operation函數操作插口的綁定,和將字元驅動註冊到核心的工作。

相關影片推薦

免費學習地址:LinuxC/C 開發(前端/音訊視訊/遊戲/嵌入式/高效能網路/儲存/基礎架構/安全)

須要C/C Linux伺服器架構師學習資料加qun579733396取得(資料包括C/C ,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,串流媒體,CDNlinux 輸入法,P2Redis,fastdfs,MongoDB,ZK,串流媒體,CDNlinux 輸入法,P2Redis,fastdfs,MongoDB,ZK,串流媒體,CDNlinux 輸入法,P2Redis,fastdfs,MongoDB,ZK,串流媒體,CDNlinux 輸入法,P2Redis,fastdfs,MongoDB,ZK,串流媒體,CDNlinux 輸入法,P2Redis ,K8S,Docker,TCP/IP,解釋器,DPDK,ffmpeg等),免費分享

linux 驱动 开发_驱动开发是干什么的_驱动开发和嵌入式开发的差别

#字元裝置、字元裝置驅動程式與使用者空間存取該裝置的程式兩者之間的關係

驱动开发和嵌入式开发的差别_linux 驱动 开发_驱动开发是干什么的

#如圖,在Linux核心中使用cdev結構體來描述字元設備,透過其成員dev_t來定義設備號(分為主、次設備號)以決定字元設備的惟一性。透過其成員file_operations來定義字元裝置驅動提供給VFS的插口函數,如常見的open()、read()、write()等。

在Linux字元裝置驅動程式中,模組載入函數透過register_chrdev_region()或alloc_chrdev_region()來靜態或則動態取得裝置號,透過cdev_init()建置cdev與file_operations之間的聯接,透過cdev_add()向系統新增一個cdev以完成註冊。模組卸載函數透過cdev_del()來註銷cdev,透過unregister_chrdev_region()來釋放裝置號。

用戶空間存取該裝置的程式透過Linux系統調用,如open()、read()、write(),來「調用」file_operations來定義字元裝置驅動提供給VFS的插口函數。

驅動程式開發步驟

Linux核心就是由各類驅動組成的,核心原始碼中有大概85%是各類驅動程式的程式碼。核心中驅動程式種類齊全,可以在同類驅動的基礎上進行更改以符合具體單板。

編撰驅動程式的困難並不是硬體的具體操作,而是弄清楚現有驅動程式的框架,在這個框架中加入這個硬體。

通常來說,編撰一個linux裝置驅動程式的大致流程如下:

下邊就以一個簡單的字元裝置驅動框架程式碼來進行驅動程式的開發、編譯等。

基於驅動框架的程式碼開發

下層呼叫程式碼

#include 
#include 
#include 
#include 
 
void main()
{
int fd,data;
fd = open("/dev/pin4",O_RDWR);
if(fd<0){
printf("open failn");
perror("reson:");
}
else{
printf("open successn");
}
fd=write(fd,&#039;1&#039;,1);
}
登入後複製

驅動框架程式碼

#include 		 //file_operations声明
#include //module_initmodule_exit声明
#include //__init__exit 宏定义声明
#include 	 //classdevise声明
#include//copy_from_user 的头文件
#include//设备号dev_t 类型声明
#include //ioremap iounmap的头文件
 
static struct class *pin4_class;
static struct device *pin4_class_dev;
 
static dev_t devno;//设备号
static int major = 231;		 //主设备号
static int minor = 0;			 //次设备号
static char *module_name = "pin4"; //模块名
 
//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{
printk("pin4_openn");//内核的打印函数和printf类似

return 0;
}
 
//led_write函数
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{
	printk("pin4_writen");
	
	return 0;
}
 
static struct file_operations pin4_fops = {
.owner = THIS_MODULE,
.open= pin4_open,
.write = pin4_write,
};
 
int __init pin4_drv_init(void) //真实驱动入口
{
int ret;
devno = MKDEV(major, minor);//创建设备号
ret = register_chrdev(major, module_name, &pin4_fops);//注册驱动告诉内核,把这个驱动加入到内核驱动的链表中
 
pin4_class=class_create(THIS_MODULE, "myfirstdemo");		//用代码在dev自动生成设备
pin4_class_dev =device_create(pin4_class, NULL, devno, NULL, module_name);//创建设备文件

return 0;
}
 
void __exit pin4_drv_exit(void)
{
device_destroy(pin4_class, devno);
class_destroy(pin4_class);
unregister_chrdev(major, module_name);//卸载驱动
 
}
 
module_init(pin4_drv_init);//入口,内核加载该驱动(insmod)的时候,这个宏被使用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");
登入後複製

裡面說過驅動開發的重點困難在於看懂框架程式碼,在上面進行設備的添加和更改,下邊就來了解一下這個框架邏輯。

驅動框架設計流程

1.確定主設備號碼

2.定義結構體類型file_operations

3.實作對應的drv_open/drv_read/drv_write等函數,填入file_operations結構體

4.實作驅動入口:安裝驅動程式時,才會去呼叫這個入口函數,執行工作:

①把file_operations結構體告訴核心:註冊驅動程式register_chrdev.

②建立類別class_create.

③建立裝置device_create.

5.實作出口:卸載驅動程式時,才會去呼叫這個出口函數,執行工作:

①把file_operations結構體從核心註銷:unregister_chrdev.

②銷毀類別class_create.

③銷毀裝置結點device_destroy.

6.其他建立:GPL合約、入口載入

1、確定主設備、變數定義

static struct class *pin4_class;
static struct device *pin4_class_dev;
 
static dev_t devno;//设备号
static int major = 231;		 //主设备号
static int minor = 0;			 //次设备号
static char *module_name = "pin4"; //模块名
登入後複製

2、定義file_operations結構體,載入到核心驅動數組中

這是Linux核心中的file_operations結構體

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

#依照下層呼叫函數定義結構體成員

static struct file_operations pin4_fops = {
.owner = THIS_MODULE,
.open= pin4_open,
.write = pin4_write,
.read= pin4_read,
};
登入後複製

3、實作結構體成員pin4_read等函數

static int pin4_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
printk("pin4_readn");

return 0;
}
 
//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{
printk("pin4_openn");//内核的打印函数和printf类似

return 0;
}
 
//led_write函数
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{
	printk("pin4_writen");
	
	return 0;
}
登入後複製

4、驅動入口

int __init pin4_drv_init(void) //真实驱动入口
{
int ret;
devno = MKDEV(major, minor);//创建设备号
ret = register_chrdev(major, module_name, &pin4_fops);//注册驱动告诉内核,把这个驱动加入到内核驱动的链表中
 
pin4_class=class_create(THIS_MODULE, "myfirstdemo");//由代码在dev自动生成设备
pin4_class_dev =device_create(pin4_class, NULL, devno, NULL, module_name);//创建设备文件

return 0;
}
登入後複製
###

其中pin4_class=class_create(THIS_MODULE,"myfirstdemo");//由代码在dev手动生成设备,除此之外还可以自动生成设备,在dev目录下sudomknod+设备名子+设备类型(c表示字符设备驱动)+主设备号+次设备号。

5、出口

void __exit pin4_drv_exit(void)
{
device_destroy(pin4_class, devno);
class_destroy(pin4_class);
unregister_chrdev(major, module_name);//卸载驱动
 
}
登入後複製

6、GPI合同,入口加载,出口加载

驱动开发和嵌入式开发的差别_linux 驱动 开发_驱动开发是干什么的

module_init(pin4_drv_init);//入口,内核加载该驱动(insmod)的时候,这个宏被使用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");
登入後複製

驱动模块代码编译和测试

编译阶段

驱动模块代码编译(模块的编译须要配置过的内核源码,编译、连接后生成的内核模块后缀为.ko,编译过程首先会到内核源码目录下,读取顶楼的Makefile文件,之后再返回模块源码所在目录。)

#include //file_operations声明
#include //module_initmodule_exit声明
#include //__init__exit 宏定义声明
#include //classdevise声明
#include//copy_from_user 的头文件
#include//设备号dev_t 类型声明
#include //ioremap iounmap的头文件
 
static struct class *pin4_class;
static struct device *pin4_class_dev;
 
static dev_t devno;//设备号
static int major = 231;//主设备号
static int minor = 0;//次设备号
static char *module_name = "pin4"; //模块名
 
static int pin4_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
printk("pin4_readn");
 
return 0;
}
//led_open函数
static int pin4_open(struct inode *inode,struct file *file)
{
printk("pin4_openn");//内核的打印函数和printf类似
 
return 0;
}
 
//led_write函数
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos)
{
printk("pin4_writen");
 
return 0;
}
 
static struct file_operations pin4_fops = {
.owner = THIS_MODULE,
.open= pin4_open,
.write = pin4_write,
.read= pin4_read,
};
 
int __init pin4_drv_init(void) //真实驱动入口
{
int ret;
devno = MKDEV(major, minor);//创建设备号
ret = register_chrdev(major, module_name, &pin4_fops);//注册驱动告诉内
核,把这个驱动加入到内核驱动的链表中
 
pin4_class=class_create(THIS_MODULE, "myfirstdemo");//用代码
在dev自动生成设备
 return 0;
}
 
void __exit pin4_drv_exit(void)
{
device_destroy(pin4_class, devno);
class_destroy(pin4_class);
unregister_chrdev(major, module_name);//卸载驱动
}
 
module_init(pin4_drv_init);//入口,内核加载该驱动(insmod)的时候,这个宏被使>用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");
登入後複製

将该驱动代码拷贝到linux-rpi-4.14.y/drivers/char目录下文件中(也可选择设备目录下其它文件)

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

更改该文件夹下Makefile(驱动代码放在那个目录,就更改该目录下的Makefile),将前面的代码编译生成模块,文件内容如右图所示:(-y表示编译进内核,-m表示生成驱动模块,CONFIG_表示是按照config生成的),所以只须要将obj-m+=pin4drive.o添加到Makefile中即可。

驱动开发和嵌入式开发的差别_驱动开发是干什么的_linux 驱动 开发

回到linux-rpi-4.14.y/编译驱动文件

使用指令:ARCH=armCROSS_COMPILE=arm-linux-gnueabihf-KERNEL=kernel7makemodules进行编译生成驱动模块。

linux 驱动 开发_驱动开发和嵌入式开发的差别_驱动开发是干什么的

编译生成驱动模块会生成以下几个文件:

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

.o的文件是object文件,.ko是kernelobject,与.o的区别在于其多了一些sections,例如.modinfo。.modinfosection是由kernelsource里的modpost工具生成的,包括MODULE_AUTHOR,MODULE_DESCRIPTION,MODULE_LICENSE,deviceIDtable以及模块依赖关系等等。depmod工具按照.modinfosection生成modules.dep,modules.*map等文件,便于modprobe更便捷的加载模块。

编译过程中,经历了这样的步骤:先步入Linux内核所在的目录,并编译出pin4drive.o文件,运行MODPOST会生成临时的pin4drive.mod.c文件linux 驱动 开发,而后依据此文件编译出pin4drive.mod.o,然后联接pin4drive.o和pin4drive.mod.o文件得到模块目标文件pin4drive.ko,最后离开Linux内核所在的目录。

将生成的.ko文件发送给猕猴桃派:[email protected]:/home/pi

驱动开发是干什么的_驱动开发和嵌入式开发的差别_linux 驱动 开发

将pin4test.c(下层调用代码)进行交叉编译后发送给猕猴桃派,就可以看见pi目录下存在发送过来的.ko文件和pin4test这两个文件,

linux 驱动 开发_驱动开发和嵌入式开发的差别_驱动开发是干什么的

linux 驱动 开发_驱动开发是干什么的_驱动开发和嵌入式开发的差别

加载内核驱动

sudo insmod pin4drive.ko
登入後複製

加载内核驱动(相当于通过insmod调用了module_init这个宏,之后将整个结构体加载到驱动数组中)加载完成后就可以在dev下边见到名子为pin4的设备驱动(这个和驱动代码上面staticchar*module_name="pin4";//模块名这行代码有关),设备号也和代码上面相关。

驱动开发是干什么的_linux 驱动 开发_驱动开发和嵌入式开发的差别

lsmod查看系统的驱动模块,执行下层代码,赋于权限

驱动开发是干什么的_驱动开发和嵌入式开发的差别_linux 驱动 开发

查看内核复印的信息,

dmesg |grep pin4
登入後複製

如右图所示:表示驱动调用成功

在装完驱动后可以使用指令:sudormmod+驱动名(不须要写ko)将驱动卸载。

调用流程:

我们下层空间的open去查找dev下的驱动(文件名),文件名背后包含了驱动的主设备号和次设备号,此时用户open触发一个系统调用linux是什么系统,系统调用经过vfs(虚拟文件系统),vfs按照文件名背后的设备号去调用sys_open去判定,找到内核中驱动数组的驱动位置,再去调用驱动上面自己的dev_open函数

为何生成驱动模块须要在虚拟机上生成?猕猴桃派不行吗?

生成驱动模块须要编译环境(linux源码而且编译,须要下载和系统版本相同的Linux内核源代码),也可以在猕猴桃派里面编译,但在猕猴桃派里编译,效率会很低,要特别久。

以上是底層硬體設備驅動插入鍊錶的順序(驅動)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
24
3d渲染,電腦配置?做設計3D渲染需要配置什麼樣的電腦? 3d渲染,電腦配置?做設計3D渲染需要配置什麼樣的電腦? May 06, 2024 pm 06:25 PM

3d渲染,電腦配置? 1電腦配置對於3D渲染非常重要,需要足夠的硬體效能才能確保渲染效果和速度。 23D渲染需要大量的運算和影像處理,因此需要高效能的CPU、顯示卡和記憶體。 3建議配置至少一台搭載至少6核心12執行緒的CPU、16GB以上的記憶體和一張高效能顯示卡的電腦,才能滿足較高的3D渲染需求。同時,也需要注意電腦的散熱和電源等方面的配置,以確保電腦的穩定運作。做設計3D渲染需要配置什麼樣的電腦?本人也是做設計的,給你一套配置吧(本人再用)CPU:amd960t開6核心(或1090t直接超頻)記憶體:1333

acer的桌上型電腦怎麼組裝? acer的桌上型電腦怎麼組裝? May 08, 2024 pm 08:25 PM

acer的桌上型電腦怎麼組裝? Acer桌上型電腦的組裝方法如下:打開機箱,將電源裝入機箱,並鎖緊螺絲。將CPU安裝到主機板上,注意CPU上的針腳要與主機板上的插槽對齊,並鎖緊CPU散熱器的螺絲。將記憶體條安裝到主機板上,注意記憶體條上的凹凸位要與主機板上的插槽對齊,用力下壓,聽到「啪」的一聲後即可完成安裝。將顯示卡、音效卡、網卡等闆卡安裝到主機板上,注意闆卡上的螺絲要擰緊。將硬碟、光碟機等儲存設備安裝到機殼內,注意螺絲要旋緊。將主機板與機殼的連線連接好,包括電源線、硬碟線、光碟機等。最後將機殼蓋蓋上,鎖緊螺絲即可完成組裝。在

Win11黑畫面怎麼辦教你解決Windows_11黑畫面問題 Win11黑畫面怎麼辦教你解決Windows_11黑畫面問題 May 08, 2024 pm 03:10 PM

Windows11是微軟最新推出的作業系統,它帶來了全新的介面設計和更多實用功能。然而,部分使用者在升級或使用過程中遇到了黑屏問題,導致無法正常運作。本文將詳細介紹幾種有效解決Win11黑屏問題的方法,幫助你快速恢復電腦正常運作。工具原料:系統版本:Windows11(21H2)品牌型號:聯想小新Pro162022、戴爾XPS13Plus、華碩ZenBookS13OLED軟體版本:NVIDIAGeForceExperience3.26.0.160、IntelDriver&SupportAssist

小米萊卡相機閃退解決方法介紹 小米萊卡相機閃退解決方法介紹 May 08, 2024 pm 03:20 PM

小米推出的新拍照軟體萊卡相機非常的火,但是這款軟體在拍照時會出現閃退的現象,不少用戶不知道怎麼回事,怎麼才能解決,下面一起來看看小米萊卡相機閃退解決方法吧。小米萊卡相機閃退怎麼辦解決方法一:1、先將手機關機,關機三十秒後再重啟手機。 2.然後下載一款同類型的相機軟體,試試看能否正常運作。 3.開啟手機設定功能-相機程式-清除快取資料。 4.依然沒能解決問題,試試備份手機數據,恢復出廠設定。 5.如果以上這幾點都不是,可能是相機組件硬體問題,需要將手機返廠維修檢測。解決方法二:1、備份重要數據,開啟安全性中

聯想筆記型電腦win11系統怎麼一鍵恢復出廠設置 聯想筆記型電腦win11系統怎麼一鍵恢復出廠設置 May 06, 2024 pm 05:22 PM

隨著電腦使用時間的成長,系統會逐漸累積許多垃圾檔案和無用程序,導致運作速度變慢,甚至故障。這時,恢復出廠設定就成為一個很好的選擇。本文將以聯想筆記型電腦為例,介紹怎麼一鍵恢復win11系統的出廠設置,讓你的電腦重獲新生。工具原料:系統版本:Windows11品牌型號:聯想小新Pro162022軟體版本:無需額外軟體一、準備工作1、備份重要數據:恢復原廠設定會刪除C盤中的所有數據,因此在操作前務必將重要文件備份到其他盤符或外部儲存設備。 2.確保電腦電量充足:恢復過程可能需要一段時間,建議連接

如何實現電腦與電視的無線投影(簡單步驟讓你輕鬆享受大螢幕觀影體驗) 如何實現電腦與電視的無線投影(簡單步驟讓你輕鬆享受大螢幕觀影體驗) May 07, 2024 pm 02:43 PM

電腦與電視已成為人們生活中不可或缺的娛樂工具、在數位時代。如果能夠將電腦上的內容無線投射到電視上,播放遊戲以及進行演示等活動、我們就能夠在更大的螢幕上欣賞電影,想像一下。讓你享受更震撼的視聽體驗、本文將帶你了解如何透過簡單的步驟實現電腦與電視的無線投影機。 1.準備一台支援無線投影機的電視確保你擁有一台支援無線投影機功能的電視。如果你的電視沒有,可以購買外接的無線投影機設備、現在市面上大多數智慧電視都內建了這項功能,如Chromecast或AppleTV等。 2.選擇合適的投影協定接下來,選擇合適的

中國電信天通衛星覆蓋香港!小米14 Ultra官員宣支持雙向衛星通訊 中國電信天通衛星覆蓋香港!小米14 Ultra官員宣支持雙向衛星通訊 May 09, 2024 am 09:01 AM

5月8日消息,中國電信今天在中國香港召開了手機直連衛星業務落地發表會,正式宣告以天通衛星系統為依託的手機直連衛星業務落地香港。根據小米手機官微消息,目前小米14Ultra已經支援在中國香港使用雙向衛星通訊。用戶使用中國電信、中國電信(香港)SIM卡,開通手機直連衛星業務即可。值得注意的是,小米14Ultra需為中國大陸銷售的版本,且系統版本升級為V1.0.9.0。因為小米14Ultra先前僅在內地銷售版支援衛星通信,其他版本在硬體上不支援此功能。僅支援電信卡也是因為天通衛星由中國電信營運。據悉

u盤重裝系統後記憶體變小了?這些原因不容忽視! u盤重裝系統後記憶體變小了?這些原因不容忽視! May 06, 2024 pm 03:10 PM

重裝系統是常見的電腦維護操作,但有時會遇到一些意外情況,例如u盤重裝系統後記憶體變小了。這究竟是怎麼回事呢?下面我們就來分析原因,並提供一些實用的建議。工具原料:系統版本:Windows1021H2品牌型號:聯想ThinkPadX1Carbon軟體版本:小魚一鍵重裝系統V5.0一、重裝系統後記憶體變小的原因1、安裝了過多的驅動程式和軟體。有些用戶在重裝系統後,會安裝大量不必要的驅動程式和軟體,佔用了記憶體空間。 2.系統盤分區方案不合理。如果在重裝系統時沒有合理分配系統碟的空間,可能會導致記憶體不

See all articles