kernel
文章平均质量分 65
Ensighine
IT考古,翻新酒瓶
展开
-
qemu分析之linux-user 2
最后更新2021/12/30终于走到ppc代码call out的位置。如果是同架构cpu,glue代码做转换还相对容易一些,直接可以跳转过去,而且代码是统一的,相对简单一些。如果不同架构CPU,ABI不同,指令代码不同,这个glue code需要好好研究一下。看来未来一段时间,都要搞这个东西了。忽然想到了一个”捷径“,可以用原有写好的ppc (同架构)glue代码做桥接。具体来说,就是把ppc glue code作为guest代码load进来,类似库函数实现。而ppc glue code里面具体调用sy原创 2021-12-30 15:27:46 · 531 阅读 · 0 评论 -
qemu之linux-user分析 1
最后更新2021/12/26这几天研究qemu linux-user有关的问题,此地立个桩,把我认为值得记录的研究结果记录在此。qemu整体的编译不细说了,只针对我需要的ppc64相关关键记录,很大众特别是没遇到问题的过程就不记录了,也许以后整理全本说明的时候填充一下。另外由于我的最终目标是搞aix-user,与aix-user相关的内容也许会在这里有关联,但全部的内容应在另一个专题中,此处都是linux-user的东西。需要继续分析的标记为黑体,随时更新。前置通过configure定义目标,我用的是原创 2021-12-26 14:22:17 · 1161 阅读 · 0 评论 -
aix libc函数映射3
最后更新2021/12/22这两天研究qemu userspace tcg如何触发跳出guest转由host function call执行的问题,另外也碰巧和一帮人讨论userspace程序call kernel时到底发生了什么,两个问题都不约而同走到了一起。下面是最近研究的结果。注意:首先仅限于aix+linux+power指令集,如果是x86,可能有很大区别。甚至不同操作系统版本都可能有差别;其次,个人研究,不确保正确。当然,如果后续得到更确认的结论,我会更新本文,但你别依赖本文作为论据、证据;还原创 2021-12-22 15:29:20 · 377 阅读 · 0 评论 -
aix xcoff可执行文件分析4
最后更新2021/10/31十月最后一天收尾,遥遥无期漫无边际的前路有了可估计的日程。32位加载过程基本搞定,要写一个从头到尾的程序实现一下,忽然发现恐怖的libc shr.o竟然有3000多个依赖symbol !要是都搞一搞,奶油雪糕都凉了。想了一个偷懒的办法,从前往后,首先需要哪个,加载哪个;其次弄个universal的call,都去调用它,然后程序执行的时候输出被谁调用了,尽管程序fail,但是至少留下了遗言,把这个call解决之后再来,终究需要的call都能显示出来。对于小程序,估计十几个,最多几原创 2021-10-31 14:37:54 · 209 阅读 · 0 评论 -
AIX内核扩展编程3
复杂度3/5机密度4/5最后更新2021/05/19我们有了加载程序(大部分),有了被加载程序,还缺什么?还缺如何编译,如何使用,先说编译,这是个make模板。#cat makefileall: mykext kloaderkloader: kloader.c cc -o kloader kloader.cmykext: myExtension.c cc -q32 -o ext32.o -c myExtension.c ld -b32 -o myExt32 ext32.o -e myE原创 2021-05-19 10:27:50 · 160 阅读 · 0 评论 -
AIX内核扩展编程2
复杂度3/5机密度4/5最后更新2021/05/18下面我们要研究被加载程序本身,这和普通c程序没什么太大区别,当然,区别还是有一些的,例如没有main。普通C程序本身,省缺会需要main函数,作为程序入口,而内核扩展程序是通过链接时定义,决定哪个函数是主入口的。甚至可能完全没有入口,只等待其它内核程序调用自己提供的扩展函数。我们先考虑最普通的内核扩展,也就是需要一个入口,需要进行初始化的内核扩展程序。下面的程序看起来与普通的C没什么不同是吧?其中几个主要区别我们说一下:没有main,这个说过了;原创 2021-05-18 18:20:25 · 189 阅读 · 2 评论 -
AIX内核扩展编程1
复杂度3/5机密度4/5最后更新2021/05/18前面介绍过内核扩展也是一种执行程序,与普通执行程序不同的是它需要被加载到内核中执行,拥有内核权限。我们先来看看加载、卸载和内核扩展程序本体。加载需要用到cfg_kmod结构和sysconfig系统调用,前者对要加载的程序进行描述,后者完成加载(或卸载)过程。要注意,不止sysconfig,还有好几个类似的系统调用都完成类似的功能,他们之间没有本质区别,只是适用场景(方便程度)不同,例如,有的调用一步完成加载及初始化,有的则分为若干步,需要使用不同参原创 2021-05-18 13:21:05 · 179 阅读 · 0 评论 -
如何分析AIX启动过程2
复杂度2/5机密度3/5最后更新2021/05/15另一个帮助AIX分析启动过程的方案是打开kernel debug,这样可以像调试单一程序一样调试AIX boot的init程序,打开kernel debug很简单,同样需要在启动的时候进入sms ok模式(方案见),然后进入debug启动并设置陷阱:ok> boot -s trap 或0 > boot -s trapKDB(0)> mw enter_dbg此时输入42和一个点(确定boot之后停在何处),然后执行gKDB原创 2021-05-15 11:02:43 · 215 阅读 · 0 评论 -
内核运行环境
复杂度2/5机密度2/5最后更新2021/05/06AIX内核有两种运行环境:process environment和interrupt environment。用户进程call内核系统调用,或者内核系统调用嵌套call其它系统调用、内核扩展、内核驱动大部分所处的运行状态都是process environment。这个状态与用户user space的程序没什么大区别,只有所能访问的数据和函数不同,process environment状态下仅能且可以完全访问内核内的数据和函数,不能反向去call u原创 2021-05-06 09:09:20 · 133 阅读 · 0 评论 -
设备驱动程序要完成的功能及数据传送方案
复杂度3/5机密度3/5最后更新2021/05/03设备驱动程序在实现过程中需要完成两个通信过程,一个转换过程。两个通信过程是userspace和kernelspace之间,既用户访问请求、返回状态及数据与内核驱动之间的传送;另一个是内核驱动与IO设备之间的数据和命令及返回值的传送。转换过程是对命令的解释、对返回值的应对处理(重试、换路径重试、补偿动作、异常中断等等)。其中userspace与kernelspace的通信有多种方案:寄存器方案。在Power ABI中定义了参数传入和返回值通过寄存原创 2021-05-03 11:13:33 · 407 阅读 · 0 评论 -
不同视角下的存储协议栈
复杂度3/5机密度3/5最后更新2021/05/03我们把AIX的存储协议栈归纳一下,从两个不同视角来观察:以AIX驱动实现视角,主要是文件系统驱动程序(被称为内核扩展可能更恰当,不过具体叫什么并不重要);LVM驱动程序;磁盘设备驱动程序等几个大模块。如果从层级结构看过来,其实也差不多:...原创 2021-05-03 09:47:17 · 135 阅读 · 0 评论 -
虚拟文件系统VFS框架
复杂度3/5机密度3/5最后更新2021/05/01AIX虽然仅内置支持五种类型的文件系统(jfs,jfs2,nfs,CDROM,ramfs),远少于Linux,但其设计并不局限于某一种特定的文件系统,而是采用虚拟文件系统的概念,以一种虚拟文件系统模型为所有文件系统建立通用框架结构。每个进程都有自己的ublock,保存着这个进程所打开的所有文件。事实上,每个进程被创建,ublock也被同步创造,并且头三个项目固定为stdin, stdout, stderrublock的入口实际上只是个链接,它会原创 2021-05-01 18:31:37 · 333 阅读 · 0 评论 -
devinfo和文件类型识别
复杂度3/5机密度4/5最后更新2021/04/30首先使用file命令可以区分普通文件还是设备文件#file test.txttest.txt: ASCII text#file /dev/tty0/dev/tty0: character special (4/0) ==> 字符设备,major number 4,minor number 0#file /dev/shm/dev/shm: symbolic link to /run/shm#file /run/shm/run/原创 2021-04-30 14:28:43 · 818 阅读 · 0 评论 -
LUN磁盘、LVM及JFS2驱动内部关系
复杂度2/5机密度3/5最后更新2021/04/30LUN(Logical Unit Number)是scsi专用概念,指在同一SCSI设备(同SCSI ID)下映射的逻辑子设备。这来自最早SCSI设备是总线结构,可以支持一个或两个initiator,多个target。由于寻址SCSI设备依靠SCSI ID,而每个SCSI总线做多支持16个设备(最多15个target)。如果每个Target只能定位一个磁盘,那么一条SCSI总线仅仅能连接15个磁盘,这对现在动辄几十甚至上百磁盘的服务器设备,远远不足。原创 2021-04-30 14:10:11 · 264 阅读 · 0 评论 -
AIX自举过程2(详细分析)
复杂度3/5机密度4/5最后更新2021/04/29层级一Partition firmware加载Boot loader (softros)并转移控制权Boot loader load 内核及RAM文件系统,再次转移控制权到内核内核(与磁盘上/unix相同,但是是另一个副本)初始化Kernel数据结构,并执行RAM文件系统中的init进程。这个init进程程序位于/usr/lib/boot/ssh (simple shell,并不是日常说的secure shell),并被改名为/etc/ini原创 2021-04-29 10:32:49 · 123 阅读 · 0 评论 -
AIX自举过程1
复杂度3/5机密度4/5最后更新2021/04/28AIX自举过程本身并不很复杂,几乎与其它Unix、Linux完全一致。所不同的是有些方面更像Windows(或者说windows更像AIX,毕竟先有AIX,后有Windows),把建立启动过程所需要完成的功能封装到一条命令里(Windows是菜单一个选项)。AIX并不像Linux那么灵活,在启动中就可以自由选择,直接拿个菜单选项出来去选择内核,可能AIX系统用户不要随意乱动系统,不要给他们为所欲为的机会吧?!AIX自举是紧接着分区微码自举开始的,分原创 2021-04-28 16:04:30 · 205 阅读 · 0 评论 -
JFS/JFS2日志文件系统和日志如何保证数据时间点一致
复杂度3/5机密度3/5最后更新2021/04/27AIX缺省的文件系统是JFS2,既Journal Filesystem v2,第二代日志文件系统。我们知道文件系统是用来管理和保存文件数据,当前计算机世界有各种各样的文件系统,各有不同的特点和用途。AIX的JFS2的最重要特点是日志,既通过日志来达到文件系统数据的一致性。那么什么是一致性,或者说叫做时间点一致性?简单来说,时间点一致性就是在某一特定时刻,你觉得它应当是什么样子,它就一定能做到那个样子。似乎还是不太容易理解!再进一步说,时间点一致性指数原创 2021-04-27 15:26:21 · 294 阅读 · 0 评论 -
AIO, DIO, CIO
复杂度3/5机密度3/5这些名词都用于数据(文件)访问的模式,既应用程序用什么方案实现对文件的读写。AIOAIO 的全称为 Asynchronous I/O,既异步 I/O。在 AIO 的工作模式下,应用程序发起(call)I/O请求(读 / 写)系统调用以后,内核不必等 I/O 完成,即可返回(此时数据区不能释放或修改,需要等访问确认完成),应用程序可以发起新的 I/O 请求。通过这种方法,可以提示提升 I/O 吞吐量和性能。从 AIX5L 起,AIX 支持两种 AIO:legacy AIO 和原创 2021-04-27 13:59:08 · 2933 阅读 · 0 评论 -
文件系统cache机制
复杂度3/5机密度3/5最后更新2021/04/27AIX并未采用传统Unix的cache模式。传统Unix(包括Linux)的cache模式是把cache作为一个单独的旁路应用,嵌入在文件读写的路径中。当应用请求读文件时,kernel从磁盘将数据读到kernel的cache空间,然后把数据转给应用;应用请求文件写的时候,应用把数据发给kernel,kernel根据配置参数,或者只把数据保存在cache空间就返回(回写write back模式),或者保存到cache空间之后再继续写磁盘,完成后才返回(原创 2021-04-27 13:12:17 · 720 阅读 · 0 评论 -
设备管理中的ODM
复杂度3/5机密度4/5最后更新2021/04/25任何AIX支持的设备都需要在PdDv中预先定义,并在其中有一个唯一的”三联体密码“,它包含三部分:class/class/type例如:PdDv :type = “scsd”class = “tape”subclass = “scsi”prefix = “rmt”…uniquetype = “tape/scsi/scsd”从这个定义中我们可以看到有关type,class和subclass,以及由此组成的uniquetype。uniq原创 2021-04-25 17:08:42 · 231 阅读 · 0 评论 -
VMM物理内存、虚拟内存管理,偷页算法
复杂度3/5机密度3/5先总结一下上文。AIX VMM设计了独特的缓存文件数据管理模式,既将缓存的文件数据与对其它类型虚拟内存(例如,进程数据、进程堆栈等等)的管理集成到一起,文件数据缓存也通过页方式管理,如同进程的虚拟内存一样。AIX根据实际访问需要将页映射到物理内存: 如果应用程序访问/引用(reference,read or write)某个页面,而该页面并没有映射到实际内存中(不在PFT),那么系统将产生一个page fault缺页中断。为了解决缺页,AIX 内核会将所引用的页面加载到实际物理内原创 2021-04-25 12:55:36 · 547 阅读 · 0 评论 -
内存段及内存管理
复杂度3/5机密度3/5最后更新2021/04/25前面介绍过内存分配以段为组织进行分配,也就是不同特性的内存申请会从不同的segmeng中分配,每个segment都维护着sbrk和max_stack两个值,用于验证页面是否合法。如果不合法,当前进程会直接被core dump掉,而如果是内核进程,则可能会导致整个系统dump。另一个检验是DMA,此处的DMA不是跨体系的(server内存和io设备内存之间的映射),而是跨驱动或者跨进程的异步操作,当前进程把访问请求交给接手的进程后,两者之间数据通信可原创 2021-04-25 11:09:04 · 144 阅读 · 0 评论 -
AIX系统启动
复杂度2/5机密度3/5最后更新2021/04/23AIX的启动过程粗略来看,大概是这样的:其中有通过硬件/微码(只能调整少量设置)完成的过程,也有通过操作系统软件(可修改)完成的功能。(to be continue)关于SMS的介绍在:。。。。关于软件引导的部分在:。。。。...原创 2021-04-23 14:27:56 · 225 阅读 · 0 评论 -
进程管理
复杂度3/5机密度2/5最后更新2021/04/23AIX的进程管理与其它OS基本类似,每个进程都有自己一组独立的,包括自身当前运行状态的信息,用于控制该进程的运行。这些信息由AIX统一管理,由proc表控制,每个进程在proc表中占据一条记录,被称为proc entry。事实上,proc entry保存的地方被称为slot,AIX有固定的slot数。如果所有的slot被占满,则无法fork新进程(但slot数可以增加,只是不是动态自动增加)。每个进程信息都包括进程ID(PID),也有链表结构表达、原创 2021-04-23 11:56:12 · 100 阅读 · 0 评论 -
RTAS, BIOS Call of Power
复杂度3/5机密度4/5最后更新2021/04/22AIX操作系统如何操作Power服务器硬件?它们中间需要一个接口体系,也就是Power服务器的BIOS,被称为RTAS Run-Time Abstriction Service,本文先不去分析它是如何实现的,只介绍它可以提供什么功能,如何使用它。RTAS的目的和BIOS相同,都是为了隔离硬件,提供统一的,方便使用的服务接口。RTAS的存在使得AIX操作系统可以跨越不同的CPU和服务器架构,用统一的代码提供一致的服务。RTAS一部分由Power服务原创 2021-04-22 14:52:29 · 182 阅读 · 0 评论 -
内存访问实现细节
复杂度3/5机密度4/5最后更新2021/04/22这是很粗略的细节,只大概走一遍流程。每个进程在自己有效地址空间的数据被映射到操作系统统一的虚拟地址空间。鉴于几乎所有程序仅仅使用很少一部分全部可寻址地址空间,只有真实有数据的虚拟地址空间的页面(所谓被reference到)才会被真实分配、记录和管理。每当CPU执行时需要访问某个地址,会根据PFT(Page Frame Table,又被称为HWPFT既Hardware PFT)查找对应的物理内存页面,这是CPU物理实现的,因此查找过程非常快,但正因为原创 2021-04-22 11:43:18 · 197 阅读 · 0 评论 -
内存段分配方案
复杂度3/5机密度3/5最后更新2021/04/21每个进程都有自己的有效地址空间。这个地址空间有些段已经预先被分配或占用(共享),有些等待进程自己进行分配。对进程来说,有2个参数4种组合:32位或64位程序内核态进程或者用户态进程32位用户态进程的有效地址内存段分配方案如下:段用途属性0AIX kernel共享,只读1用户进程共享,只读2Data, BSS, stack, Ublock, uthread, heap私有,读写3-C共享数据原创 2021-04-21 18:04:58 · 187 阅读 · 0 评论 -
VMM地址映射
复杂度3/5机密度3/5原创 2021-04-21 13:35:07 · 200 阅读 · 0 评论 -
VMM基础
复杂度3/5机密度3/5最后更新2021/04/20VMM Virtual Memory Management是所有操作系统都要解决的问题,也是非常硬件相关的问题,必须从硬件CPU的地址管理开始谈起。原创 2021-04-20 16:48:50 · 1310 阅读 · 0 评论 -
PCI设备管理
复杂度3/5机密度4/5最后更新2021/04/20本文以PCI设备为例,介绍一下AIX如果对设备进行初始化。如果大家已经阅读了其它介绍,应当大概知道AIX初始化设备是按照设备关系树由父设备到子设备依次遍历各个节点的,那么具体是怎样的?下面假设从某个设备PCI0开始。pci0在aix中代表一个pci槽位,初始化pci槽位的驱动程序(PCI总线驱动)在执行初始化过程时会通过PAL(Power Abstrict Layer硬件管理微码)操作获得该槽位硬件卡的参数信息,例如设备类型(名称),中断类型和数量原创 2021-04-20 14:35:57 · 589 阅读 · 0 评论 -
KernelExtension
复杂度3/5机密度3/5任何宏内核OS都包括kernel space和user space两部分。内核态程序直接访问内核空间,具有最高权利,可以“为所欲为”;用户态程序则需要通过特殊的访问接口(系统调用)通过内核态程序完成需要更高权限的访问。AIX是宏内核、动态内核操作系统,可以自主编程“插入”到AIX内核中,具有内核权利,这一类程序被称为kernel extension。内核扩展程序可以完成任何功能,其中重要的一类就是设备驱动程序。现代OS都采用框架结构,很多功能都已经在操作系统中实现了自动化加载原创 2021-04-19 13:14:32 · 371 阅读 · 0 评论