读书-Linux内核设计与实现 一

内核一般处于系统态,其拥有受保护的内存空间和访问硬件设备的所有权限,这种系统和被保护起来的空间,被称为内核空间,相对而言,应用程序处于用户空间,应用程序通过系统调用和内核进行通信。应用程序通过调用相应的库函数(如C库函数),再由库函数通过系统调用界面让内核代其完成各种不同的任务。如printf函数最后是通过write()系统调用把处理后的最终数据写在终端的。

处理器在任何指定时间点上的活动范围可以为以下三者之一:1、运行于内核空间,处于进程上下文,代表某个特定的进程执行;2、运行于内核空间,处于中断上下文,与进程无关,处理某个特定的中断;3、运行于用户空间,执行用户进程;

CPU空闲时,内核就运行一个空进程,处于进程上下文,但运行于内核空间。

内核编程与应用程序开发的区别:

内核编程时不能访问C库,必须使用GNU C

内核编程时缺乏像用户空间那样的内存保护机制,很难使用浮点数,且只有一个很小的定长堆栈,由于其支持异步中断、抢占和SMP,故必须时刻注意同步和并发。

每个线程都拥有一个独立的程序计数器、进程和一组进程寄存器,内核调度的对象是线程,而非进程。创建新的进程都是为了立即执行新的、不同的程序,而接着调用exec*()这类函数以创建新的地址空间,并把新的程序载入。在Linux内核中,fork()实际上是由clone()系统调用实现的。

在内核中,访问任务通常需要获得指向其task_struct指针,实际上,内核中大部分处理进程的代码都是直接通过task_struct进行的,不同的硬件体系,获得该指针的方法不同,在X86系统中,通过在内核栈的尾端创建thread_info结构,通过计算偏移间接地查找task_struct结构(其包含一个进程所有的信息)

Fork()使用了写时拷贝的技术,写时拷贝是一种可以推迟甚至免除数据的技术。内核此时并不复制整个进程地址空间,而是让父子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值