资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式嵌入式 linuxlinux 编程期末考试编程期末考试1.makefile 的编写2.linux 的启动过程:P44(1)打开电源,CPU 进入实模式,并从地址 0xFFFF0000 开始自动执行程序代码,这时 BIOS 进行开机自检,并按 bios 的设置进行设备启动,接着启动设备上安装的引导程序 lilo 或 grub 开始引导linux,linux 获得启动权。(2)linux 进行内核引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。(3)执行 init 程序,init 程序调用了 rc.sysinit 和 rc 等程序,而 rc.sysinit 和 rc 在完成系统初始化和运行服务的任务后返回init。(4)Init 启动 mingetty,打开终端供用户登录系统,用户登录成功后进入 shell,这样就完成了系统的整个启动过程。3.Bootloader 的操作模式 P135(1)启动加载模式:这种模式也称为“自主”模式,即bootloader 从目标机上的某个固体存储设备上将操作系统加载到RAM 中运行,整个过程没有用户的介入。这种模式是 bootloader 的正常工作模式,因此当以嵌入式产品发布的时候,bootloader 必须工作在这种模式下。(2)下载模式:在这种模式下,目标机上的 bootloader 将通过串口或者网络连接或者其它通信手段从主机下载文件,比如:下载内核镜像和根文件系统镜像等。从主机下载的文件通常首先被bootloader 保存到目标机的 RAM 中,然后被 bootloader 写到目标机上的 FLASH 类固态存储设备中。Bootloader 的这种模式通常在第一次安装内核与根文件系统时使用;此外,以后的系统更新也会使用 bootloader 的这种工作模式。工作于这种模式下的 bootloader通常都会向它的中断用户提供一个简单的命令行接口。4.常用的进程通信方式有以下几种:P234(简答)(1)管道及有名管道:管道可用于具有亲缘关系进程的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进行间的通信。(2)信号:信号是在软件层次上对中断机制的一种模拟,用于通知进程有某件事发生。(3)消息队列:消息队列是消息的链接表,包括 Posix 消息队列、systemV 消息队列。(4)共享内存:最有用的进程间通信方式。(5)信号量:主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。(6)套接字:是一种更为一般的进程通信机制,可用于网络中不同机器之间的进程通信,应用非常广泛。5.linux 编译过程(1)预处理:编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。(2)编译:编译器会进行词法分析、语法分析,接着会把源代码翻译成中间语言,即汇编语言。(3)汇编:把作为中间结果的汇编代码翻译成了机器代码,即目标代码(4)链接:处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程6.内核支持 4 种不同的配置方法:(简答)(1)Make config:基于文本的最为传统的配置界面,不推荐使用。(2)Make menuconfig:基于文本选单的配置界面,字符终端下推荐使用。(3)Make xconfig:基于图形窗口模式的配置界面,Xwindow 下推荐使用。(4)Make oldconfig:自动读入“.config”配置文件,并且只要求用户设定前次没有设定过的选项。7.嵌入式系统的软件开发与通常软件开发的区别主要在编译和调试两部分:(1)嵌入式软件开发所采用的编译为交叉编译。即在一个平台上生成可以在另一个平台上执行的代码。因嵌入式系统的系统资源非常紧缺,所以嵌入式系统开发需要借助宿主机来编译出目标机可执行的执行代码。(2)嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试,调试器仍然运行在宿主机的通用操作系统之上,但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。8.wait 会令调用者阻塞直至某个子进程终止而 waitpid 则可以通过设置一个选项来设置为非阻塞.waitpid 并不是等待第一个结束的进程而是等待参数中 pid 指定的进程。/* waitpid.c */#include #include #include #include #include int main()pid_t pc, pr;pc = fork();if (pc #include #include #include #include #include #include int main()pid_t pid;int i, fd;char *buf = “This is a Daemonn“;pid = fork();/创建子进程,父进程退出if (pid 0)exit(0); openlog(“demo_update“, LOG_PID, LOG_DAEMON); setsid(); /在子进程中创建新会话chdir(“/“); /改变当前目录为根目录umask(0);/重设文件权限掩码for(i = 0; i #include #include #include #include #include #include #include int main()pid_t pid, sid;int i, fd;char *buf = “This is a Dameonn“;pid = fork(); if (pid 0)exit(0); openlog(“daemon_syslog“, LOG_PID, LOG_DAEMON); if (sid = setsid() #include#include#include#includeint main(void)int fd,size;char s = “HelloWorldn“;char buffer80;fd = open(“temp.log“, O_WRONLY | O_CREAT);if( -1 = fd ) printf(“Open or create file error!n“);exit(1);write( fd, s, sizeof(s) );close(fd);fd = open(“temp.log“, O_RDONLY );if(-1 = fd )printf(“Open ifle named“temp.log“failed.n“);exit(1);size = read( fd, buffer, sizeof(buffer) );close( fd );printf(“%s“,buffer);return 0;/* copy_file.c */#include #include #include #include #include #include #defineBUFFER_SIZE 1024/* ?D?o?D?DDD?*/#define SRC_FILE_NAME“src_file“/* ?t? */#define DEST_FILE_NAME“dest_file“ /* ?t?t? */#define OFFSET10240/* ?y?Y?D? */int main()int src_file, dest_file;unsigned char buffBUFFER_SIZE;int real_read_len;src_file = open(SRC_FILE_NAME, O_RDONLY);dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);if (src_file 0)write(dest_file, buff, real_read_len);close(dest_file);close(src_file);return 0;FIFO/* fifo_read.c */#include #include #include #include #include #include #include #include #define MYFIFO“/tmp/myfifo“#define MAX_BUFFER_SIZEPIPE_BUF /*?limits.h?D*/int main()char buffMAX_BUFFER_SIZE;int fd;int nread;/* ?D?D?1?D?T?*/if (access(MYFIFO, F_OK) = -1) if (mkfifo(MYFIFO, 0666) 0)printf(“Read %s from FIFOn“, buff);close(fd);exit(0);/* fifo_write.c */#include #include #include #include #include #include #include #define MYFIFO“/tmp/myfifo“/* D?1?t?*/#define MAX_BUFFER_SIZEPIPE_BUF /*?limits.h?D*/int main(int argc, char * argv) /*2?y?a?D?*/int fd;char buffMAX_BUFFER_SIZE;int nwrite;if(argc 0)printf(“Write %s to FIFOn“, buff);close(fd);exit(0);生产者消费者/*producer-customer.c*/#include #include #include #include #include #include #include #include #define MYFIFO“myfifo“#define BUFFER_SIZE3 /* ?o3?¥?ay */#define UNIT_SIZE5 /* ?¥?a?D? */#define RUN_TIME30 /* ?DD? */#define DELAY_TIME_LEVELS5.0/* ? */void *producer(void *arg);void *customer(void *arg);int fd;time_t end_time;sem_t mutex,full,avail;void *producer(void *arg)int real_write;int delay_time = 0;while(time(NULL) end_time)delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX) / 2.0) + 1;sleep(delay_time);/*P2D?o?availomutex*/sem_wait(sem_wait(printf(“nProducer: delay = %dn“, delay_time);/*2?D?y?Y*/if (real_write = write(fd, “hello“, UNIT
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号