《嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf》由会员分享,可在线阅读,更多相关《嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查).pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)查)虽然写操作系统的博客要比写普通的技术点要麻烦一些,但是心中还是挺开心的。一方面,通过几行代码就可以说明一些问题,把理论实践化,这本身就很具有挑战性;另外一方面还锻炼自己的沟通能力,让更多的人明白你的想法,认可你的想法。其实,通过上面一篇博客,我们就已经清楚任务的创建是怎么一回事,但是我们还是愿意就这个问题讲得更细一点,说得更多一点。系统本身是多线程的,那说明所有线程的地址空间都是共享的。由于资源都是操作系统本身提
2、供的,所以线程本身的要求就很低,函数名、堆栈、入口点、堆栈大小、优先级,大体上也就是这么多。至于这个堆栈是哪里的内存,其实已经不太重要了。为了简单起见,我们对原来的初始化函数 稍微修改了一下,cpp view plaincopy 1.void task_init()2.3.UINT32 unit=STACK_LENGTH;4.5.memset(void*)data,0,STACK_LENGTH*sizeof(UINT32);6.dataunit-1=(UINT32)hello;7.dataunit-2=0;8.dataunit-3=0;9.dataunit-4=0;10.dataunit-5=
3、0;11.dataunit-6=0;12.dataunit-7=0;13.dataunit-8=0;14.dataunit-9=0;15.dataunit-10=(UINT32)&dataunit-9;16.new=(UINT32)&dataunit-10;17.上面的操作比较简陋,只是对堆栈进行了设置。这是线程初始化的时候必须要做的一步。当然,这里的 hello 就是我们的函数入口点。因为这里用 SIGALRM 代替的时钟中断是没有办法做到抢占的,所以我们可以人为多设置一些调度点,比如象这样,cpp view plaincopy 1.void hello()2.3.printf(count=
4、%d in sub!n,count+);4.swap(&new,&old);5.printf(count=%d in sub!n,count+);本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 6.swap(&new,&old);7.printf(count=%d in sub!n,count+);8.swap(&new,&old);9.printf(count=%d in sub!n,count+);10.swap(&new,&old);11.printf(count=%d in sub!n,count+);12.quit=1;13.swap(&new,&old)
5、;14.在编写程序的时候,最恐怖的事情就是堆栈溢出了。但是在操作系统中,我们完全可以自己判断当前的堆栈是否已经溢出。因为我们知道,在线程调度的时候,保存的堆栈 esp永远指向最低的那个地址。cpp view plaincopy 1.int check_stack_overflow(unsigned int base,unsigned int current)2.3.assert(0!=base&0!=current);4.5.return(current base)?1:0;6.当然,这些说的都是线程调度的事,你也可以编写输入输出命令,实现对嵌入式操作系统的某种控制。要打印什么,设置什么,保存
6、什么,都可以通过你的输入命令来解析执行,这些都是和 signal 处理是分开来的。后面这部分还要详细讨论,这里可以稍微添加一下,cpp view plaincopy 1.int main()2.3.char val;4.5.task_init();6.set_timer();7.signal(SIGALRM,signal_handler);8.9.while(1)10.11.scanf(%c,&val);12.13.14.exit(0);15.return 1;16.本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 最后,还是老规矩,附上详细的代码。虽然这一过程有点繁
7、琐和冗余,但是至少看上去更完整一些。cpp view plaincopy 1.#include 2.#include 3.#include 4.#include 5.#include 6.#include 7.8.#define UINT32 unsigned int 9.#define STACK_LENGTH 512 10.11.static struct itimerval oldtv;12.UINT32 old=0;13.UINT32 new=0;14.UINT32 count=0;15.UINT32 dataSTACK_LENGTH=0;16.UINT32 quit=0;17.18.
8、void set_timer()19.20.struct itimerval itv;21.itv.it_interval.tv_sec=1;22.itv.it_interval.tv_usec=0;23.itv.it_value.tv_sec=1;24.itv.it_value.tv_usec=0;25.setitimer(ITIMER_REAL,&itv,&oldtv);26.27.28.void swap(UINT32*prev,UINT32*next)29.30._asm(push%eaxnt 31.push%ebxnt 32.push%ecxnt 33.push%edxnt 34.p
9、ush%esint 35.push%edint 36.push%ebpnt 37.push%espnt 38.lea 0 x8(%ebp),%eaxnt 39.mov(%eax),%eaxnt 40.mov%esp,(%eax)nt 本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 41.42.lea 0 xc(%ebp),%eaxnt 43.mov(%eax),%eaxnt 44.mov(%eax),%espnt 45.pop%espnt 46.pop%ebpnt 47.pop%edint 48.pop%esint 49.pop%edxnt 50.pop%ecxnt
10、 51.pop%ebxnt 52.pop%eaxnt 53.:);54.55.56.void hello()57.58.printf(count=%d in sub!n,count+);59.swap(&new,&old);60.printf(count=%d in sub!n,count+);61.swap(&new,&old);62.printf(count=%d in sub!n,count+);63.swap(&new,&old);64.printf(count=%d in sub!n,count+);65.swap(&new,&old);66.printf(count=%d in s
11、ub!n,count+);67.quit=1;68.swap(&new,&old);69.70.71.void task_init()72.73.UINT32 unit=STACK_LENGTH;74.75.memset(void*)data,0,STACK_LENGTH*sizeof(UINT32);76.dataunit-1=(UINT32)hello;77.dataunit-2=0;78.dataunit-3=0;79.dataunit-4=0;80.dataunit-5=0;81.dataunit-6=0;82.dataunit-7=0;83.dataunit-8=0;84.datau
12、nit-9=0;本文由长春白癜风专科医院 http:/ 本文由吉林白癜风医院 http:/ 85.dataunit-10=(UINT32)&dataunit-9;86.new=(UINT32)&dataunit-10;87.88.89.int check_stack_overflow(unsigned int base,unsigned int current)90.91.assert(0!=base&0!=current);92.93.return(current base)?1:0;94.95.96.void signal_handler(int m)97.98.if(0=quit)99.
13、100.swap(&old,&new);101.assert(0=check_stack_overflow(data,new);102.return;103.104.105.printf(count=%d in main!n,count+);106.107.108.int main()109.110.char val;111.112.task_init();113.set_timer();114.signal(SIGALRM,signal_handler);115.116.while(1)117.118.scanf(%c,&val);119.120.121.exit(0);122.return 1;123.