`
longxj
  • 浏览: 101857 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
文章列表
当系统power on后,机器会访问0xfffffff,这段地址被硬件映射到rom,也就是bios的代码区。bios主要完成对硬件的测试(post)和初始化。完成后bios会将控制权交给bootloader,如果是从硬盘启动的话,bootloader是指硬盘的第一个扇区,也就是mbr。一般来说,mbr包含两个部分,一个是bootloader程序,还有一个是硬盘分区表。bootloader会选择一个active的分区,并加载active分区的第一个扇区,这个扇区的data,准确地说应该是代码负责载入内核。对于linux来说,2.4以及2.4以前linux的内核由内核映像和loader组成,2.6后 ...
linux下每个进程都有一个kernel stack,位于process descriptor的接下来的两个page frame(也可能会是一个,可以在编译内核时进行配置),包含一个kernel stack和thread_info。如果被用来执行kcp(kernel control path)的进程的thread_union(kernel statck和thread_info的union结构)的大小为8k,则系统使用进程的kernel stack来处理kcp;如果进程thread_union的大小为4k,则使用每个cpu的一个hard IRQ stack和soft IRQ stack用来处理相应 ...
并不是所有的进程结束后都会进入EXIT_ZOMBIE,如果一个进程结束的状态码(exit_signal)是-1,那么它结束后将会释放所有占有的资源,并将状态改为EXIT_DEAD(当这个进程没有被其它进程trace的情况下,如果被其它进程trace,那么将发送一个信号给trace它的进程)如果一个进程的结束码不是-1,并且它没有被其它进程trace,那么运行结束后它将变为EXIT_ZOMBIE.之所以要有EXIT_ZOMBIE是因为父进程可能需要知道有关其子进程任务的执行情况,所以即使子进程结束了,也不能立即销毁它的process descriptor。2009/01/17 六
process 0:idle process也叫swapper process,对于每个cpu都有一个。它创建了process 1,然后就运行cpu_idle()函数 process 1:init process,所有其它进程的父进程 其他内核线程: keventd,kapmd,kswapd,pdflush,kblockd,ksoftirqd 2009/01/17 六
TSS(task state segment),本来是用来存储process的状态信息的,使用单独的一个segment来实现。tr寄存器是用来存储TSSD选择子的寄存器,它跟其它段寄存器一样也 有nonprogrammable的field:base和limit field of the TSSD.intel最初的设计是每个进程一个tss段,用于保存process切换时硬件上下文的保存。但是linux,对于每个cpu只分配一个tss段,跟 intel的本意不一致。另外intel提供process切换的硬件指令,但是自从2.6.xx后,linux使用基本的指令来实现process的切换,而不是用 ...
linux提供3个system call来创建进程:clone(),fork(),vfork(),其中fork(),vfork()在实现上是通过调用clone()来进行的。而clone()在底层上是通过调用do_fork()来实现的。 do_fork()主要包括以下几个步骤: 1.首先是从pid bitmap中找到一个合适的pid 2.拷贝父进程的process descriptor(通过copy_process()函数) 3.然后根据各种flag决定父进程和子进程的运行状态:是先运行父进程,还是子进程?要不要将父进程或者子进程的状态置为stop等等? 2009/01/17 六
为了能快速地将pid转为process descriptor的对应指针,linux维护了4个hash table,采用4个hash table的原因是因为对于每个进程,有4种不同意义的pid: 1.pid (进程的pid) 2.tgid ( pid of thread group leader process) 3.pgid ( pid of the group leader process) 4.sid ( sid pid of the session leader process) hash table 所采用的hash function,代码如下: unsigned long ...
linux process有以下几种状态: 1.TASK_RUNNING 2.TASK_INTERRUPTIBLE 3.TASK_UNINTERRUPTIBLE:这个跟上个状态的不同的地方在于处于这种状态的process是不可以被signal唤醒的 4.TASK_STOPPED 5.TASK_TRACED(当进程被debbuger停止时) 6.EXIT_ZOMBIE:当进程的父进程未进行wait()或waitpid()系统调用时 7.EXIT_DEAD 处于EXIT_STOPPED,EXIT_ZOMBIE,EXIT_DEAD的进程不处于任何队列中,而是由其父进程进行处理。 处于 ...
linux总用有四种page table: 1.page global directory 2.page upper directory 3.page middle directory 4.page table 对于非PAE的32位地址,linux采用的是两级页表,2和3页表不使用,但是代码仍然在,只是将相应的entry置为适当的值。 对于PAE的34位地址,linux采用3中,page global directory对应80x86的page directory pointer table,page middle directory对应80x86的page directory p ...
当cpu运行一个kernel thread的时候,kernel会将cpu_tlbstate(这是个per-cpu变量)设为TLBSTATE_LAZY,这样当一个interprocessor interrrupt到达时,cpu将不会flush它的tlb ,直到cpu被切换到另一个普通进程,如果这个进程使用的page table 跟前一个进程不一样,则自然会flush TLB,如果这个进程跟前一个进程(也有可能就是前一个进程)使用的pagetable一样,则会flush 非全局tlb项。(也就是内核线性地址)附注:kernel thread没有自己的page table,它使用的是上一个运行的进程的 ...
intel有关分页的寄存器是形如cr(x)的命名,在linux中的采用的是2级页表,分为page directory和page table两种,对于一般的分页,一个线性地址被分为3部分: directory[10]table[10]offset[12] 但是对于pentium处理器,还有一种extending page,page frame可以为4m,所以每个线性地址被按如下方式进行解释: directory[10]offset[22] 每个directory指向一个4m大小的page frame。 每个page directory和page table的结构都是一样的: 1.pre ...
为了能将线性地址快速地转换到物理地址,TLB(translation lookaside buffer)缓冲了当前经常被使用的线性地址对应的物理地址。多个cpu的tlb不需要进行同步,因为 不同cpu上运行的是不用的进程,也就是说他们相同的线性地址对应的物理地址是不同的,所以不需要进行同步。当cpu上的进程发生切换时,只需要修改cr3寄存器就可以让整个TLB失效 linux默认情况下对cache采用的是使用cache,并且使用write-back写策略。 2009/01/13 二
linux常用的段选择子有4个: 1.user code segment 2.user data segment 3.kernel code segment 4.kernel data segment 所有的这四个段选择子的属性共同点: base:0x00000000 G:1 limit:0xffffff S:1 D/B:1 P:1 user code 和 kernel code的type为10 user data 和kernel data的type为2 user code和user data的DPL为3 kernel code 和 kernel data的DPL为3 从上 ...
GDT每个CPU都会有一个,LDT是GDT里的一项,所以访问LDT是先要访问GDT的有关LDT的一项 intel提供6个段寄存器cs,ss,ds,es,fs,gs。还有两个相关的寄存器gdtr和ldtr,用来存放全局描述符表和当前活动局部描述符表的基地址。 cs:code segment de:data segment ss:stack segment es,fs,gs是通用段寄存器,每个段寄存器还对应着一个64的不可编程寄存器,用来存放每个对应段选择子的段描述符。当段寄存器的内容被改变后,相应的不可编程寄存器会被重新载入对应的段描述符,以便能快 速地将逻辑地址转为线性地址。 其中 ...
在使用linux做为关键应用的过程中,特别是大压力负载的时候,经常会遇到一些诸如“too many open files”,“系统默认最大线程数是多少?如何调整?”等问题。此时,我们就必须使用ulimit或proc去调整系统的某些参数。一、区别ulimit和对proc目录都可以作出某些限制,但它们之间是有区别的:1、ulimit命令:1)直接使用ulimit命令,只对当前tty(终端有效),若要每次都生效的话,可以把ulimit参数放到对应用户的.bash_profile里面;2)针对所有用户的设置,在/etc/security/limits.conf文件,其是可以对系统用户、组进行cpu、文件 ...
Global site tag (gtag.js) - Google Analytics