- 浏览: 101857 次
- 性别:
- 来自: 南京
最新评论
-
colorfire:
os.path.splitext(file)[1] 不就可以吗 ...
枚举文件夹所有后缀名,python脚本
文章列表
当系统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后 ...
- 2009-02-15 21:37
- 浏览 344
- 评论(0)
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用来处理相应 ...
- 2009-02-15 21:37
- 浏览 369
- 评论(0)
并不是所有的进程结束后都会进入EXIT_ZOMBIE,如果一个进程结束的状态码(exit_signal)是-1,那么它结束后将会释放所有占有的资源,并将状态改为EXIT_DEAD(当这个进程没有被其它进程trace的情况下,如果被其它进程trace,那么将发送一个信号给trace它的进程)如果一个进程的结束码不是-1,并且它没有被其它进程trace,那么运行结束后它将变为EXIT_ZOMBIE.之所以要有EXIT_ZOMBIE是因为父进程可能需要知道有关其子进程任务的执行情况,所以即使子进程结束了,也不能立即销毁它的process descriptor。2009/01/17 六
- 2009-02-15 21:36
- 浏览 480
- 评论(0)
process 0:idle process也叫swapper process,对于每个cpu都有一个。它创建了process 1,然后就运行cpu_idle()函数
process 1:init process,所有其它进程的父进程
其他内核线程:
keventd,kapmd,kswapd,pdflush,kblockd,ksoftirqd
2009/01/17 六
- 2009-02-15 21:28
- 浏览 601
- 评论(0)
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的切换,而不是用 ...
- 2009-02-15 21:27
- 浏览 479
- 评论(0)
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 六
- 2009-02-15 21:27
- 浏览 428
- 评论(0)
为了能快速地将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 ...
- 2009-02-15 21:26
- 浏览 668
- 评论(0)
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的进程不处于任何队列中,而是由其父进程进行处理。
处于 ...
- 2009-02-15 21:26
- 浏览 498
- 评论(0)
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 ...
- 2009-02-15 21:24
- 浏览 546
- 评论(0)
当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,它使用的是上一个运行的进程的 ...
- 2009-02-15 21:24
- 浏览 727
- 评论(0)
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 ...
- 2009-02-15 21:23
- 浏览 476
- 评论(0)
为了能将线性地址快速地转换到物理地址,TLB(translation lookaside buffer)缓冲了当前经常被使用的线性地址对应的物理地址。多个cpu的tlb不需要进行同步,因为
不同cpu上运行的是不用的进程,也就是说他们相同的线性地址对应的物理地址是不同的,所以不需要进行同步。当cpu上的进程发生切换时,只需要修改cr3寄存器就可以让整个TLB失效
linux默认情况下对cache采用的是使用cache,并且使用write-back写策略。
2009/01/13 二
- 2009-02-15 21:23
- 浏览 520
- 评论(0)
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
从上 ...
- 2009-02-15 21:22
- 浏览 472
- 评论(0)
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的不可编程寄存器,用来存放每个对应段选择子的段描述符。当段寄存器的内容被改变后,相应的不可编程寄存器会被重新载入对应的段描述符,以便能快
速地将逻辑地址转为线性地址。
其中 ...
- 2009-02-15 21:21
- 浏览 516
- 评论(0)
在使用linux做为关键应用的过程中,特别是大压力负载的时候,经常会遇到一些诸如“too many open files”,“系统默认最大线程数是多少?如何调整?”等问题。此时,我们就必须使用ulimit或proc去调整系统的某些参数。一、区别ulimit和对proc目录都可以作出某些限制,但它们之间是有区别的:1、ulimit命令:1)直接使用ulimit命令,只对当前tty(终端有效),若要每次都生效的话,可以把ulimit参数放到对应用户的.bash_profile里面;2)针对所有用户的设置,在/etc/security/limits.conf文件,其是可以对系统用户、组进行cpu、文件 ...
- 2009-02-15 21:18
- 浏览 932
- 评论(0)