- 博客(14)
- 收藏
- 关注
原创 Linux0.11内核源码分析——内核信号量
在执行系统调用进入内核态的时候,CPU会在该进程的内核态堆栈上面压入用户程序的SS和ESP,EFLAGS,还有下一条指令所在的CS和EIP。在来看用户态堆栈的栈顶为sa_restorer的地址,所以在信号处理程序执行完,执行ret指令的时候就会返回到栈顶的地址中也就是sa_restorer的地址,在这个程序里面就需要把信号处理程序中改变的寄存器的值恢复成执行系统调用后一条语句的环境,其实就是一直调用pop,之后再执行ret,跳转到old_eip的地址去,也就是原先保存的下一条语句。
2023-09-22 21:32:49
128
原创 GNU C语言扩展
attribute__是GCC编译器提供的一种语法扩展,用于指定变量、函数、结构体等的属性。通过__attribute__可以告诉编译器一些额外的信息,从而优化代码或生成更好的代码。attribute 书写特征是:attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。attribute 语法格式为:attribute ((attribute-list))这个属性告诉编译器取消结构体中成员之间的内存对齐,使得结构体的大小最小。
2023-09-21 20:21:26
73
原创 linux-3.4.2内核源码分析——(二)内核启动流程
并且在linux移植的时候也要对该结构体的变量进行赋值。我们可以查看一下arch.info.init这段内存到底存了些什么,搜索arch.info.init会找到上面提到过的宏定义#define MACHINE_START(_type,_name)。由此可知这些板子的结构体machine_desc都放到了arch_info_begin到_arch_info_end这段内存当中。上面代码的_arch_info_begin和 _arch_info_end会指向链接文件vmlinux.lds.S中的一段代码。
2023-09-14 19:54:51
159
1
原创 linux-3.4.2内核源码分析——(一)操作系统的引导和启动程序
需要注意的一点是在ARM的user模式下,ARM CPU有16个数据寄存器,被命名为R0~R15(这个要比X86多一些),它们均为32位寄存器,其中的R13~R15有特殊用途。磁盘引导块程序,在磁盘的第一个扇区中的程序(0磁道0磁头1扇区)作用:首先将后续的setup.s代码从磁盘中加载到紧接着bootsect.s的地方。由PC机的BIOS (OXFFFFO是BIOS存储的总线地址)把bootsect从某个固定的地址拿到了内存中的某个固定地址(0x90000),并且进行了一系列的硬件初始化和参数设置。
2023-09-14 15:10:51
137
1
原创 linux-0.11内核源码分析——(四)操作系统进程销毁
但该函数并没有杀死进程的意思。(3)如果当前要销毁的进程有子进程,那么就让1号进程作为新的父进程(init进程),如 果当前进程是一个会话头进程,则会终止会话中的所有进程。(6)父进程一直在wait_pid,直到子进程发来信号后,父进程才将其task_struct等变量清除,终止进程的僵死状态。(5)父进程在运行子进程的时候一般都会运行wait waitpid这两个函数(父进程等待某个子进程终止的),4.pid<-1 给进程组号为-pid的进程组发送信号,例如pid=-4则向租号为4的进程组发送。
2023-09-11 12:09:51
189
原创 汇编:AT&T与NASM的区别
NASM语法 mov eax,51h;AT&T语法:Movl $51h, %eax;NASM是前面是寄存器,后面是数据,AT&T是数据在前数据,后面是寄存器;主要由GNU汇编器,gcc编译器条件中,Linux通常会使用这种形式.。这两种生成机器语言是完全一样的,只是在风格上存在一些差异;NASM格式许多用于windows汇编器和调试器.。AT&T在寄存器前面使用%符号,NASM不需要.。AT&T数据前面使用$符号,NASM不需要.。AT&T处理内存引用的方式与NASM不同.。
2023-09-11 11:16:46
112
原创 linux-0.11内核源码分析——(三)内核进程切换与进程调度
例如,父进程等待子进程结束时会wait_pid,也就是说在子进程结束的时候会给父进程发送一个signal的信号,父进程收到信号后,就会退出wait_pid函数,执行下面代码。当进程进行切换的时候,将新进程的tss描述符放到段地址寄存器中,将原来进程执行时cpu中的一些值保存到原tss段中,再将新的tss段载入到cpu里面去。说起进程的切换,先说一下进程的一共有哪些状态,如下,在Linux中定义了进程的5种状态,在stack_struct结构体中的state就是用来表示这个进程的运行状态。
2023-09-09 19:16:02
117
1
原创 linux-0.11内核源码分析——(二)内核进程初始化与创建
copy_mem用来组装堆栈,set_tss_desc,set_ldt_desc用来设置,进程状态描述符,局部表述符,这样一个进程就组装好了。CPU运行多个进程时,因为这些寄存器在CPU中都是唯一的,当CPU运行完进程1后就会将所有寄存器的值存储到这个结构体tss_struct中,然后再运行进程2。进程的创建其实是一种系统调用,是对0号进程或者当前进程的复制,就是结构体的复制,简单来说就是吧task[0]的task_struct结构体复制一份给新创建的进程,并且当进程创建的时候要复制原有的栈堆。
2023-09-06 18:34:21
193
1
原创 linux-0.11内核源码——(一)内核进程调度分析
进程的调度就是task_struct[n]链表的检索,去找时间片最大的任务调用(长任务优先算法)。JIFFIES是一个系统的时钟滴答,一个系统滴答是10ms ,定时器10ms一个滴答-->每隔10ms会引发一个定时器中断。进程的创建使用等都是在和task_struct这个结构体打交道,进程的创建就是创建一个task_struct对象,然后再对该对象赋值。CPU内部有一个RTC,会在上电的时候调用nktime函数算出从1970年1月1日0时开始到当前开机点所过的秒数给MKTIME函数传来的时间结构体的赋值。
2023-09-05 10:35:53
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人