- 博客(30)
- 收藏
- 关注
原创 read系统调用源码分析
文章目录基本知识前言一个文件基本的读写流程图块设备驱动<1> 块设备(blockdevice)<2> 块设备结构<3> `block_device`和`gendisk` 区别同步/异步IO请求队列read系统调用源码分析设计思想一、入口函数(1)`fget_light`(2)`fput_light`缓冲区二、`vfs_read`函数(1)`file_operations`三、`do_sync_read`四、`generic_file_aio_read`1. 块请求(1)`
2023-11-19 10:19:19
758
原创 编写MBR主引导记录
在检验过程中,若BIOS检验出该磁盘末尾两个字节是0x55和0xaa则认定其为MBR,便加载到物理地址0x7c00,然后跳转过去,即可开始执行MBR。接电的一瞬间,cs:ip寄存器被初始化为0xF000:0xFFF0,所以等效地址是0xFFFF0(BIOS入口地址)BIOS最后的工作就是检验0盘0道1扇区的内容,因为mbr要离BIOS最近,唤醒BIOS需要知道其入口地址,在最后将跳转到0x7c00处。挑一些重要的,能保证计算机能运行那些硬件的基本IO操作。抓一张bochs图来分析。
2023-11-07 15:35:43
189
原创 保护模式入门
之前的实模式就是程序编址都是在物理地址下进行,但是这对于咱们如今程序员实现软件编程和程序共享是十分困难的,因为在不同的机器上使用物理地址很有可能出现程序之间的冲突,并且实模式的寻址也只能支持1MB内存,所以这里就需要用到另外一种模式,也就是保护模式。现在咱们的操作系统的步骤我在这里总结一下,首先是BIOS加载位于磁盘0扇区的MBR,然后MBR加载位于磁盘2扇区的Loader,且到现在为止,他们都是位于实模式下。
2023-11-07 15:34:40
419
原创 Lab7(地址映射与共享)
其中 RPL 是请求特权级,当访问一个段时,处理器要检查 RPL 和 CPL(放在 cs 的位 0 和位 1 中,用来表示当前代码的特权级),即使程序有足够的特权级(CPL)来访问一个段,但如果 RPL(如放在 ds 中,表示请求数据段)的特权级不足,则仍然不能访问,即如果 RPL 的数值大于 CPL(数值越大,权限越小),则用 RPL 的值覆盖 CPL 的值。而段选择子中的 TI 是表指示标记,如果 TI=0,则表示段描述符(段的详细信息)在 GDT(全局描述符表)中,即去 GDT 中去查;
2023-10-30 11:30:59
324
原创 Lab6(信号量的实现和应用)
另外,上面的函数表明 Linux 0.11 提供了这样的接口:用 sleep_on() 实现进程的睡眠,用 wake_up() 实现进程的唤醒。在删除该信号量时,需要删除该信号量的名字并将该信号量所占的数组位置标记为可用。wake_up() 的功能是唤醒链表上睡眠的所有进程。生产者消费者程序,在删除信号量后,上面结果显示消费者进程不知有的已经被其他消费者进程消费,还在重复消费,程序执行混乱。我们可以用开关中断的方式实现原子操作,而调用 sleep_on() 和 wake_up() 进行进程的睡眠和唤醒。
2023-10-30 11:26:35
302
原创 利用300行代码实现文件系统
本篇博客是基于下面的博客写成的,有兴趣可以去阅读下面博客300行代码带你实现一个Linux文件系统unsigned);filldir_t是一个函数指针类型,它用于定义目录项填充函数的签名。一个指向结构的指针,用于协助填充目录项的信息;目录项的名称;目录项的名称长度;目录项的偏移(loff_t 类型),通常用于文件系统内部的追踪。目录项的 inode 号(u64 类型),表示目录项关联的 inode。
2023-10-15 18:08:21
633
原创 哈工大操作系统配套实验Lab5( 基于内核栈切换的进程切换)
现在的 Linux 0.11 采用 TSS和一条指令就能完成任务切换,虽然简单,但这指令的执行时间却很长,在实现任务切换时大概需要 200 多个时钟周期。而通过堆栈实现任务切换可能要更快,而且采用堆栈的切换还可以使用指令流水的并行优化技术,同时又使得 CPU 的设计变得简单。所以无论是 Linux 还是 Windows,进程/线程的切换都没有使用 Intel 提供的这种 TSS 切换手段,而都是通过堆栈实现的。本次实践项目就是将 Linux 0.11 中采用的 TSS 切换部分去掉,取而代之的是基于堆栈的切
2023-10-14 08:15:00
454
原创 哈工大操作系统配套实验Lab4(进程运行轨迹的跟踪与统计)
单进程与多进程编程的最大区别就是要考虑切换之间的开销,因为单进程没有优先级调度之说,它就是在一个接着一个顺序执行,遇到IO会进行等待,而多进程是将原本单进程IO等待时间用来执行其他进程,这就导致我们要考虑如何调度才能使得多个进程尽可能的多使用CPU,而减少等待时间。时间片的初始值是进程0的priority,是在linux-0.11/include/linux/sched.h的宏 INIT_TASK中定义的,如下:我们只需要修改宏中的第三个值即可,该值即时间片的初始值。将时间片增大,进程之间的切换会较少。
2023-10-11 18:27:27
741
1
原创 内核模块进行高负载处理
根据内核的版本去设置OS_VER的值,需要对应。刚开始初始为UNKNOWN,当查到内核版本不为4.15.0-39-generic时,将OS_VER改为UBUNTU_1604。
2023-10-09 17:54:45
334
原创 Linux_0.11源码学习阅读(壹)
本来想阅读当前我正在使用的Linux系统源码,但代码实在过于繁杂,查找很不方便,所以就分析linux0.11的源码,查找确实方便了,但很多新策略没有,之前学习的内核双链表就没有查找出来,有能力大家可以阅读较新的源码,后续还未完成,待更新。
2023-10-05 22:40:41
205
原创 哈工大操作系统配套实验Lab9(proc文件系统的实现)
正式的 Linux 内核实现了 procfs,它是一个虚拟文件系统,通常被 mount(挂载) 到 /proc 目录上,通过虚拟文件和虚拟目录的方式提供访问系统参数的机会,所以有人称它为 “了解系统信息的一个窗口”。这些虚拟的文件和目录并没有真实地存在在磁盘上,而是内核中各种数据的一种直观表示。虽然是虚拟的,但它们都可以通过标准的系统调用(open()、read() 等)访问。……Linux 的很多系统命令就是通过读取 /proc 实现的。
2023-10-05 16:19:52
259
原创 Lab8(终端设备的控制)
在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“*”。用户再按一次 F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。将F12转义成转义字符序列 [ [ L , 对F1-F12处理类似 [ [ A -> [ [ L具体按下F12结果如下图没有把向文件输出的字符过滤,只是通过修改con_write函数将字符的回显修改了。过滤向文件输出的字符可以通过修改file_write函数来实现。
2023-10-04 12:00:49
144
原创 哈工大操作系统配套实验(Lab1~Lab3)
相信很多同学都被推荐看李治军老师的操作系统课程,李老师在课上也反复强调要做相关的配套实验,否则学习效果不会太好。对于我本人来言,代码编程能力不是很强,这几个实验里很多代码都是参照网上一些代码修改而成,但真认真做完这几个实验,感觉对我的收获还是很大的,写下这些博客希望可以对后来的同学有所帮助。望诸君共勉。
2023-09-27 14:53:13
639
原创 计算机网络知识学习(一)
什么是ip?我们知道,在Internet上有千百万台主机,为了区分这些主机,人们给每台主机都分配了一个专门的地址,称为IP地址。通过IP地址就可以访问到每一台主机。IP地址由4部分数字组成,每部分都不大于256,各部分之间用小数点分开。例如“百度搜索”主机的IP地址就是:“119.75.217.109,”在浏览器上输入这个IP地址,就可以访问到百度的主页。我们的每个虚拟主机用户,都分配一个永久的IP地址。什么是域名?虽然可以通过IP地址来访问每一台主机,但是要记住那么多枯糙的数字串显然是非常困难的
2020-10-13 22:03:29
239
原创 数据结构与算法简单了解(线性表)
线性表零个或多个数据元素的有限序列线性表的两种表示形式顺序表示(其实就是数组)链表表示线性表的顺序存储结构可以用一维数组来实现顺序存储结构#define MAX 10typedef int Elemtype;struct List { Elemtype data[MAX];//数组存储数据元素,最大值MAX int length; //线性表当前长度};线性表的链式存储结构List item在这里插入代码片...
2020-09-14 20:51:28
205
转载 Ubuntu18.04初次连接外接显示器
问题描述打开ubuntu,发现外接显示器只显示鼠标,其他都是黑屏,笔记本可以正常显示画面解决方案第一步打开软件和更新第一步
2020-09-14 17:28:31
3148
原创 Windows10安装Ubuntu双系统及卸载Ubuntu
第一步选择系统的镜像,我选择的是Ubuntu发行版第二步制作启动盘,利用rufus制作,第三步磁盘分区第四步关闭Secure Boot第五步进入u盘启动第六步开始安装第七步安装位置
2020-09-12 21:08:02
2145
原创 暑期测试题1---总结
1.阅读下面代码段,回答问题以下代码段存在问题, 请在不修改结构体定义,不减少功能的前提下对此对此代码 中存在的问题进行修改并说明修改原因。修改正确后,写出输出结果并说明原因将注释加入程序, 能正确运行吗, 如果能, 输出结果是什么, 并说明原因sizeof(A)的结果是什么,为什么,再定义一个int类型的t3, 定义的位置影响结果吗, 说明理由。typedef struct tag_unimportant{ char*t2; int t1; }A;void fun
2020-07-26 15:42:06
169
原创 C语言课程设计(影院电影信息管理系统)
课程设计文件操作文件读取Linklist *read(){ Linklist *ghead,*r,*p; FILE *fp; char name[40]; printf("\n请输入要打开的文件名:"); scanf("%s",name); if((fp=fopen(name,"rt"))==NULL) { printf("\n读写文件出错,按任意键退出!\n"); printf("请创建链表\n"); system("read"); return 0; } g
2020-07-18 20:38:21
10284
7
原创 哲学家就餐问题(锁问题)
问题有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一支筷子。哲学家有2个状态,思考或者拿起筷子吃饭。如果哲学家拿到一只筷子,不能吃饭,直到拿到2只才能吃饭,并且一次只能拿起身边的一支筷子。一旦拿起便不会放下筷子直到把饭吃完,此时才把这双筷子放回原处。如果,很不幸地,每个哲学家拿起他或她左边的筷子,那么就没有人可以吃到饭了。思路方法1最直接的方法void philosopher(int i){ while(TRUE) { think();
2020-06-06 12:51:18
568
1
原创 《深入理解计算机系统》(计算机系统漫游)
计算机系统漫游最近在看深入理解计算机系统,先总结一下自己对第一章的理解//hello 程序#include<stdio.h>int main(){ printf("hello world");}信息以上面的hello程序为例 ,它的生命周期是从源程序开始的源程序:由值0和1组成的位(比特)序列;8个位是1组,1组被称为字节上面的程序是以字节序列的方式存储到...
2020-04-11 11:14:26
213
原创 《鸟哥Linux》私房菜-第七章
数据超级区块:记录此文件系统的整体信息inode:记录文件的属性,数据区块:文件的内容文件系统的简单操作dfdf-hdf-idudu-s文件系统的挂载mount挂载xfs文件系统文件系统卸载umount...
2020-03-10 15:49:08
127
原创 西邮Linux兴趣小组2017纳新试题总结
1.分析下列程序的输出int main(int argc, char *argv[]){ int t = 4; printf("%lu\n", sizeof(t--)); printf("%lu\n", sizeof("ab c\nt\012\xa1*2")); return 0;} sizeof(t--)计算int类型大小,输出为4; ab c占4个字...
2020-02-13 11:02:24
249
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