免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: askQLiang
打印 上一主题 下一主题

[C] 看linux的源代码对提高C语言编程能力有帮助吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-03 16:29 |只看该作者
先读读ChinaUnix里的c/c++版块的精华帖子再说

论坛徽章:
0
12 [报告]
发表于 2007-03-03 16:48 |只看该作者
==

操作系统内核的源代码不适合作为 C 语言的启蒙参考。还是踏踏实实跟着书学吧。

==

论坛徽章:
0
13 [报告]
发表于 2007-03-03 17:25 |只看该作者
先学好C,再学好数据结构,再在linux上学编程(这期间努力学习操作系统)!一般是这个顺序吧!!
说得不好 大虾尽管拍转

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2007-03-03 17:44 |只看该作者
现在愿意踏踏实实看书的越来越少了, 都想一步登天(或觉着自己可以一步登天).

[ 本帖最后由 MMMIX 于 2007-3-3 17:46 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2007-03-03 18:16 |只看该作者
原帖由 cjaizss 于 2007-3-3 14:45 发表

做嵌入式,要懂得硬件工作的原理。其实很多东西还是要自己摸索吧,我并不是学计算机也不是学电子的,但是我现在做的是ee。
如果真要推荐几本书,我推荐UNIX环境高级编程,计算机原理,操作系统原理,至少了。



我以前是学电子信息工程的,目前在学软件工程
上学期和以后的软件工程的课程中没有C语言的课程,上学期有Java,C++,VB.Net.我觉得学得都不行,考试通过,不代表学得好.我想做嵌入式,学C,练C语言的编程能力.看了本21天学通C语言,感觉基础的语法已经知道了.要看些实用的C语言的例子,但在网上和图书馆都找不到有详细文档说明的实用的C语言的例子.看Eric.s.Raymond的how
to become a hacker说Linux是一群Hacker写的有详细文档说明的C语言软件.就想从中提高自己的C语言编程能力.各位大大,给出出点子,好少做点无用功.谢谢!!!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
16 [报告]
发表于 2007-03-03 18:27 |只看该作者
C语言只是个编程工具,仅此而已。
我们之所以选用它,是因为它方便,它可以达到我们的很多目的。
其实pascal一样可以达到C语言这样的控制能力。
语言都无所谓。
关键,你对UNIX的认识如何呢?对操作系统的原理认识如何呢?想做嵌入式,恩,那我考你一考,一个简单的往地址写,硬件上的协议是如何完成这一动作的呢?

论坛徽章:
0
17 [报告]
发表于 2007-03-03 19:09 |只看该作者

回复 18楼 cjaizss 的帖子

--

呵呵,的确,一个 CPU 指令都要涉及或复杂或简单的算法。

择一吉日,购书,平心静气深入研究。这样十年后,你应该小有成就了。

那篇 HOWTO 上给出的第一条就是:Learn how to program.

But be aware that you won't reach the skill level of a hacker or even merely a programmer if you only know one or two languages — you need to learn how to think about programming problems in a general way, independent of any one language. To be a real hacker, you need to get to the point where you can learn a new language in days by relating what's in the manual to what you already know. This means you should learn several very different languages.

论坛徽章:
0
18 [报告]
发表于 2007-03-03 19:11 |只看该作者
原帖由 cjaizss 于 2007-3-3 18:27 发表
C语言只是个编程工具,仅此而已。
我们之所以选用它,是因为它方便,它可以达到我们的很多目的。
其实pascal一样可以达到C语言这样的控制能力。
语言都无所谓。
关键,你对UNIX的认识如何呢?对操作系统的原理 ...

(摘录)

寻址空间是按照处理器的地址线个数定的,因为8086的地址线只有20根,因此它的寻址能力只有2^20字节 = 1MB。i386结构的处理器都是可以按照字节编址,每个内存单元的地址,不称为物理地址而是线性地址,线性地址通过CPU内存管理单元(MMU)来进行转换,因为在8086上只有段管理机制,因此此时线性地址等价于物理地址。
到32处理器,cpu地址线拥有32根,寻址能力达到4GB,而P4处理器的地址线则拥有35根,可以寻址更大的空间。但是实际内存达不到CPU的寻址空间大小,此时CPU的MMU就需要对线性地址进行向物理地址的转化,此时线性地址就和物理地址不一样了。
决定一个内存单元的物理地址时需要根据当前的内存管理方式进行计算,首先根据虚拟地址计算得到线性地址,然后根据分页机制是否打开,如果没有使用分页机制,线性地址就是物理地址,如果打开分页机制则根据页目录和页表项来计算得物理地址。
按照x86 32位处理器,虚拟地址就是程序中所使用的逻辑地址,虚拟地址计算如下:
首先通过查段选择子寄存器(16位模式下成为段基址寄存器,比如读取数据用DS寄存器)中选择子的第2位,0则从全局描述符表(GDT, Global Descriptor Table)1则从局部描述符表(LDT Local Descriptor Table)。全局描述符从GDTR寄存器找到描述符表的物理基地址(后称简称为GDTBA,GDT Base Address),然后GDTBA + DS & 0xFFF8得到的地址就是该选择子指向的描述符,然后根据描述符中记录的段基址 + 偏移(可以是指令中的地址码,也可是si,di中的数值)就得到了线性地址(Linear Address),而局部则有些不同,因为LDTR中放的不是局部描述符表的物理基地址,而是在全局描述符表的一个描述符选择子。首先会计算LDT的物理基地址,方法同上,然后再计算描述符地址,最后计算成Linear Address.如果没打开分页,这个就可以是物理地址了。如果打开分页机制,还要做Linear Address 到物理地址的转化(Physical Address)。
线性地址是32位,高十位是页目录项索引,中间十位是页表项索引,最后12位是页内偏移,当然这是在选用4KB小页的情况,大页是4MB,则后 22位都是页内偏移。页目录物理基地址存放在CR3中,共有1024项,因此用线性地址高10位作索引,找到相应的页目录项。在小页模式中,该项保存的是页表的高20位地址,因为页表只有4KB,所以低12位不需要。通过线性地址中间十位作页表项索引和页表基址进行计算得到页表项,该项中保存的物理页面的基址,基址加上线性地址低12位页内偏移,就得到了物理地址。在大页模式中,就省去了查页表这一步骤。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015亚冠之广州恒大
日期:2015-07-22 17:20:15
19 [报告]
发表于 2007-03-03 19:20 |只看该作者
4楼的兄弟很有道理

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
20 [报告]
发表于 2007-03-03 23:37 |只看该作者
原帖由 askQLiang 于 2007-3-3 19:11 发表

(摘录)

寻址空间是按照处理器的地址线个数定的,因为8086的地址线只有20根,因此它的寻址能力只有2^20字节 = 1MB。i386结构的处理器都是可以按照字节编址,每个内存单元的地址,不称为物理地址而是线性地址 ...

描述的还行,但是我要你回答的是结合硬件协议,如何对一个地址进行写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP