4月10日,广汽集团与海尔集团在青岛正式签署战略合作框架协议。双方将充分发挥各自在智能制造、科技创新、产业生态等方面的领先优势,共同探索“人车家”互联生态等领域的新范式,为中国制造业高质量发展注入新动能。
发表于 04-11 17:02
•2150次阅读
Linux内核内存分配
Linux系统使用了一种称为“虚拟内存”的机制。虚拟内存机制使得每个内存地址都是虚拟的,这意味着它们不会直接指向RAM中的任何地址。这样我们访问内存中的存储单元时,都会进行地址转换以匹配相应的物理内存
在Linux系统中,内核中的每个进程都表示为一个task_struct结构体实例,该结构体实例表征并描述了这个进程。在进程开始运行之前,系统会为其分配一个内存映射表,该表存放在struct mm_struct类型的变量中。在内核中,全局变量current时钟指向当前进程,current->mm字段指向当前的进程内存映射表,struct mm_struct结构定义参见include/linux/mm_types.h
地址转换和MMU
MMU不仅可以将虚拟地址转换为物理地址,还可以保护内存免受未经授权的访问。给定一个进程,需要从此进程访问的任何页都必须位于一个VMA中,且必须位于进程的页表中
由于最近访问的数据存放在缓存中,因此最近转换的地址也存放在缓存中。数据缓存加快了数据访问过程,TLB则加快了虚拟地址的转换过程。TLB是内容可寻址内存,其中键是虚拟地址,值是物理地址,其运作过程如下图所示
内存分配机制
下图展示了Linux系统中不同的内存分配器。最低级别的分配器是页分配器,它以页为单位分配内存,然后是Slab分配器,它建立在页分配器的基础上,从中获取页并将它们拆分为较小的内存实体,kmalloc分配器依赖于Slab分配器
实现DMA支持
DMA是计算机系统的一种特性,它允许设备在没有CPU干预的情况下访问主系统内存,使CPU嫩巩固专注于其他任务。它的使用示例包括网络流量加速、音频数据或视频帧抓取等,它的使用并不限于特定领域。负责管理DMA事务的外围设备是DMA控制器,它存在于大多数现代处理器和微控制器中。
DMA的工作方式如下:当驱动程序需要传输数据块时,便使用源地址、目标地址和要复制的总字节数设置DMA控制器,然后DMA控制器自动将数据地址从源地址传输到目标地址,而不会占用CPU周期。当剩余字节数为0时,数据块传输结束并通知驱动程序。
DMA引擎API
DMA控制器接口由两部分组成:控制器和通道。控制器执行内存传输,通道则是客户端驱动程序向控制器提交作业的方式
DMA控制器在Linux内核中别抽象为dma_device结构体实例,其定义如下
struct dma_device {
struct kref ref;
unsigned int chancnt;
unsigned int privatecnt;
struct list_head channels;
struct list_head global_node;
struct dma_filter filter;
dma_cap_mask_tcap_mask;
enum dma_desc_metadata_mode desc_metadata_modes;
unsigned short max_xor;
unsigned short max_pq;
enum dmaengine_alignment copy_align;
enum dmaengine_alignment xor_align;
enum dmaengine_alignment pq_align;
enum dmaengine_alignment fill_align;
#define DMA_HAS_PQ_CONTINUE (1 << 15)
int dev_id;
struct device *dev;
struct module *owner;
struct ida chan_ida;
u32 src_addr_widths;
u32 dst_addr_widths;
u32 directions;
u32 min_burst;
u32 max_burst;
u32 max_sg_burst;
bool descriptor_reuse;
enum dma_residue_granularity residue_granularity;
int (*device_alloc_chan_resources)(struct dma_chan *chan);
int (*device_router_config)(struct dma_chan *chan);
void (*device_free_chan_resources)(struct dma_chan *chan);
struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)(
struct dma_chan *chan, dma_addr_t dst, dma_addr_t src,
size_t len, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_xor)(
struct dma_chan *chan, dma_addr_t dst, dma_addr_t *src,
unsigned int src_cnt, size_t len, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_xor_val)(
struct dma_chan *chan, dma_addr_t *src,unsigned int src_cnt,
size_t len, enum sum_check_flags *result, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_pq)(
struct dma_chan *chan, dma_addr_t *dst, dma_addr_t *src,
unsigned int src_cnt, const unsigned char *scf,
size_t len, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_pq_val)(
struct dma_chan *chan, dma_addr_t *pq, dma_addr_t *src,
unsigned int src_cnt, const unsigned char *scf, size_t len,
enum sum_check_flags *pqres, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_memset)(
struct dma_chan *chan, dma_addr_t dest, int value, size_t len,
unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_memset_sg)(
struct dma_chan *chan, struct scatterlist *sg,
unsigned int nents, int value, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)(
struct dma_chan *chan, unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_slave_sg)(
struct dma_chan *chan, struct scatterlist *sgl,
unsigned int sg_len, enum dma_transfer_direction direction,
unsigned long flags, void *context);
struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
size_t period_len, enum dma_transfer_direction direction,
unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
struct dma_chan *chan, struct dma_interleaved_template *xt,
unsigned long flags);
struct dma_async_tx_descriptor *(*device_prep_dma_imm_data)(
struct dma_chan *chan, dma_addr_t dst, u64 data,
unsigned long flags);
void (*device_caps)(struct dma_chan *chan,
struct dma_slave_caps *caps);
int (*device_config)(struct dma_chan *chan,
struct dma_slave_config *config);
int (*device_pause)(struct dma_chan *chan);
int (*device_resume)(struct dma_chan *chan);
int (*device_terminate_all)(struct dma_chan *chan);
void (*device_synchronize)(struct dma_chan *chan);
enum dma_status (*device_tx_status)(struct dma_chan *chan,
dma_cookie_t cookie,
struct dma_tx_state *txstate);
void (*device_issue_pending)(struct dma_chan *chan);
void (*device_release)(struct dma_device *dev);
/* debugfs support */
void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
struct dentry *dbg_dev_root;
};
DMA通道的结构体定义如下
struct dma_chan {
int dev_id;/* this channel is allocated if >= 0, */
/* free otherwise */
void __iomem *io;
const char *dev_str;
int irq;
void *irq_dev;
unsigned int fifo_addr;
unsigned int mode;
};
请求DMA通道
dma_request_channel()函数用于请求一个通道
struct dma_chan *dma_request_channel(dma_cap_mask_t mask,
dma_filter_fn filter_fn,
void *filter_param);
配置DMA通道
DMA引擎框架使用struct dma_slave_config数据结构进行配置,该数据结构表示DMA通道的运行时配置,这样客户端就可以指定诸如DMA方向、DMA地址、总线宽度和DMA突发成都等外设的参数,struct dma_slave_config数据结构定义如下
struct dma_slave_config {
enum dma_transfer_direction direction;
phys_addr_t src_addr;
phys_addr_t dst_addr;
enum dma_slave_buswidth src_addr_width;
enum dma_slave_buswidth dst_addr_width;
u32 src_maxburst;
u32 dst_maxburst;
u32 src_port_window_size;
u32 dst_port_window_size;
bool device_fc;
void *peripheral_config;
size_t peripheral_size;
};
通过dmaengine_slave_config()函数将这种配置作用于底层硬件上
static inline int dmaengine_slave_config(struct dma_chan *chan,
struct dma_slave_config *config)
{
if (chan->device->device_config)
return chan->device->device_config(chan, config);
return -ENOSYS;
}
配置DMA传输
这一步用于确认DMA传输的方式,要进行一次DMA传输,就需要用到与DMA通道对应的控制器中的一些函数,这些函数名为device_prep_dma_*,例如对于内存到内存的传输,使用device_prep_dma_memcpy()
struct dma_async_tx_descriptor *tx;
struct dma_chan *chan = acdev->dma_chan;
dma_cookie_t cookie;
unsigned long flags = DMA_PREP_INTERRUPT;
int ret = 0;
tx = chan->device->device_prep_dma_memcpy(chan, dest, src, len, flags);
if (!tx) {
dev_err(acdev->host->dev, \"device_prep_dma_memcpy failed\\\\n\");
return -EAGAIN;
}
提交DMA传输
为了把事务放到驱动程序的事务待处理队列中,可以使用dmaengine_submit()函数
static inline dma_cookie_t dmaengine_submit(struct dma_async_tx_descriptor *desc)
{
return desc->tx_submit(desc);
}
发出待处理的DMA请求并等待回调通知
启动传输是DMA传输设置的最后一步,可以通过在通道上调用dma_async_issue_pending()来激活通道待处理队列中的传输。
static inline void dma_async_issue_pending(struct dma_chan *chan)
{
chan->device->device_issue_pending(chan);
}
发表于 02-04 22:30
在汽车电子系统中,如何充分发挥 GTM IP的功能,以满足复杂的系统级应用场景,是用户实现高效控制与精确响应的关键。本文将聚焦几个典型且核心的应用实例,探讨GTM IP在车载系统中的具体实现方式与优势。
发表于 12-30 17:36
•947次阅读
12月22日,云天励飞与360集团签署战略合作协议。双方将围绕“纳米AI”算力底座建设、大模型安全能力提升以及智慧生活产品打造等方向,充分发挥各自在资源、场景与技术方面的优势,联合打造国产生态下的AI推理协同生态。
发表于 12-25 17:09
•696次阅读
法国电子行业的发展道路提供了一种有别于美国的产业模式,即在保持国家战略引导的同时,充分发挥市场活力,在开放合作中维护产业安全。
发表于 12-12 11:58
•905次阅读
基本半导体推出62mm封装的1200V工业级碳化硅MOSFET半桥模块,产品采用新一代碳化硅MOSFET芯片技术,在保持传统62mm封装尺寸优势的基础上,通过创新的模块设计显著降低了模块杂散电感,使碳化硅MOSFET的高频性能得到更充分发挥。
发表于 09-15 16:53
•1557次阅读
工具的好坏取决于其使用者。无论是使用一把锤子还是Fusion Compiler,唯有掌握正确的知识与技能,方能充分发挥工具潜力,达成预期目标。
发表于 08-04 15:01
•897次阅读
工业4.0、制造业数字化和工业流程网络化为PLM的运行提供了框架。它结合了不同的系统和技术,共同优化了产品整个生命周期的信息流。 什么是PLM?
产品生命周期管理(Product
发表于 07-30 14:26
近日,经纬恒润与长春富维海拉车灯有限公司(以下简称“富维海拉”)顺利完成战略合作协议签约。未来,双方将充分发挥各自在车载智能灯光领域的互补优势和资源,共同推动创新灯光解决方案在智能汽车领域
发表于 07-15 17:08
•737次阅读
百度将充分发挥技术优势,进一步加大在辽投资布局力度,深化人工智能大模型、企业数字化转型、数字政府建设等领域合作,带动更多同业伙伴走进辽宁、深耕辽宁,为辽宁产业转型升级、经济社会高质量发展贡献力量。
发表于 07-15 10:35
•1075次阅读
的优势,如高效、彻底、节能、环保等。本文将重点介绍非标超声波清洗设备的最大优势以及如何充分发挥其特点。一、高效清洗非标超声波清洗设备通过高频声波的作用,能够在短时
发表于 07-08 16:58
•787次阅读
近日,江西赣锋锂电科技股份有限公司(简称“赣锋锂电”)与江西龙源新能源有限公司(简称“江西龙源”)正式签署战略合作协议。此次联手,双方将充分发挥各自优势,深度布局新能源项目开发,为新能源产业发展注入新活力。
发表于 07-05 16:19
•1675次阅读
(文章来自CRDE PDM研究中心) 摘要 PDM是制造企业产品数据管理的核心工具,并逐渐发展出了PLM、云PLM等新形态,在功能增加的同时成本也有大幅降低,已经成为企业研发管理的最优选择,并逐渐被
发表于 06-19 17:46
•2532次阅读
根据协议,未来双方将秉持“高端引领、创新驱动、资源共享、共同发展”的原则,共同构建国内领先的“AI+植物科普”教育示范体系。双方将充分发挥各自优势,在AI课程共建、创新AI应用开发等领域展开深度合作,实现知识产权的共同保护、成果共享与合作共赢。
发表于 06-10 15:47
•1103次阅读
,使得其响应速度较慢,无法充分发挥NVMe SSD的速度优势。若想要在嵌入式系统中充分发挥NVMe协议的高速读写性能,一方面可以通过优化软件执行流程,来提高传输性能,但嵌入式处理器的性能较低,性能提升
发表于 06-02 23:28
评论