自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 CPU负载

在内核启动阶段,每个cpu的cpu_load数组会被初始化为0,在运行过程中,一般每个时钟节拍都会在scheduler_tick中通过__update_cpu_load更新cpu_load数组。对于单核CPU来说,当数值低于1时,表示负载良好,对于CPU的利用率为0-100%,如果负载高于1,则表示CPU利用率100%,但会有可运行的进程在排队。但如果CPU处理能力处于过饱和状态(如图3),那么有一部分的可运行进程不能及时获取CPU资源,此时CPU利用率为100%,但CPU负载则超过100%。

2024-05-02 21:30:00 1631 2

原创 进程及进程主动调度

进程 = 程序 + 执行,进程可以说是某种类型的活动,它包含程序、输入、输出及状态等线程是操作系统调度(资源及时间片)的最小单元。一个进程可以拥有多个线程。进程和线程的区别在于进程拥有独立的资源空间,即进程地址空间,而同一进程的线程则共享进程地址空间。在Linux内核中,对于进程及线程都使用相同的数据结构。进程是资源分配的最小单位,而线程是CPU调度的的最小单位。进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,没有用户虚拟地址空间的进程称为内核线程。

2024-04-26 13:16:32 565 1

原创 eBPF挂载函数小结

在C或C++应用程序中,可以使用DTrace或SystemTap的API定义USDT探针,如下通过安装之后,就能通过使用宏来定义usdt,最多可以包含有12个参数。// 触发 USDT 跟踪点return 0;

2024-04-25 14:19:26 276

原创 记一次usdt报错:Fail to attach [Bad file descriptor]

并且在我的用户态文件中被正确挂载了,再看了一下函数,没有返回值,没有return,于是猜想会不会因为是没有return值,导致在attach_usdt中,path路径的文件无效了。经过本次遇到的错误,以后在写代码的时候,要注意函数的返回值类型,及必要返回。,猜测是文件描述符有问题,再仔细看看用户态代码,打印了链接库路径。编译并运行上述测试文件pth,其进程号为90281,于是打开了。于是我重新看了一下我的bpf.c文件,发现我在bpf.c中有两个。文件,该文件包含了进程地址空间的内存映射信息。

2024-04-25 14:13:44 238

原创 奔跑吧Linux内核---第6章简单的字符设备驱动(2)

1.用户空间进程调用read() 方法2.通过系统调用进入驱动程序的read() 方法3.若缓冲区有数据,则把数据复制到用户空间的缓冲区中4.若缓冲区没有数据,则需要把数据从设备中读出来,硬件IO设备是一个慢速设备,不知道什么时候会将数据准备好,因此此时进程需要睡眠等待5.当硬件数据准备好,唤醒正在等待的进程来读取数据非阻塞IO类型:进程发起IO系统调用后,如果设备驱动的缓冲区没有数据的话,那么进程返回错误而不会被阻塞。如果设备驱动的缓冲区中有数据,则设备驱动把数据直接返回给用户进程。

2023-11-23 09:11:53 100

原创 奔跑吧Linux内核---第6章简单的字符设备驱动(1)

Linux设备驱动模型是一种抽象,为内核建立起统一的设备模型。其目的是:提供一个对系统结构的一般性抽象描述。Linux设备模型跟踪所有系统所知道的设备,以便让设备驱动模型的核心程序协调驱动与新设备之间的关系。,设备也是如此,Linux操作系统把设备纳入文件系统的范畴来管理。第一、每个设备都对应一个文件名,在内核中也就对应一个索引节点。第二、对文件操作的系统调用大都适用于设备文件。第三、从应用程序的角度看,设备文件逻辑上的空间是一个线性空间(起始地址为0,每读取一个字节加1)。

2023-11-18 14:27:24 115 1

原创 哈工大李治军OS实验3-系统调用

