0%

本系列文章是对《Linux Device Drivers》一书的个人笔记,作为学习过程的记录,供日后参考回顾用,不保证可读性和条理性。

设备驱动程序简介

机制和策略

区分机制和策略是Unix的设计哲学之一。

  • 机制:需要提供什么功能
  • 策略:如何使用这些功能

举例一:TCP/IP网络,位于下层的操作系统负责提供套接字抽象,但在所传输的数据上没有附加任何策略;上层的服务器则分别提供不同的服务。

举例二:ftpd服务器提供文件传输机制,用户可以使用任何自己喜欢的客户端传输文件,例如命令行和图形客户端。

驱动程序应当不带策略:编写访问硬件的内核代码时,不要给用户强加任何特定策略。不同的用户有不同的需求,驱动程序应该处理如何使用硬件可用的问题,而降怎样使用硬件的问题留给上层应用程序。因此,当驱动程序只提供了放文件硬件的功能而没有附加任何限制是,这个驱动程序就比较灵活。

不带策略的驱动程序包括一些典型特征:

  • 支持同步和异步操作
  • 驱动程序能够被多次打开、充分利用硬件特性
  • 不具备用来简化任务的软件层
  • 不具备提供与策略相关的软件层
Read more »

本文主要介绍Armv8-A架构的栈操作,涉及AArch64执行状态的关键寄存器、栈操作的ARM64汇编指令和一些编程约定。函数调用必然涉及到 出栈和入栈,理解了ARM64的栈操作,对更深入理解C语言的函数调用大有裨益;也能够协助debug一些诡异的Bug。

Read more »

在平时瞎搞中,经常会遇到GNU工具的一些知识,毕竟GNU和Linux关系紧密。这些工具和知识点对于开发Linux是必不可少的基础,每次忘记了都要谷歌一把,不如记在自己的空间里,方便检索。

Read more »

2020.06.06

  • 等以后有时间再做,就永远不会有时间;正确的态度是当下行动,立即就做。
  • 拖延的心理是安慰自己等会再做能把事情做得更完美,但是这是彻头彻尾的假象!等会再做并不能把事情做得更好,而应该是现在就竭尽全力是做,就能做到最好。

2020.06.30

  • 传播科学精神更甚于传播科学知识。

ARM64/AArch64汇编使用LDR命令从内存加载数据到寄存器,指定加载的源内存地址有多种方式,其中一种是LDR Rx Label的方式。对这条命令心中一直心存疑惑,所以这里对LDR命令使用Lable加载数据的方式作一些剖析,拨开迷雾,找到答案。话不多说,首先看一段GNU ARM64汇编示例代码:

Read more »

​ Armv8架构在AArch64运行状态下定义了4种特权级别,也称为Exception Level,分别为:

  • EL0:Application运行在EL0
  • EL1:Rich OS(Linux kernel)运行在EL1
  • EL2:Hypervisor运行在EL2
  • EL3:Firmware/Secure Monitor运行在EL3

不同的任务运行在不同的EL,如果我们想知道当前CPU处于哪个EL(比如在BootLoader中)该如何实现呢?

答案是:CurrentEL寄存器。

Read more »

在Kotlin中,赋值操作不能用于while或者if语句中,这与Java或者C/C++的用法明显不同。

在《Learn Android Studio3 with Kotlin》一书中是这么解释的:

Assignments are expressions in Java, but they are statements in Kotlin.

用我们的话来说就是,在Kotlin语言中赋值操作是语句而非表达式

那statement和expression有什么区别呢?简单来说,expression最终总是被解析为一个值,而statement就是语句,它不能解析为一个值。既然不能解析为值,就无法对statement判断真假,赋值操作也就不能用于while或if中了。

Kotlin将赋值当作statement的原因我还未细看,但此种规则确实可以带来一些好处,通过一个简单对比例子就能明白了。

Read more »

最近一直想给已经过时的台式机重新搞一下开发环境,了解到了黑苹果(Hackintosh),于是乎花了三晚外加周六,终于给老旧的台式机装上了最新的MacOS 10.15版本。不过黑苹果的安装的确很折腾人,中间数次掉坑里,好在结果还算令人满意,这里记录一下。

声明

首先要声明一下,本人是苹果的忠实的粉丝和产品支持者,工作中使用的电脑是MBA;同时热爱Linux,拥护Manjaro发行版。因此,这里捣鼓黑苹果完全是出于兴趣好奇,没有任何利益问题,会继续支持和使用苹果的产品。同时,不鼓励大家搞黑苹果,要获得优秀的体验还是要去购买苹果的产品,省时省力,避免折腾,享受美好。

Read more »

条款05:了解C++默默编写并调用了哪些函数

当声明一个“空”类的时候,编译器会默默为它声明一个Default构造函数、copy构造函数,copy assignment操作符和一个析构函数;所有这些函数都是public且inline的。

  • Default构造函数和析构函数用来放置藏身幕后的代码,比如调用base classes和non-static成员变量的构造和析构函数;
  • copy构造函数和copy assignment操作符,编译器生产的版本只是单纯第将源对象的non-static的成员变量拷贝到目标对象;
  • 如果打算在一个内含reference成员的class内支持赋值操作,必须自己定义copy assignment操作符;
  • 对内含const成员的类,同样需要自己定义;
Read more »