Crab213's Blog.

Crab213's Blog.

A monad is just a monoid in the category of endofunctors.

在Linux系统中禁用USB端口

简单禁用单个端口使用udev进行禁用。每个USB端口在sysfs中都有一个名为authorized的属性,该属性的值表表示该PORT上的设备是否获得内核的授权,没有授权的设备,内核不会让其被用户态访问。 可以编写udev rules文件禁用特定的USB端口, 首先确定USB端口的名称,可以通过运行: 1lsusb -t 命令查看。找出对应的USB端口之后(这里为1-10,其中1代表USB总线编号,10表示port编号),之后编写对应的udev文件/etc/udev/rules.d/99-usb-lockdown.rules: 1ACTION=="add", SUBSY...

Linux设备模型:bus与driver

bus & driverbus core的实现在driver/base/bus.c中,初始化过程由buses_init函数实现,函数中创建了两个kset:bus_kset(name为bus)和system_kset(name为system)。初始化过程这么简单的话bus注册的工作应该就会比较复杂了。 subsys_private为了隐藏bus core内部的状态,每个bus_type都保存一个指向subsys_private结构体的指针,这个数据结构只能由bus core中进行操作。其中subsys即为表示该bus的kset,subsys中还将放置另外两个kset,即结构体中的d...

inode权限检查

inode_permission函数inode_permission函数用于对inode进行权限检查,我们传给其一个mask参数,这个参数是一个bitmap,主要有三个标志: MAY_READ:inode是否可读 MAY_WRITE:inode是否可写 MAY_EXEC:inode是否可执行(对于文件夹来说意味着是否可以访问文件夹下的文件或文件夹) 如果该函数的返回值为0,说明检查通过。inode_permission所做的检查主要分为两个部分: 文件系统级别检查 inode级别检查 文件系统级别检查主要是检查文件系统一级的权限,这里只考虑一种情况:文件系统只读,代码如下: 12...

eventfd在内核中的实现

eventfd是一个利用匿名文件描述符实现“等待/通知”通信机制的一种方式。它比较方便的一点是,eventfd不仅可以实现用户态与用户态之间的通信,也可以实现内核与用户态的通信。eventfd的实现比较简单易懂,主要在以下两个文件中: include/linux/eventfd.h fs/eventfd.c 而关于eventfd的详细说明可以参考man-pages: 1man eventfd 由于eventfd的实现很简短(只有500行左右),下面详细地分析在内核中的实现。 在内核中的表示很明显,eventfd需要一个保存特定的状态,内核使用eventfd_ctx来保存一个event...

A Discipline of Programming 1: 系统与形式记号

本书简介以前曾经在图书馆看到过此书,当即就觉得很对胃口,可能与我研究过抽象代数有关。这本数更像是一本数学数,我认为它比《算法导论》更为严谨,本书展示了抽象与形式系统结合之后的威力。这本书并没有高深的算法,它主要是作者对编程的思考。 状态空间(state space)及其约束如果有稍微有点数学背景,甚至说只要上数学课稍微认真过一点,就会发现状态空间的思想无处不在,最典型的就是概率论中的样本空间。 我们从集合的角度看待变量的所有可能状态,这就是状态空间,与向量空间,样本空间是同本同源的。这样做的好处是,我们可以用预言(prediction)来过滤这个集合,筛选集合中的元素。因此,我们可以用一...

Floyd循环检测算法

循环检测问题在研究抽象代数的时候,很多教材都是从欧拉研究的循环群入手的,比如这本《Advanced Modern Algebra》。 当然,直接讨论数学有些扯远了,我们并不需要群论知识,锦上添花而已。考虑一个由连续自然数组成的集合M, 它由0到n-1的自然数组成,然后考虑一个映射f,它将M映射到它自身,亦即我们定义操作f。 由于f将M映射到M,对每个e∈M,f(e)总是有定义的,我们可以将某个元素e多次进行f操作。现在我们来考虑靠考虑这样做会发生什么?很显然,这样的操作会形成一个链条装的结构,比如映射f(e) = (e + 1) % n,取初始数据为0,n = 4,则可以得到: 0 -...

TCP/IP Sockets in Java:2 NIO

BufferBuffer对象代表一个缓冲区,是Channel中进行传输的基本单元。NIO中Channel与Selector的组合为我们提供了更加灵活的非阻塞IO解决方案。Buffer可看作一个定长数组,这个数组有四个索引,分别是position,mark,capacity及limit。 capacity是这个Buffer对象的容量,是不可变的。 limit的值代表第一个不可读写的数组元素的位置。 position是当前的操作位置。读写操作都是以position为起始位置。 mark的值是用户自定的一个标记。 Buffer对象内部的不变式: mark <= position &l...

TCP/IP Sockets in Java:1 TCP/UDP Socket

地址为了建立两台位于互联网中主机的连接,需要IP地址。Java中用InetAddress表示一个IP地址。然而,只有IP地址还不够,操作系统支持运行大量的进程,两台主机间的通信实质上变为了两个进程见的通信。为此TCP与UDP协议中都有端口号这一概念,应用程序在进行网络通信的时候会向操作系统请求占用某个端口号。所以一个TCP连接可以由连接双方的地址及端口号这个四元组唯一标识。 然而,IP地址对于用户并不是很友好,通过DNS我们可以将一个主机名与多个IP地址联系起来。我们只需要记住主机名,就可以通过DNS解析到对应的IP地址。这样做的好处是主机名比IP地址更加用户友好,同时,IP地址的变化可...
crab2313
slave get your ass back here ♂.
FRIENDS
friendA friendB