1、(5)内核需要支持中断,抢占和多核,盂要时刻注意同步和并发;(6)使用浮点数很容易出现异常,应尽最少用或者不用;(7)程序在不同的地址空间执行。此题为开放题,其它答案合理亦可。3.简述屮断级联与屮断共享有何异同?并画出硬件连接示意图。相同点:都是在同一个中断控制器的引脚上接多个设备。不同点:中断级联是在中断控制器的引脚上再接一个中断控制器,设备具有不同的中断 号;中断共享则是中断控制器的引脚上直接并联多个设备,设备具有相同的中断号。0:设备4.写一个宏SWAP(x, y),实现交换所有基本数据类型的值;写一个宏计算数组元素的个数。(1)#define SWAP(x, y) do typeof(
2、x) t = x;x = y; y = x; while (0)或者#define SWAP(x, y) do x A= y;y A=x; while (0)(2)#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a0)5.volatile关键字的作用。(1)修饰语句块时,防止指令顺序被改变;(2)修饰变屋吋,防止读写指令被优化。6.全局变量:static const int a;static int b;static const int c = 5;(1)int main ()printffb = %dn, b);rctum 0;执行结果是什么,为什么?(2
3、) void fund (void)int p = (int *) &a:*p = 8;b = 1 ;printf(ua = %d b = %dn, a, b);void func2 (void)static const int d;int *p = (int *) &d;funcl(), func2()执行的结果是什么?(1)b = 0。b被分配到bss段。(2)fund ()编译出错;func2 () : d = 67.用C语言实现将地址为()xB8100()01的32位寄存器置为0x12345678。 答案:32位寄存器的地址都以4字节对齐,不会出现地址0xB8100001 o&写一个讦
4、语旬判断一个32位整数能否表示为2的某次方(不能用循环)。int a = 8;if (a& (I )=()yes;elseno;9.在32位系统中,struct Achar a;int b;short c;char d;void *e;#pragma pack(l)struct B#pragma pack()#pragma pack(4)struct C:#pnigma pack()请sizeof(struct A), sizeof(struct B),sizeof(struct C)的值。sizeof(struct A) = 16sizeof(struct B) = 12sizeof(str
5、uct C) = 1610.SPI总线有CLK, MOST, MISO, CS四根线。在SLAVE已经片选上的情况下,假设读SLAVE ID需要向SLAVE发送一个字节的命令,SLAVE ID为四个字节。请问读SLAVE ID MOS I, MISO分别传输了多少字节的数据。都是511.请简述 u-boot 从 Nand Flash, Nor Flash 和 SPI Flash 启动的流程。Nand:上电,CPU通过SoC上固化的程序,将u-boot前4K或者8K加载到SRAM中,并 跳转到SRAM中执行。初始化内存,Nand等设备Z后,将整个u-boot加载到内存后,并 跳转到u-boot加
6、载地址处执行。Nor Flash: CPU将Nor Flash映射到地址空间上,CPU跳到Nor Elash映射到的某一地 址处执行,初始化内存等设备之示,将整个u-boot加载到内存示,并跳转到u-boot加 载地址处执行。SPI: CPU通过SoC上固化的程序,将一小段特定大小的程序加载到SRAMp,并跳转到 SRAM中执行。初始化内存,SPT等设备Z后,将整个u-boot加载到内存后,并跳转到 u-boot加载地址处执行。12.MIPS架构上,memory分为四块,各是什么?有何区别?kuseg: 0x000 0000 - 0x7FFF FFFF (低端2G):这些地址是用户态可用的地址
7、。在 有MMU的机器里,这些地址将一概被MMU作转换。除非MMI;的设置被建立好,这2G地 址是不可用的。对于没有MMU的机器,存取这2G地址的操作与具体机器相关。CPU具 体厂商提供的手册将会提供关于这方面的信息。kscgO: 0x8000 0000 - 0x9FFF FFFF(512M):这些地址映射到物理地址简单的通过 把最高位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - OxlFFF FFFF)。 儿乎全部的对这段地址的存取都会通过快速缓存(cache) o因此在cache设置好之前, 不能随便使用这段地址。ksegl: 0xA000 0000 - OxBFF
8、F FFFF(512M):这些地址通过把最高3位清零的方法 來映射到相应的物理地址上,与kscgO映射的物理地址一样。但ksegl是非cache存 取的。ksegl是唯一的在系统重启吋能正常工作的地址空间。kseg2: 0xC000 0000 - OxFFFF FFFF (1G):这段地址空间只能在核心态下使用并 且要经过MMU的转换。在MMI设进好之前,不能存取这段区域。13.MIPS架构上,如果从Not Flash启动,默认的启动物理地址是多少?可否设置其它地址 作为启动地址?如果能请简要设置方法,如果不能请说明原因。OxBFCOOOOO,可否设置启动地址需要看具体芯片是否提供修改启动地址
9、的功能。如果芯 片有修改启动地址的功能,在启动前,通过修改硬件,改变上电后跳线的电压來改变启 动地址。14.在 linux kernel 中,init/_exit, devinit/_devexit 的作用是什么?两组有何 区别?编译时,把他们修饰的函数放到各口的口定义段中。_init/_ exit的函数被执行过Z后会被释放。而_devinit/_devexit函数被执行过 之后不会被释放。15.请完成函数get_key,根据NODE成员list的地址,返回NODE成员key的值。比 如下面的例了运行后会打卬“100”。(提示:请注意构成链表的方式)struct list_headstruct
10、 list_head *next, *prev;typedef struct int key;struct list_head list; NODE;#define container(ptrz type, member) (type *) (char *)ptr - (char *) (&( (type *)0)-member)int get_key(struct list_head *plist)NODE *node;node = container_of (plist, NODE, list);return node-key;int main()NODE node = .key = 10
11、0z . list = &node丄ist, &node丄ist;printf(吒dn, get_key(&node.list);return 0;)16.用C语言实现set_reg_bits(j和set_reg_bit (),参数自定。set reg bits 功能:将地址为 addr 的 register 的 bit m 到 bitn(m=n)设置为 value (0 = value 2n+1);set_reg_bit 功能:将地址为 addr 的 register 的 bit m 设置为 value (value: 0, 1)。static void inline set reg bit
12、s(u32 reg, int from, int to, ul6 bit_val)ul6 val;val = readw(void *)reg);val &= (1 (to 一 from + 1) - 1) from);val |= bit val from;writew(val, (void *)reg);#define set_reg_bit(reg, bit, val) set_reg_bits(reg, bit, bit, val)17.GCC编译器在编译时都有哪几个过程。预编译,编译,汇编,链接。18.描述LINUX小字符设备驱动的基本编成框架。并编写一个编译它的Makefile,说
13、明其小 的参数。要点、:module_init,module_exit,字符设备注册,file_operation, open(),read(),write(),ioctl(),release()oMakefile:KERNEL PATH = /xxx/xxxPWD = $ (shell pwd)all:make -C $( KERNEL_PATH) -M $(PWD) modulesclean:make - C $( KERNEL_PATH) -M $(PWD) clean19.在boot loader中,冇时需要跳到指定的地址上执行。请用C语言实现跳到地址 0x80000000 处执行。(void (*) (void) 0x800()0()00)();typedef void (*func_t) (void);fun
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1