操作系统--错题集

1、操作系统采用缓冲技术,通过减少对CPU的()次数,提高资源的利用率
中断

引入缓冲的主要原因包括:

  • 缓和CPU与I/O设备间速度不匹配的矛盾;
  • 减少对CPU的中断频率,放宽对中断时间的限制;
  • 提高CPU和I/O设备之间的并行性。

所以采用缓冲技术,可减少对CPU的中断次数,从而提高系统效率。

2、ls会引起哪些系统调用

execve、open、read…

使用strace ls命令我们可以查看ls命令使用到的系统调用

jw@pc:~/w$ strace ls .
execve("/bin/ls", ["ls", "."], 0x7ffd4c677808 /* 63 vars */) = 0
brk(NULL)                               = 0x55e5088c7000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=74466, ...}) = 0
mmap(NULL, 74466, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc619ef9000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=154832, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef7000
mmap(NULL, 2259152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619abd000
mprotect(0x7fc619ae2000, 2093056, PROT_NONE) = 0
mmap(0x7fc619ce1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7fc619ce1000
mmap(0x7fc619ce3000, 6352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ce3000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc6196cc000
mprotect(0x7fc6198b3000, 2097152, PROT_NONE) = 0
mmap(0x7fc619ab3000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7fc619ab3000
mmap(0x7fc619ab9000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619ab9000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=464824, ...}) = 0
mmap(NULL, 2560264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc61945a000
mprotect(0x7fc6194ca000, 2097152, PROT_NONE) = 0
mmap(0x7fc6196ca000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7fc6196ca000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\16\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14560, ...}) = 0
mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619256000
mprotect(0x7fc619259000, 2093056, PROT_NONE) = 0
mmap(0x7fc619458000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fc619458000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=144976, ...}) = 0
mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc619037000
mprotect(0x7fc619051000, 2093056, PROT_NONE) = 0
mmap(0x7fc619250000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7fc619250000
mmap(0x7fc619252000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc619252000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc619ef5000
arch_prctl(ARCH_SET_FS, 0x7fc619ef6040) = 0
mprotect(0x7fc619ab3000, 16384, PROT_READ) = 0
mprotect(0x7fc619250000, 4096, PROT_READ) = 0
mprotect(0x7fc619458000, 4096, PROT_READ) = 0
mprotect(0x7fc6196ca000, 4096, PROT_READ) = 0
mprotect(0x7fc619ce1000, 4096, PROT_READ) = 0
mprotect(0x55e50876c000, 8192, PROT_READ) = 0
mprotect(0x7fc619f0c000, 4096, PROT_READ) = 0
munmap(0x7fc619ef9000, 74466)           = 0
set_tid_address(0x7fc619ef6310)         = 8782
set_robust_list(0x7fc619ef6320, 24)     = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7fc61903ccb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7fc61903cd50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fc619049890}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffe7cb6d170) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffe7cb6d170)      = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0x55e5088c7000
brk(0x55e5088e8000)                     = 0x55e5088e8000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 369
read(3, "", 1024)                       = 0
close(3)                                = 0
access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=10281936, ...}) = 0
mmap(NULL, 10281936, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc618668000
close(3)                                = 0
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=28, ws_col=79, ws_xpixel=0, ws_ypixel=0}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents(3, /* 3 entries */, 32768)     = 80
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
write(1, "ls.txt\n", 7ls.txt
)                 = 7
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++


3、进程是如何运行的?
fork -- exec--...

例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。

fork是一个UNIX术语,当fork一个进程(一个运行中的程序)时,基本上是复制了它,并且fork后的两个进程都从当前执行点继续运行,并且每个进程都有自己的内存副本。

原进程是父进程,新进程是子进程。可以通过fork()返回值区分。

父进程中fork调用返回的是新的子进程的pid(process id),而子进程中fork调用返回的是0

我们都要知道,linux系统的第一个用户进程是init,pid=1,后续的进程,都是从init进程fork出来的。

