
Linux
文章平均质量分 85
scutth
这个作者很懒,什么都没留下…
展开
-
Memory Management [LKD 12]
kernel中和user space存在很大不同,从user space角度看,分配/释放内存易如反掌,即便失败了也容易处理,kernel里面不一样。比如有些kernel code不允许sleep,或者失败的时候难以处理等。考虑到kernel种种的复杂性,就需要轻量级效率高的内存管理方式。Pages...原创 2020-05-28 23:11:36 · 282 阅读 · 0 评论 -
An Introduction to Kernel Synchronization [LKD 09]
kernel中需要对可能被多个thread同时访问的share data做保护,也就是互斥访问,这里说的多个thread,并不只是传统的kernel thread的概念,还包括process(task),interrupt handler,bottom half,以及kernel thread。也就是说凡是能够执行的单元,这里统称为thread。...原创 2020-05-28 22:46:51 · 155 阅读 · 0 评论 -
Bottom Halves and Deferring Work [LKD 08]
基于kernel 4.15讲解interrupt下半部的实现原创 2020-05-24 17:34:59 · 380 阅读 · 0 评论 -
Interrupts and Interrupt Handlers [LKD 07]
Interrupts中断是hardware device用来通知CPU的一种机制。在系统上,连接着很多的外设,这些外设速度很慢,并且随时会产生数据需要CPU处理,CPU作为高速运行的部件,不能一直等着外设产生数据,为了提高效率,采用了中断这种机制。当外设需要CPU处理数据时,就向CPU发送电信号,CPU收到电信号以后,就知道哪个设备需要处理了,这个电信号就是中断。中断并不是直接发送给CPU,而是先发送到interrupt controller,也就是中断控制器(一般是8259A),所有的外设都把中断原创 2020-05-19 23:34:55 · 1219 阅读 · 0 评论 -
Kernel Data Structures [LKD 06]
关于kernel中常用的数据结构,这里也不再说了,可以参考本blog中LDD3中相关的章节。原创 2020-05-18 23:23:39 · 234 阅读 · 0 评论 -
System Calls [LKD 05]
无论什么系统,都会向user space提供一些interface,用来和kernel系统交互,从而可以实现某些特定功能,比如访问硬件,获取系统资源等等。通过定义好的interface访问系统,有助于系统的稳定性。Communicating with the Kernel系统调用是位于用户态程序和kernel/hardware的中间层,这个中间层有三个目标:1. 向user space提供统一的硬件抽象;2. 保证系统的安全性和稳定性;3. 可以实现向用户提供虚拟系统(虚拟内存,虚拟地址原创 2020-05-18 13:21:55 · 258 阅读 · 0 评论 -
Process Scheduling [LKD 04]
前面一章讲的是process,这一章讲process schedule。进程调度的主要工作就两个:选哪个process开始执行,以及让它执行多长时间。Multitaskinglinux是多任务操作系统,如果有SMP,就有多个process同时在执行,如果是单核,就只有一个process执行。多任务操作系统分为两类:cooperative multitasking和preemptive multitasking。大多数多任务系统都是preemptive multitasking,也就是抢占式的多任原创 2020-05-15 13:27:26 · 482 阅读 · 0 评论 -
Process Management [LKD 03]
今天开始读Linux Kernel Development这本书。原创 2020-05-05 16:40:02 · 376 阅读 · 0 评论 -
Debugging Techniques [LDD3 04]
kernel相较于user,debug起来更加困难,原因有很多,比如kernel中代码的执行是并发的,靠event来驱动;而且kernel一旦出现了bug,很容易把整个系统搞挂,导致后面的现场无法trace,本章就介绍了一些kernel中的debug技巧。Debugging Support in the Kernelkernel的发行版都是production code,也就是说里面包含的...原创 2020-04-20 22:41:39 · 177 阅读 · 0 评论 -
Memory Mapping and DMA [LDD3 15]
Memory Management in LinuxAddress TypesLinux kernel中有很多的地址类型,比如最简单的就是虚拟地址和物理地址。在用户程序中看到的地址都是虚拟地址,和硬件使用的物理地址不同。kernel中的地址类型如下:User virtual addressesuser space programmer看到的地址就是用户态虚拟地址,可能是32bit,...原创 2020-04-15 13:08:20 · 911 阅读 · 0 评论 -
Linux kernel slub debug
在device driver开发的过程中,有时候会碰到memory相关的问题,比如memory leak,use after free,out of boundary,double free等等。因为device driver运行在kernel环境,kernel是一个global的runtime,driver分配或者释放的memory都是由kernel负责管理,而且所有的device driver...原创 2020-04-13 14:26:50 · 1374 阅读 · 0 评论 -
The Linux Device Model [LDD3 14]
kernel中的设备模型分为如下几种:Power management and system shutdownCommunications with user spaceHotpluggable devicesDevice classesObject lifecycles以一个鼠标为例,看一下它的设备模型:这个一个简化的模型,设备模型本身比较复杂,kernel内部已...原创 2020-04-12 18:56:58 · 449 阅读 · 0 评论 -
PCI Drivers [LDD3 12]
因为很多device都是PCI device,所以本章重点看一下。PCI(Peripheral Component Interconnect)。首先明确一点,PCI是总线类型,总线有两种接口类型组成,electrical interface和programming interface,软件层面都属于programming interface。The PCI InterfacePCI由一...原创 2020-04-11 11:48:47 · 402 阅读 · 0 评论 -
Data Types in the Kernel [LDD3 11]
kernel中各种各样的数据结构,主要三类:1, int等标准的C类型2, 表明大小或者长度的类型,如u32等3, kernel自己的结构体,如pid_t等原创 2020-04-11 11:02:55 · 166 阅读 · 0 评论 -
Interrupt Handling [LDD3 10]
device的IO region可以用来控制device,但是还不够。一个device,往往会有外界有交互,当外界发生了某个事件,需要device做出某种响应,driver也需要做处理。那就要有一种机制,让device能够通知到driver,这就是中断的作用。driver能做的,其实就是实现一个handler,当device中断产生时,handler能够正确处理这个中断就可以了。在讲中断之前,...原创 2020-04-08 22:58:37 · 464 阅读 · 0 评论 -
Communicating with Hardware [LDD3 09]
本章开始讲一些跟hardware有关的操作,比如I/O port,register等。device driver的角色要清楚,它只是中间层,向上有kernel,user application,向下就是actual hardware。作为driver,核心功能必然是驱动硬件。I/O Ports and I/O Memory每一个外设都要通过register来控制,大多数设备都有不止一个...原创 2020-04-08 13:19:34 · 242 阅读 · 0 评论 -
Allocating Memory [LDD3 08]
本章讨论从kernel分配memory的同样方法,并尽可能与架构无关。kmalloc相对来说,是最简单的分配memory的方式,因为用法和user mode的malloc非常相似。kernel的kmalloc分配的memory在物理地址上是连续的,并且里面包含了随机的数据,需要使用者自己清零。#include <linux/slab.h>void *kmalloc(size...原创 2020-04-06 22:50:57 · 457 阅读 · 0 评论 -
Time Delays and Deferred Work [LDD3 07]
kernel提供了一些跟时间管理相关的函数,device driver中往往需要这些函数来实现driver的部分功能。1, 测量时间和比较时间2, 如何获取当前时间3, 延迟某些操作,直到某个时刻4, 异步函数的调度整个kernel的运行非常的依赖与时间,因为kernel里面很多的工作需要做同步,如果计时器不准确,那kernel运行起来就不可控了。kernel的时间需要靠硬件的...原创 2020-04-05 17:01:31 · 235 阅读 · 0 评论 -
Advanced Char Driver Operations [LDD3 06]
本章讲的是driver的高级操作,比如:1, 实现了ioctl,device driver可以满足user mode一些特定的操作。2, 和user mode做好sync的几种方式。3, 如何让process进入sleep,以及如何wake up。4, 非阻塞IO操作,以及读写完成以后如何通知user mode。...原创 2020-04-04 11:33:36 · 190 阅读 · 0 评论 -
Concurrency and Race Conditions [LDD3 05]
Concurrency and Its Management并发和竞争条件,这个计算机操作系统里经典话题,只看文字体会不出什么,如果真正做过devcie driver的人都会深有体会。并发是一个很复杂的场景,复杂到没有人能预测当前的code会是怎么样的环境下执行,看似简答的device driver code,也许正在执行的时候因为时间片用完,CPU被切走了;可能中断发生,CPU处理中断去了;...原创 2020-04-01 23:23:45 · 168 阅读 · 0 评论 -
Char Drivers [LDD3 03]
本章开始讲解char device drivers.在linux中设备可通过文件进行访问,在/dev目录下,有很多device,通过ls -l可以看到这些device有major/minor number。majoy number用来表明该device和哪个driver关联,minor number被kernel用来确定当前被使用的是哪个device,因为同一个driver可以驱动多个devi...原创 2020-03-30 13:28:07 · 269 阅读 · 0 评论 -
Linux 学习书籍列表
记录一下准备看的书:1. Linux Device Driver 3rd Edition //在看2. Linux 内核设计与实现3. 深入理解Linux内核4. 深入Linux内核架构原创 2020-03-29 10:39:37 · 146 阅读 · 0 评论 -
Build and Run Modules [LDD3 02]
模块化是Linux kernel driver的立身之本,几乎所有的device driver都是module driver,在kernel启动的时候动态加载,学会如何编写module driver是编写device driver的必修课。#include <linux/init.h> #include <linux/module.h> MODULE_LICENS...原创 2020-03-27 22:43:40 · 349 阅读 · 0 评论 -
ubuntu获取特定版本的package
有时候需要安装特定版本的package,如果自己找source code来build会比较麻烦,如果能用apt install来安装,岂不是很方便。操作之前,先update:$sudo apt update根据包名,获取当前操作系统支持的package 版本:$apt-cache policy xserver-xorg-core-hwe-16.04类似于下面的输出:x...原创 2020-03-26 14:31:27 · 260 阅读 · 0 评论 -
ubuntu kernel panic查看源文件
在驱动开发中,经常会碰到kernel panic的问题,如果快速和高效的定位出问题的位置至关重要。kernel panic出现的位置有两个,一种是在kernel里面,一种是在device driver里面,根据kernel panic的call stack可以看出来,定位源文件的方法也是一样的。首先要有对应的debug symbol,如果是在linux kernel里,就需要安装对应版本的sy...原创 2020-03-26 14:21:05 · 586 阅读 · 0 评论 -
ubuntu获取发行版linux kernel的debug symbol
有时候碰到了kernel panic,如果stack在linux kernel里,那就需要有linux kernel的debug symbol,如果你的kernel是release的,那就可以直接下载symbol就可以了。1. 从ubuntu keyserver获取keyubuntu 16.04及以后的系统:$sudo apt-key adv --keyserver keyserve...原创 2020-03-26 13:46:06 · 1315 阅读 · 0 评论 -
ubuntu 发行版 package source code如何修改和build
如何获取source code可以参考这一篇文章。首先需要确认系统里有quilt这个工具,如果没有:$sudo apt install quilt进入source code根目录,在修改source code之前需要创建patch。$quilt new my_patch.patch然后把需要修改的文件告诉quilt:$quilt add my_file_need_modif...原创 2020-03-26 13:36:01 · 418 阅读 · 0 评论 -
ubuntu 获取 package source code
ubuntu是开源系统,系统里的所有package也都是开源的,如何方便的获取package的source code?1. 修改/etc/apt/sources.list,打开deb-src (默认是注释掉的)2. sudo apt update //更新src source的源3. 获取package 名字在获取source code之前,你需要知道package的名字,可以...原创 2020-03-26 13:12:11 · 730 阅读 · 0 评论 -
Linux GRUB
通过修改GRUB里控制linux kernel的行为,修改/etc/default/grub的GRUB_CMDLINE_LINUX,添加所需内容,比如:console=tty0 console=ttyS1,115200n8 //可以打开kernel的串口打印intel_iommu=on //可以打开kernel的IOMMU,需要有IOMMU设备支持如果安装有多个系统,可以修改...原创 2020-03-26 12:58:37 · 391 阅读 · 0 评论 -
introduction to device drivers【LDD3 01】
做Linux下驱动开发有段时间了,但是有时候对Linux kernel涉及到的部分依然不甚明了,所以打算再把kernel相关的一些书籍过一遍,同时分享下自己的理解。既然是做driver,就从ldd3开始吧。今天是第一篇,从导论开始吧,虽然看上去导论很浅显,但是往往能起到提纲挈领的左右,有助于对device driver有个全盘的了解。Linux kernel虽然复杂和庞大,但是最核心的部分仍然...原创 2020-03-24 23:36:33 · 377 阅读 · 0 评论 -
linux/unix下setuid/seteuid/setreuid/setresuid
其中setresuid()具有最清晰的语法:setresuid()被执行的条件有:①当前进程的euid是root②三个参数,每一个等于原来某个id中的一个如果满足以上条件的任意一个,setresuid()都可以正常调用,并执行,将进程的ID设置成对应的ID。例子:如果ruid=100,euid=0,suid=300则setresuid(200,300,100原创 2011-11-17 10:39:44 · 14129 阅读 · 3 评论 -
Fedora 安装gvim提示Gtk-WARNING **: Invalid input string
原因:Ubuntu 10.04 Lucid Lynx默认安装将会把中文区域设置为zh_CN.utf8,而GVim能识别的中文区域设置为zh_CN.UTF-8。因此GVim会在启动时报错,且无法正常加载中文菜单。解决方案:代码:cd /usr/share/vim/vim73/langyum ln -s menu_zh_cn.utf-8.vim menu_zh_cn转载 2011-12-22 23:27:17 · 1345 阅读 · 0 评论 -
gvim的配置文件
" All system-wide defaults are set in $VIMRUNTIME/debian.vim (usually just" /usr/share/vim/vimcurrent/debian.vim) and sourced by the call to :runtime" you can find below. If you wish to change any原创 2011-11-04 21:02:40 · 725 阅读 · 0 评论 -
ubuntu 11.10 修改gvim的字体
我自己的配置:if has("gui_running")set guifont=Courier\ New\ 12endif终端安装字体:sudo apt-get install ttf-inconsolata注意在New和12之前都有一个空格,即字体名字中的空格一律使用"\ "代替(一个斜杠加一个空格)。查了好多网站,在国外到一个网站找到到一个方法,目前只有这一个有效。原创 2011-11-04 20:59:16 · 2539 阅读 · 0 评论 -
Gvim的进一步配置
set go= "无菜单、工具栏"首先说说一个IDE应该有的几个功能:1)源代码结构及函数列表2)变量定义支持跳转等3)代码自动补全当然VIM还给了我们几个小惊喜:4)快速批量注释与反注释5)由注释直接生成文档6)文件头作者信息自动添加7).cpp和.h文件之间的快速切换那么接下来,我们久来看看我们将会用到的插件列表。首先介绍一下一些必备知识,我们需要下转载 2011-10-27 18:24:19 · 820 阅读 · 0 评论 -
VIM无法在模块路径中找到主题引擎
问题:在Linux下安装Gvim以后,用终端打开Gvim出现“Gtk-WARNING **:无法在模块路径中找到主题引擎:“pixmap”?”解决办法:sudo apt-get install gtk2-engines-pixbuf其实导致这个原因是gtk引擎出现了故障,多数情况下是其他软件包与之冲突后被卸载。因此,解决的办法很简单,安装gtk引擎gtk2-en转载 2011-10-16 21:04:38 · 4974 阅读 · 1 评论 -
libnids 1.24安装
libnids 1.22以后使用了,glib2库中的gthread-2.0来实现多线程提高效率,因此在编译除了-lnids -lpcap -lnet 以外还要加上 -lgthread-2.0当然因该先安装glib2.x的rpm包和相关的devel和head包转载 2011-10-25 18:12:49 · 1246 阅读 · 1 评论