自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Intel MultiProcessor Specification v1.4学习心得

做一些解释,a.首先是EBDA,有EBDA那之前肯定有BDA(BIOS Data Area),BDA位于0x400处,即中断向量表之后,EBDA的段地址位于0x40E处,比如我的电脑上运行bochs后0x40E处的值是0x9fc0,所以EBDA位于0x9fc0:0处,也就是639k处。当然,对于如何确定主cpu的算法,那是芯片制造者的工作,对于操作系统编写者,我们只需要知道,当BIOS初始完之后,这些已经完成了,BIOS把cpu的信息按照一定格式放到了内存中的某个地方,我们的任务就是把这些信息提取出来。

2023-11-29 14:04:30 857 1

原创 Linux 1.0 __get_free_page函数的一点理解

在0.11版本中,get_free_page负责分配内存,如果没用空闲内存了,就返回0。这种做法是不留一点余量,万一有特别紧急的任务需要内存,结果却用光了,这就不好了。我们知道,大到一个国家,小到一个家庭,都要留一些储备资源。国家有储备粮、储备肉什么的,平时不会用,紧急情况下国家才会调动储备资源来平息问题。家庭也一样,也要留一些救命钱。平时困难时宁可吃糠咽菜也不动,只有万分需要时才能动用。内存作为一项非常重要的资源,我们也要采取措施留一些储备。在1.0中,一部分内存被分割成储备内存,一般情况下不会用,se

2022-08-25 09:16:54 550 1

原创 自己动手格式化虚拟硬盘,建立文件系统

Linux里硬盘操作部分主要功能是可以让我们随意读写硬盘的任何一个扇区。当我们完成硬盘操作后(hd.c,ll_rw_blk.c,buffer.c。其中hd.c负责硬盘操作,ll_rw_blk.c负责将IO操作排队,buffer.c负责发送和接收硬盘的数据)后,就可以考虑文件操作了。硬盘在使用前要格式化(不是低格,低格是厂家的事),格式化主要有两个目的,一个是创建分区,另一个是建立文件系统。Linux 0.11采用的是古老的Minix文件系统,那我们就把硬盘格式成Minix形式。但问题是,现在操作系统都没

2022-05-20 14:32:11 577

原创 修改 Linux 0.11 的 switch_to 宏实现任务软切换

Linux 0.11 任务切换 swithc_to 最主要的语句是通过 ljmp 到一个任务段来实现的,当 ljmp 一个任务段的时候,CPU 会把任务相关的信息存到本任务的 TSS 区域内,然后把新任务的 TSS 区域内信息放到对应的寄存器内(包括 cs 及 ip),然后从新任务的 cs:ip 位置开始执行。早期的任务切换都是通过这种硬件方式,但这种切换所需时间太长,因为要保存的信息中,其实很多我们用不上,没必要保存加载。现在的任务切换都是操作系统自己实现,不通过 CPU,即软切换。理解了任务切换的本质之

2022-04-12 10:23:13 388

原创 Linux线程是轻量级进程的理解

我们知道,Linux中线程是轻量级进程,但这句话怎么理解呢?就像现在小孩子都知道地球是圆的,但那只是别人告诉他的,他自己是没有感觉的。fork主要做了什么?我们知道,schedule函数按照一定策略从任务链表里中选出一个进行切换(早期是任务数组task[NR_TASKS],现在linux内核不采用任务数组,而是采用链表形式,这样就不会受到NR_TASKS最大任务数限制了)。所有fork的本意就是在创建一个task_struct 变量,然后填充结构体里面的内容,包括各寄存器的值,设置内核栈,复制原页表信息

2021-10-11 16:58:12 285 1

原创 Linux 1.0 kmalloc一点理解

/* It seems VERY unlikely to me that it would be possible that this loop will get executed more than once. */tries = MAX_GET_FREE_PAGE_TRIES; while (tries --) { /* Try to allocate a "recently" freed memory block */ cli (); if ((page =

2021-09-30 17:05:30 87

原创 关于linux 线性地址和物理地址的关系

lgdt,idt 指令之后调用的是物理地址还是线性地址?早期内核编译后线性地址和物理地址一样(0.11中 通过链接选项-Ttext 0,将内核开始代码线性地址设为0,启动后实际开始代码也在物理内存0,两者一样。1.0版本中,-Ttext 0x1000,将内核开始代码线性地址设为0x1000,即1M处。启动后,把内核代码也挪到了1M处),所以lgdt gdt_descr, gdt_descr的线性地址和物理地址是一样的。2.4版本不一样了(什么时候开始不一样不知道,因为中间版本没看过)。2.4版本中,-Tt

2021-08-25 14:23:42 179

原创 Linux进程间能否利用信号传递指针

看《linux c编程实战》,第9章习题8提到有没有可能在进程间传递指针。我的理解是不能。因为进程的地址都是虚拟地址,只对本进程有意义,把地址数据传到另一个进程,我猜测有两种情况:1.第二个进程中这个地址不存在,会引起访问违规错误;2.凑巧第二个进程这个地址存在,那引用的也是第二个进程中的数据,不会是第一个进程的数据。总得来说,进程之间不能直接互相访问。...

2021-07-29 17:12:36 224

原创 Linux 0.11学习笔记

关于sleep_on()函数的一点疑惑void sleep_on(struct task_struct **p){struct task_struct *tmp;// 若指针无效,则退出。(指针所指向的对象可以是NULL,但指针本身不应该为0).另外,如果// 当前任务是任务0,则死机。因为任务0的运行不依赖自己的状态,所以内核代码把任务0置为// 睡眠状态毫无意义。if (!p) return;if (current == &(init_task.task)) panic("t

2021-04-13 13:29:00 113

原创 Linux 0.11源代码学习

自己动手写一遍Linux 0.11。在进入到 init 0后,手工实现了第二任务,并和init下一步计划:实现fork()我们目前都是在内核空间640kb内运行,包括我们创建的用户级任务。所以fork()一开始先写的简单些,跟手工创建任务一样,即创建一个任务结构,用目前任务的数据填充新创建任务结构里的数据,并把新结构指针放到任务指针数组里tasks[n]里。然后设置GDT里对应的TSS和LDT段描述符。设置完成后,通过时钟中断里调用任务调度程序,就可以实现任务运行。真的的fork()还涉及到内存管理

2021-01-11 15:47:45 353 1

原创 Linux0.11学习笔记

Linux 0.11代码学习任务切换**目前状态:**中断程序已设置,第一个任务 init_task已初始化(sched.c),main()函数里通过move_to_user_mode()进入到Task 0。目的:手工创建第二个任务 Task 1,并和Task 0不停切换。做法:在sched.c 创建第二个任务结构,所有值采用第一个:union task_union{struct task_struct task;char stack[PAGE_SIZE];//(内核堆栈0)};//第一

2021-01-05 14:47:47 220

空空如也

空空如也

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

TA关注的人

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