4、简述嵌入式系统的定义、应用和特点?

答:嵌入式系统定义:以应用为中心,以计算机技术为基础,其软硬件可裁剪配置,对功能、可靠性、成本、体积、功耗有严格约束的一种专用计算机系统。
嵌入式系统应用:应用于军事设备、信息终端、汽车电子、制造工业、航天航空等领域。
嵌入式系统特点:专用性、可裁性、实时性好、可靠性高、功耗低。

5、bootloader经过哪些过程?

BL0----------------------> BL1 -->BL2-------> Linux kernel --> file system --> application
系统启动RomBoot --> SPL --> u-boot --> Linux kernel --> file system --> start application
bootloader的启动过程:
第一阶段:
   ① 设置CPU工作模式svc特权模式
   ② 关闭MMU和cache
   ③ 关看门狗
   ④ 屏蔽中断(防止程序跑飞)
   ⑤ 初始化时钟
   ⑥ 初始化RAM,为第二阶段做准备(非必须,例如对于NOR Flash可以直接在上面执行)
   ⑦ 设置栈,第二阶段是C程序
   ⑧ 拷贝第二阶段到RAM
   ⑨ 跳转到第二阶段的程序入口
第二阶段:
   ① 硬件初始化,时钟、串口、网卡、LED灯…
   ② 检测系统内存映射(memory map)
   ③ 将内核映像和根文件系统映像从Flash上读到RAM空间中。
   ④ 为内核设置启动参数。
   ⑤ 拷贝dtb(设备树)到RAM空间中。
   ⑥ 启动内核
   
Cache和MMU的设置
MMU和Cache必须必须关闭,指令Cache可以打开也可以关闭。
由于MMU在上电之初是没有任何作用的,也就是说U-boo第一阶段的汇编代码以及第二阶段的源代码初始化相关外设时访问的都是都是实际地址,MMU起不到任何作用,为了启动之初不影响对程序的启动常关闭MMU。

Cache是位于RAM和CPU内部寄存器之间的一个存储设施,用来加速二者之间的数据传输速度,即用来加快CPU从内存中取出指令的速度。但是在上电后CPU的初始化要比内存RAM更快一步,当CPU初始化完成后,若内存还没有准备好那势必会造成异常。

7、uboot怎么传参给内核的?

简单的讲,uboot利用函数指针及传参规范,它将
R0: 0x0
R1: 机器号
R2: 参数地址
三个参数传递给内核。
其中,R2寄存器传递的是一个指针,这个指针指向一个TAG区域。

8、如果系统的umask设置为244,创建一个新文件后,它的权限:()

–w-r–r--
-r-xr–r--
-r—w–w-
-r-x-wx-wx
umask是从权限中“拿走”相应的位,且文件创建时不能赋予执行权限.
创建时,文件 默认666,目录默认777,减去umask的位就是结果。
666-244=422(-r—w–w-)

9、下列选项中,会导致用户进程从用户态切换到内核的操作是?

I. 整数除以零
II. sin( )函数调用
III. read系统调用

用户态切换到内核态的 3 种方式
a. 系统调用
b. 异常
c. 外围设备的中断

所以答案是:
I. 异常
III. 系统调用

10、C语言中, 32768 是不正确的 int 类型常数。请问这句话的说法是正确的吗?

错误

考察C语言中int类型的常数的范围。

  • ①int的取值范围依赖于计算机系统:

在16位机器中,int占16位,是两个字节,取值范围为前面所说的-32768~32767(-216~216-1)。此时题中表述是正确的。
在32位和64位机器中,int占32位,即4个字节长度,取值范围为-2147483648~2147483647(-232~232-1)。此时题中表述是错误的。

  • ②int的取值范围也和语言标准有关:

ISO/ANSI C规定,int类型的最小范围为-32768到32767。因此int类型常数的范围不限于-32768到32767,可以得到题中表述是错误的。
C++官网中给出的C99标准中的宏定义,int类型的范围为-32767到32767。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值