当前位置: 首页 > news >正文

成都网站建设代理加盟网站建设报价浩森宇特

成都网站建设代理加盟,网站建设报价浩森宇特,百度统计,策划公司的经营范围背景 问题 前段时间开发一个tty驱动,用途是实现仪器对GPIB消息的接收、处理和上报。对于上报场景,下位机应用将上报内容写入一个驱动创建的tty设备,tty子系统将应用的输入转发给tty驱动,tty驱动将其转换成对SPI从设备&#xff0…

背景

问题

前段时间开发一个tty驱动,用途是实现仪器对GPIB消息的接收、处理和上报。对于上报场景,下位机应用将上报内容写入一个驱动创建的tty设备,tty子系统将应用的输入转发给tty驱动,tty驱动将其转换成对SPI从设备(即GPIB扩展板)的写入,SPI从设备再将收到的SPI消息转换成GPIB消息发送给上位机
GPIB拓扑

实现tty_operationswrite接口时,我是这么获取驱动上下文的:

struct gpib_tty_ctx {struct tty_port port;struct tty_struct mgr;  // 其实是无效的成员struct tty_driver *tty_drv;struct spi_device *spi_dev;struct gpib_spi_ctx *spi_ctx;struct mutex tty_lock;u32 activated:1;const u8 *pend_tx_buf;u32 pend_tx_len;
};static int gpib_tty_write(struct tty_struct * tty, const unsigned char *buf, int count)
{struct gpib_tty_ctx *ctx = container_of(tty, struct gpib_tty_ctx, mgr);// 通过ctx指针访问上下文结构体gpib_tty_ctx的驱动私有字段,完成write功能return count;
}

但是实际执行的时候,触发了空指针异常,且空指针的值并不是0x0这种典型值,而是带一点偏移。

问题定位

经定位,是我对tty子系统的理解有问题,write方法的第一个入参tty,并不是gpib_tty_ctxstruct tty_struct mgr成员的地址,而是tty子系统在运行时自动创建的一个匿名tty_struct对象的地址!因此我用container_of宏获取到的gpib_tty_ctx对象地址也是一个无效地址!

解决

注意到tty_struct结构体包含一个类型为struct tty_port的指针port

struct tty_struct {struct kref kref;int index;struct device *dev;struct tty_driver *driver;struct tty_port *port;   // 指向用户驱动创建并初始化的tty_port对象const struct tty_operations *ops;struct tty_ldisc *ldisc;struct ld_semaphore ldisc_sem;// ...
};

它应该就是指向驱动之前创建并初始化的gpib_tty_ctx.port对象,这个对象本身是没有被复制的,因此我可以将这个指针传递给container_of宏:

struct gpib_tty_ctx *ctx = container_of(tty->port, struct gpib_tty_ctx, port);

经测试,新的container_of宏返回了正确的驱动上下文地址。

总结

  1. tty_struct指针类似于file_operations接口的open方法的输出参数file指针,都对应内核自动分配的一个对象,其地址是不可以用于container_of宏的,但是它的成员private_data可以用于container_of宏,因为后者的值是驱动填写的。
  2. container_of宏的第一个参数是结构体成员地址,这个结构体成员一般是个对象,不建议选地址类成员,因为如果是地址,则该成员很可能是复制过的,那么你通过给container_of宏提供二级指针(指针成员的地址就是二级指针)获取的ctx对象,很可能是错的。
http://www.yayakq.cn/news/509513/

相关文章:

  • 龙华网站-建设深圳信科拓者室内设计联盟
  • 网站设计与开发专业app需要网站有哪些
  • 学做网站丛什么开始花生壳免费域名注册网站
  • 什么网站做电子元器件网站的创新点
  • 模板王网站官网文案网站编辑怎么做
  • 怎样做公司的网站怎么用自己的主机做网站服务器吗
  • 湛江制作公司网站淘宝网站边上的导航栏怎么做
  • 外贸网站 域名后缀广东省建设交易中心网站首页
  • 用cms创建自己带数据库的网站和在本机搭建网站运行平台的心得体会广告公司管理系统软件
  • 正规的网站制作哪个好南宁seo外包要求
  • 网站广告代码怎么添加wordpress客户端无法上传图片
  • 网店模板安卓优化大师历史版本
  • 企业做网站天津中国建设银行美金账户登录网站
  • 设计做兼职最好的网站杭州科技公司
  • 一个网站的年维护费指示灯具网站建设
  • 免费网站建设 百度收录spam free wordpress
  • 建设小说网站首页创建一个网站买卖
  • 网站注册商标属于哪一类wordpress 自动分享
  • 网站优化排名多少钱千旺crm客户管理系统
  • 网站制作的知识哪有做网站 的
  • 食堂网站建设免费wordpress主题分享
  • 青岛君哲网站建设公司设计制作费税率是多少
  • 网站建设模板素材长安企业建站
  • 门户网站推广介绍方案南京建设工程交易中心
  • 和京东一样的网站泉州网站建设技术外包
  • 景观毕业设计作品网站丹徒网站建设哪家好
  • wordpress更换网站站长工具a级
  • 江门网站推广深圳公司wordpress手动数据库优化
  • 网站有权重可以对title做更改电商网站开发实例
  • 网站建设与管理题目阿里云域名查询官网