﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-星光灿烂-随笔分类-读书</title><link>http://www.cppblog.com/agaric/category/4878.html</link><description>C元素</description><language>zh-cn</language><lastBuildDate>Sat, 24 May 2008 16:06:58 GMT</lastBuildDate><pubDate>Sat, 24 May 2008 16:06:58 GMT</pubDate><ttl>60</ttl><item><title>读《Linux 内核设计与实现》</title><link>http://www.cppblog.com/agaric/archive/2008/03/06/43779.html</link><dc:creator>菌子</dc:creator><author>菌子</author><pubDate>Wed, 05 Mar 2008 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/agaric/archive/2008/03/06/43779.html</guid><wfw:comment>http://www.cppblog.com/agaric/comments/43779.html</wfw:comment><comments>http://www.cppblog.com/agaric/archive/2008/03/06/43779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/agaric/comments/commentRss/43779.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/agaric/services/trackbacks/43779.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <h1>第二章 从内核出发</h1> <p>&nbsp;</p> <h3>内核开发特点： </h3> <ol> <li>没有libc库。 kernel是一个不依赖任何库的，包括标准C函数库。kernel中使用的一些常见函数，比如memset, strcpy都是在kernel代码中自己实现的。  <li>请使用gcc来编译内核，因为内核中的代码并不完全符合ANSI C的标准。  <li>没有内存保护，非法的内存操作可能会使系统挂起。  <li>不要使用浮点数  <li>内核栈容量很小（ 2 * 页面大小 ）  <li>linux是抢占多任务操作系统，进程，内核都可以抢占，而且支持多处理器，所以内核代码需要考虑并发和同步的问题。  <li>尽量要兼容所有架构(arch)，良好的移植性</li></ol> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <h1>第三章 进程管理</h1> <p>&nbsp;</p> <h3>内存描述符及任务结构</h3> <ol> <li>每个进程都对应有一个进程描述符，即task_struct结构，用来记录这个进程的所有信息：打开的文件，地址空间，进程状态……  <li>linux通过slab（个人感觉类似于pool）分配task_struct。 进程的task_struct指针存放在位于内核栈底的一个叫做thread_info的结构里面。  <li>内核通过PID来标识进程，默认设置最大值，即默认系统最大进程数为32768。内核中一般通过current宏来获的当前进程的task_struct,不同的体系架构下，实现方法可能会不同。  <li>进程状态，可以通过set_task_state来设置  <ol> <li>TASK_RUNNING 进程可执行；它正在运行，或者是在任务队列中等待被运行。  <li>TASK_INTERRUPTIBLE 进程可中断；进程被阻塞，但是可以通过信号，或者其他方法唤醒。  <li>TASK_UNINTERRUPTIBLE 进程不可中断；进程被阻塞，而且不受任何干扰，不会响应信号而被唤醒。  <li>TASK_ZOMBIE 进程僵死；进程已经运行完毕，但是父进程没有调用wait4系统调用，此时子进程的task_struct保留，等待父进程查询相关信息。【Agaric:相似的，在windows上，进程的HANDLE通过（CreateProcess或者OpenProcess得到） 在程序运行完毕后，在CloseHandle 前，也是仍然有效，用于查询进程相关信息，比如Exit code 等等】  <li>TASK_STOPPED 进程停止;</li></ol> <li>进程上下文： 进程通过系统调用或者异常陷入内核，此时内核是"代表进程"在工作，这个工作环境，叫做进程上下文，内核程序可以通过宏来获的当前进程的task_struct  <li>进程家族树： 除了init，每个进程都有父进程， 每个进程都可能有子进程及兄弟进程。</li></ol> <p>（待续）</p><img src ="http://www.cppblog.com/agaric/aggbug/43779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/agaric/" target="_blank">菌子</a> 2008-03-06 00:00 <a href="http://www.cppblog.com/agaric/archive/2008/03/06/43779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>