​ 为了唯一的标识每一个系统调用,Linux为每-一个系统调用定义了一个唯一的编号,此编号称为系统调用号。系统调用号的另一个目的是作为系统调用表的下标,当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用。​ 每一个系统调用foo()在内核态都有一个对应的内核函数sys_ foo(),这个内核函数就是系统调用foo()的实现,也就是说在用户态调用foo(),最终会由内核函数sys_ foo()为用户服务,这里的sys_foo()就是系统调用服务例程。

2023-10-11 14:04:47 142 2

原创 哈工大李治军OS实验2-操作系统的启动

改写bootsect.s改写setup.s。

2023-10-11 13:55:26 181 1

原创 进程控制块学习

其次学习了进程相关的代码,对书写代码方面有很大提升,在传参部分我遇到了问题,用了find__task_by_pid()这个函数后编译的时候发现报错,于是在源码里面搜索这个函数也没找到,然后问了chatgpt,大概的解释就是版本问题或者操作系统,然后chatgpt又推荐了相关函数,我在源码里面找到之后学习了相关函数并应用到代码之中,最终能实现从给定的pid号找到对应的PCB,这次实验收获很大!因此可以通过以前学习的链表的相关知识,遍历系统中的进程链表,进而访问每一个进程的PCB,从而打印进程的相关信息。

2023-10-07 13:33:54 97 1

原创 Ubuntu20.04安装Docker

来查看,我的虚拟机内核版本是5.15.0,是Ubuntu20.04版本。这是一个测试例子,由docker自动下载执行的。要求内核的版本高于3.10,这个内核版本可以用。1.设置存储库,以便于Doker可以正常运行。2.添加 Docker 官方 GPG 密钥。,查看docker服务是否已经启动。我怀疑是源的问题,于是更换了阿里源。3.添加 Docker 软件源。4.安装Docker。

2023-09-29 17:41:19 517

原创 虚地址到物理地址的转换

MMU的转换分为两部分,分段机制和分页机制,如果没有打开分页机制的话,默认就是分段机制,则得出的线性地址就是物理地址。如果打开了分页机制,就需要引入页表的概念。

2023-09-29 17:36:09 841

原创 操作系统真相还原--第三章--完善MBR

由于loader会加载一些段描述符等数据结构,而这些段描述符在以后也会用到,因此loader在加载到内存之后不能被覆盖,并且,我们希望给内核留足够多的空间,所以尽量把loader放在低处,由表2-1可知道,0x500~0x7BFF 和 0x7E00~9FBFF 这两段内存区域都是可用区域,于是我们选取0x900。如图所示,0xb8000是用于文本模式显示适配器,在这里,显示器显示每个字符需要占两个连续的字节,低字节是字符的ASCII码,高字节是字符的属性,如下图所示。回车启动之后,输入c即可看见。

2023-06-27 19:00:21 72 1

原创 vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

2023-06-26 18:05:36 1674

原创 操作系统真相还原--第2章-编写MBR主引导记录,让我们开始掌权

首先,DOS1.0要求的最小内存为32KB,其次mbr大小512B,在为mbr所用的栈分配空间,估计1KB够用,最后mbr要留出足够多的空间,防止自己被破坏,因此放在32KB的最后1KB,即32KB-1KB=0x7c00。这个规定,作者的理解是mbr是主引导程序,如果不事先告诉BIOS mbr位于哪里,BIOS会花费时间去检测mbr,而0盘0道1扇区是磁盘的第一个扇区(CHS方法),也是BIOS第一个检测的扇区,如果mbr存放在这里,就能很快找到mbr,然后BIOS就可以把接力棒交给mbr了。

2023-06-25 13:42:24 127

原创 操作系统真相还原--第1章--部署工作环境

下载完成之后,放在虚拟机的某位置(我在Desktop上放着),然后使用。然后在输入框依次输入以下,输入一个,按一次回车。,在bochs目录里面即将安装bochs。⑤在bochs目录下配置。,并写入修改相关路径信息。至此,bochs安装完成。② 准备一个空目录,

2023-06-25 13:36:12 125

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除